7 # Some OS groups should default to use the portable packages
8 if [ "$__BuildOS" == "OSX" ]; then
12 if [ "$__HostOS" == "Linux" ]; then
13 if [ -e /etc/redhat-release ]; then
14 local redhatRelease=$(</etc/redhat-release)
15 if [[ $redhatRelease == "CentOS release 6."* || $redhatRelease == "Red Hat Enterprise Linux Server release 6."* ]]; then
16 __HostDistroRid="rhel.6-$__HostArch"
20 elif [ -e /etc/os-release ]; then
21 source /etc/os-release
22 if [[ $ID == "alpine" ]]; then
23 __HostDistroRid="linux-musl-$__HostArch"
26 __HostDistroRid="$ID.$VERSION_ID-$__HostArch"
29 elif [ "$__HostOS" == "FreeBSD" ]; then
30 __freebsd_version=`sysctl -n kern.osrelease | cut -f1 -d'.'`
31 __HostDistroRid="freebsd.$__freebsd_version-$__HostArch"
34 # Portable builds target the base RID
35 if [ "$__PortableBuild" == 1 ]; then
36 if [ "$__BuildOS" == "OSX" ]; then
37 export __HostDistroRid="osx-$__BuildArch"
38 elif [ "$__BuildOS" == "Linux" ]; then
39 export __HostDistroRid="linux-$__BuildArch"
43 if [ "$__HostDistroRid" == "" ]; then
44 echo "WARNING: Cannot determine runtime id for current distro."
47 echo "Setting __HostDistroRid to $__HostDistroRid"
52 if [ $__CrossBuild == 1 ]; then
53 if [ "$__BuildOS" == "Linux" ]; then
54 if [ ! -e $ROOTFS_DIR/etc/os-release ]; then
55 if [ -e $ROOTFS_DIR/android_platform ]; then
56 source $ROOTFS_DIR/android_platform
57 export __DistroRid="$RID"
59 echo "WARNING: Cannot determine runtime id for current distro."
63 source $ROOTFS_DIR/etc/os-release
64 export __DistroRid="$ID.$VERSION_ID-$__BuildArch"
68 export __DistroRid="$__HostDistroRid"
71 if [ "$ID.$VERSION_ID" == "ubuntu.16.04" ]; then
72 export __DistroRid="ubuntu.14.04-$__BuildArch"
75 # Portable builds target the base RID
76 if [ "$__PortableBuild" == 1 ]; then
77 if [ "$__BuildOS" == "Linux" ]; then
78 export __DistroRid="linux-$__BuildArch"
79 export __RuntimeId="linux-$__BuildArch"
80 elif [ "$__BuildOS" == "OSX" ]; then
81 export __DistroRid="osx-$__BuildArch"
82 export __RuntimeId="osx-$__BuildArch"
86 echo "__DistroRid: " $__DistroRid
89 isMSBuildOnNETCoreSupported()
91 __isMSBuildOnNETCoreSupported=$__msbuildonunsupportedplatform
93 if [ $__isMSBuildOnNETCoreSupported == 1 ]; then
97 if [ "$__HostArch" == "x64" ]; then
98 if [ "$__HostOS" == "Linux" ]; then
99 __isMSBuildOnNETCoreSupported=1
100 UNSUPPORTED_RIDS=("debian.9-x64" "ubuntu.17.04-x64")
101 for UNSUPPORTED_RID in "${UNSUPPORTED_RIDS[@]}"
103 if [ "$__HostDistroRid" == "$UNSUPPORTED_RID" ]; then
104 __isMSBuildOnNETCoreSupported=0
108 elif [ "$__HostOS" == "OSX" ]; then
109 __isMSBuildOnNETCoreSupported=1
116 __TestDir=$__ProjectDir/tests
117 __ProjectFilesDir=$__TestDir
118 __TestBinDir=$__TestWorkingDir
120 if [ $__RebuildTests -ne 0 ]; then
121 if [ -d "${__TestBinDir}" ]; then
122 echo "Removing tests build dir: ${__TestBinDir}"
127 __CMakeBinDir="${__TestBinDir}"
129 if [ -z "$__TestIntermediateDir" ]; then
130 __TestIntermediateDir="tests/obj/${__BuildOS}.${__BuildArch}.${__BuildType}"
133 echo "__BuildOS: ${__BuildOS}"
134 echo "__BuildArch: ${__BuildArch}"
135 echo "__BuildType: ${__BuildType}"
136 echo "__TestIntermediateDir: ${__TestIntermediateDir}"
138 if [ ! -f "$__TestBinDir" ]; then
139 echo "Creating TestBinDir: ${__TestBinDir}"
140 mkdir -p $__TestBinDir
142 if [ ! -f "$__LogsDir" ]; then
143 echo "Creating LogsDir: ${__LogsDir}"
147 __BuildProperties="-p:OSGroup=${__BuildOS} -p:BuildOS=${__BuildOS} -p:BuildArch=${__BuildArch} -p:BuildType=${__BuildType}"
149 # =========================================================================================
151 # === Restore product binaries from packages
153 # =========================================================================================
155 build_Tests_internal "Restore_Packages" "${__ProjectDir}/tests/build.proj" " -BatchRestorePackages" "Restore product binaries (build tests)"
157 if [ -n "$__UpdateInvalidPackagesArg" ]; then
158 __up=-updateinvalidpackageversion
161 echo "${__MsgPrefix}Creating test overlay..."
163 if [ -z "$xUnitTestBinBase" ]; then
164 xUnitTestBinBase=$__TestWorkingDir
167 export CORE_ROOT=$xUnitTestBinBase/Tests/Core_Root
169 if [ -d "${CORE_ROOT}" ]; then
175 build_Tests_internal "Tests_Overlay_Managed" "${__ProjectDir}/tests/runtest.proj" "-testOverlay" "Creating test overlay"
177 chmod +x $__BinDir/corerun
178 chmod +x $__BinDir/crossgen
180 # Make sure to copy over the pulled down packages
181 cp -r $__BinDir/* $CORE_ROOT/ > /dev/null
183 # Work hardcoded path around
184 if [ ! -f "${__BuildToolsDir}/Microsoft.CSharp.Core.Targets" ]; then
185 ln -s "${__BuildToolsDir}/Microsoft.CSharp.Core.targets" "${__BuildToolsDir}/Microsoft.CSharp.Core.Targets"
187 if [ ! -f "${__BuildToolsDir}/Microsoft.CSharp.targets" ]; then
188 ln -s "${__BuildToolsDir}/Microsoft.CSharp.Targets" "${__BuildToolsDir}/Microsoft.CSharp.targets"
194 __TestDir=$__ProjectDir/tests
195 __ProjectFilesDir=$__TestDir
196 __TestBinDir=$__TestWorkingDir
198 if [ $__RebuildTests -ne 0 ]; then
199 if [ -d "${__TestBinDir}" ]; then
200 echo "Removing tests build dir: ${__TestBinDir}"
205 __CMakeBinDir="${__TestBinDir}"
207 if [ -z "$__TestIntermediateDir" ]; then
208 __TestIntermediateDir="tests/obj/${__BuildOS}.${__BuildArch}.${__BuildType}"
211 echo "__BuildOS: ${__BuildOS}"
212 echo "__BuildArch: ${__BuildArch}"
213 echo "__BuildType: ${__BuildType}"
214 echo "__TestIntermediateDir: ${__TestIntermediateDir}"
216 if [ ! -f "$__TestBinDir" ]; then
217 echo "Creating TestBinDir: ${__TestBinDir}"
218 mkdir -p $__TestBinDir
220 if [ ! -f "$__LogsDir" ]; then
221 echo "Creating LogsDir: ${__LogsDir}"
225 __BuildProperties="-p:OSGroup=${__BuildOS} -p:BuildOS=${__BuildOS} -p:BuildArch=${__BuildArch} -p:BuildType=${__BuildType}"
227 # =========================================================================================
229 # === Restore product binaries from packages
231 # =========================================================================================
233 build_Tests_internal "Restore_Product" "${__ProjectDir}/tests/build.proj" " -BatchRestorePackages" "Restore product binaries (build tests)"
235 if [ -n "$__BuildAgainstPackagesArg" ]; then
236 build_Tests_internal "Tests_GenerateRuntimeLayout" "${__ProjectDir}/tests/runtest.proj" "-BinPlaceRef -BinPlaceProduct -CopyCrossgenToProduct" "Restore product binaries (run tests)"
239 echo "Starting the Managed Tests Build..."
241 build_Tests_internal "Tests_Managed" "$__ProjectDir/tests/build.proj" "$__up" "Managed tests build (build tests)"
243 if [ $? -ne 0 ]; then
244 echo "${__MsgPrefix}Error: build failed. Refer to the build log files for details (above)"
247 echo "Managed tests build success!"
250 if [ $__BuildTestWrappers -ne -0 ]; then
251 echo "${__MsgPrefix}Creating test wrappers..."
253 __XUnitWrapperBuiltMarker=${__TestBinDir}/xunit_wrapper_build
255 if [ ! -f $__XUnitWrapperBuiltMarker ]; then
257 build_Tests_internal "Tests_XunitWrapper" "$__ProjectDir/tests/runtest.proj" "-BuildWrappers -MsBuildEventLogging=\" \" " "Test Xunit Wrapper"
259 if [ $? -ne 0 ]; then
260 echo "${__MsgPrefix}Error: build failed. Refer to the build log files for details (above)"
263 echo "XUnit Wrappers have been built."
264 echo "Create marker \"${__XUnitWrapperBuiltMarker}\""
265 touch $__XUnitWrapperBuiltMarker
268 echo "XUnit Wrappers had been built before."
272 if [ -n "$__UpdateInvalidPackagesArg" ]; then
273 __up=-updateinvalidpackageversion
276 echo "${__MsgPrefix}Creating test overlay..."
280 if [ $__ZipTests -ne 0 ]; then
281 echo "${__MsgPrefix}ZIP tests packages..."
282 build_Tests_internal "Helix_Prep" "$__ProjectDir/tests/helixprep.proj" " " "Prep test binaries for Helix publishing"
286 build_Tests_internal()
290 extraBuildParameters=$3
293 # Set up directories and file names
294 __BuildLogRootName=$subDirectoryName
295 __BuildLog="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.log"
296 __BuildWrn="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.wrn"
297 __BuildErr="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.err"
299 if [[ "$subDirectoryName" == "Tests_Managed" ]]; then
300 # Execute msbuild managed test build in stages - workaround for excessive data retention in MSBuild ConfigCache
301 # See https://github.com/Microsoft/msbuild/issues/2993
303 # __SkipPackageRestore and __SkipTargetingPackBuild used to control build by tests/src/dirs.proj
304 export __SkipPackageRestore=false
305 export __SkipTargetingPackBuild=false
306 export __BuildLoopCount=2
307 export __TestGroupToBuild=1
310 if [ -n __priority1 ]; then
311 export __BuildLoopCount=16
312 export __TestGroupToBuild=2
315 for (( slice=1 ; slice <= __BuildLoopCount; slice = slice + 1 ))
317 __msbuildLog="\"/flp:Verbosity=normal;LogFile=${__BuildLog};Append=${__AppendToLog}\""
318 __msbuildWrn="\"/flp1:WarningsOnly;LogFile=${__BuildWrn};Append=${__AppendToLog}\""
319 __msbuildErr="\"/flp2:ErrorsOnly;LogFile=${__BuildErr};Append=${__AppendToLog}\""
321 export TestBuildSlice=$slice
323 # Generate build command
324 buildCommand="$__ProjectRoot/run.sh build -Project=$projectName -MsBuildLog=${__msbuildLog} -MsBuildWrn=${__msbuildWrn} -MsBuildErr=${__msbuildErr} -MsBuildEventLogging=\"/l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log\" $extraBuildParameters $__RunArgs $__UnprocessedBuildArgs"
326 echo "Building step '$stepName' slice=$slice via $buildCommand"
331 # Make sure everything is OK
332 if [ $? -ne 0 ]; then
333 echo "${__MsgPrefix}Failed to build $stepName. See the build logs:"
339 export __SkipPackageRestore=true
340 export __SkipTargetingPackBuild=true
344 __msbuildLog="\"/flp:Verbosity=normal;LogFile=${__BuildLog}\""
345 __msbuildWrn="\"/flp1:WarningsOnly;LogFile=${__BuildWrn}\""
346 __msbuildErr="\"/flp2:ErrorsOnly;LogFile=${__BuildErr}\""
348 # Generate build command
349 buildCommand="$__ProjectRoot/run.sh build -Project=$projectName -MsBuildLog=${__msbuildLog} -MsBuildWrn=${__msbuildWrn} -MsBuildErr=${__msbuildErr} -MsBuildEventLogging=\"/l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log\" $extraBuildParameters $__RunArgs $__UnprocessedBuildArgs"
351 echo "Building step '$stepName' via $buildCommand"
357 # $__ProjectRoot/run.sh build -Project=$projectName -MsBuildLog="$__msbuildLog" -MsBuildWrn="$__msbuildWrn" -MsBuildErr="$__msbuildErr" $extraBuildParameters $__RunArgs $__UnprocessedBuildArgs
359 # Make sure everything is OK
360 if [ $? -ne 0 ]; then
361 echo "${__MsgPrefix}Failed to build $stepName. See the build logs:"
372 echo "Usage: $0 [BuildArch] [BuildType] [verbose] [coverage] [cross] [clangx.y] [ninja] [runtests] [bindir]"
373 echo "BuildArch can be: x64, x86, arm, armel, arm64"
374 echo "BuildType can be: debug, checked, release"
375 echo "coverage - optional argument to enable code coverage build (currently supported only for Linux and OSX)."
376 echo "ninja - target ninja instead of GNU make"
377 echo "clangx.y - optional argument to build using clang version x.y - supported version 3.5 - 6.0"
378 echo "cross - optional argument to signify cross compilation,"
379 echo " - will use ROOTFS_DIR environment variable if set."
380 echo "crosscomponent - optional argument to build cross-architecture component,"
381 echo " - will use CAC_ROOTFS_DIR environment variable if set."
382 echo "portableLinux - build for Portable Linux Distribution"
383 echo "portablebuild - Use portable build."
384 echo "verbose - optional argument to enable verbose build output."
385 echo "rebuild - if tests have already been built - rebuild them"
386 echo "generatelayoutonly - only pull down dependencies and build coreroot"
387 echo "buildagainstpackages - pull down and build using packages."
388 echo "runtests - run tests after building them"
389 echo "ziptests - zips CoreCLR tests & Core_Root for a Helix run"
390 echo "bindir - output directory (defaults to $__ProjectRoot/bin)"
391 echo "msbuildonunsupportedplatform - build managed binaries even if distro is not officially supported."
392 echo "priority1 - include priority=1 tests in the build"
397 # Obtain the location of the bash script to figure out where the root of the repo is.
398 __ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
400 # $__ProjectRoot/build.sh $1 $2
402 # Use uname to determine what the CPU is.
405 # Some Linux platforms report unknown for platform, but the arch for machine.
406 if [ "$CPUName" == "unknown" ]; then
412 echo "Unsupported CPU $CPUName detected, build might not succeed!"
423 echo "Unsupported CPU $CPUName detected, build might not succeed!"
434 echo "Unknown CPU $CPUName detected, configuring as if for x64"
440 # Use uname to determine what the OS is.
474 echo "Unsupported OS $OSName detected, configuring as if for Linux"
482 __IncludeTests=INCLUDE_TESTS
484 # Set the various build properties here so that CMake and MSBuild can pick them up
485 export __ProjectDir="$__ProjectRoot"
486 __SourceDir="$__ProjectDir/src"
487 __PackagesDir="$__ProjectDir/packages"
488 __RootBinDir="$__ProjectDir/bin"
489 __BuildToolsDir="$__ProjectDir/Tools"
490 __UnprocessedBuildArgs=
497 __ClangMajorVersion=0
498 __ClangMinorVersion=0
499 __NuGetPath="$__PackagesDir/NuGet.exe"
501 __BuildAgainstPackagesArg=
505 __msbuildonunsupportedplatform=0
507 __NativeTestIntermediatesDir=
510 __BuildTestWrappers=0
511 __GenerateLayoutOnly=
516 if [ $# -le 0 ]; then
520 lowerI="$(echo $1 | awk '{print tolower($0)}')"
560 __CodeCoverage=Coverage
572 if [ "$__BuildOS" == "Linux" ]; then
575 echo "ERROR: portableLinux not supported for non-Linux platforms."
585 __ClangMajorVersion=3
586 __ClangMinorVersion=5
590 __ClangMajorVersion=3
591 __ClangMinorVersion=6
595 __ClangMajorVersion=3
596 __ClangMinorVersion=7
600 __ClangMajorVersion=3
601 __ClangMinorVersion=8
605 __ClangMajorVersion=3
606 __ClangMinorVersion=9
610 __ClangMajorVersion=4
611 __ClangMinorVersion=0
615 __ClangMajorVersion=5
616 __ClangMinorVersion=0
620 __ClangMajorVersion=6
621 __ClangMinorVersion=0
641 __GenerateLayoutOnly=1
644 buildagainstpackages)
645 __BuildAgainstPackagesArg=1
651 if [ ! -d $__RootBinDir ]; then
654 __RootBinParent=$(dirname $__RootBinDir)
655 __RootBinName=${__RootBinDir##*/}
656 __RootBinDir="$(cd $__RootBinParent &>/dev/null && printf %s/%s $PWD $__RootBinName)"
659 echo "ERROR: 'bindir' requires a non-empty option argument"
664 msbuildonunsupportedplatform)
665 __msbuildonunsupportedplatform=1
669 __UnprocessedBuildArgs="$__UnprocessedBuildArgs -priority=1"
672 __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
680 __RunArgs="-BuildArch=$__BuildArch -BuildType=$__BuildType -BuildOS=$__BuildOS"
682 # Configure environment if we are doing a verbose build
683 if [ $__VerboseBuild == 1 ]; then
685 __RunArgs="$__RunArgs -verbose"
688 # Set default clang version
689 if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then
690 if [ $__CrossBuild == 1 ]; then
691 __ClangMajorVersion=3
692 __ClangMinorVersion=6
694 __ClangMajorVersion=3
695 __ClangMinorVersion=5
700 # Set dependent variables
701 __LogsDir="$__RootBinDir/Logs"
703 # init the host distro name
706 # Set the remaining variables based upon the determined build configuration
707 __BinDir="$__RootBinDir/Product/$__BuildOS.$__BuildArch.$__BuildType"
708 __PackagesBinDir="$__BinDir/.nuget"
709 __ToolsDir="$__RootBinDir/tools"
710 __TestDir="$__ProjectDir/tests"
711 __TestWorkingDir="$__RootBinDir/tests/$__BuildOS.$__BuildArch.$__BuildType"
712 __IntermediatesDir="$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType"
713 __TestIntermediatesDir="$__RootBinDir/tests/obj/$__BuildOS.$__BuildArch.$__BuildType"
714 __isMSBuildOnNETCoreSupported=0
715 __CrossComponentBinDir="$__BinDir"
716 __CrossCompIntermediatesDir="$__IntermediatesDir/crossgen"
718 __CrossArch="$__HostArch"
719 if [[ "$__HostArch" == "x64" && "$__BuildArch" == "arm" ]]; then
722 if [ $__CrossBuild == 1 ]; then
723 __CrossComponentBinDir="$__CrossComponentBinDir/$__CrossArch"
725 __CrossgenCoreLibLog="$__LogsDir/CrossgenCoreLib_$__BuildOS.$BuildArch.$__BuildType.log"
726 __CrossgenExe="$__CrossComponentBinDir/crossgen"
728 isMSBuildOnNETCoreSupported
730 # CI_SPECIFIC - On CI machines, $HOME may not be set. In such a case, create a subfolder and set the variable to set.
731 # This is needed by CLI to function.
732 if [ -z "$HOME" ]; then
733 if [ ! -d "$__ProjectDir/temp_home" ]; then
736 export HOME=$__ProjectDir/temp_home
737 echo "HOME not defined; setting it to $HOME"
740 # Specify path to be set for CMAKE_INSTALL_PREFIX.
741 # This is where all built CoreClr libraries will copied to.
742 export __CMakeBinDir="$__BinDir"
744 if [ ! -d "$__BinDir" ] || [ ! -d "$__BinDir/bin" ]; then
746 echo "Cannot find build directory for the CoreCLR Product or native tests."
747 echo "Please make sure CoreCLR and native tests are built before building managed tests."
748 echo "Example use: './build.sh $__BuildArch $__BuildType' without -skiptests switch"
752 # Configure environment if we are doing a cross compile.
753 if [ $__CrossBuild == 1 ]; then
754 export CROSSCOMPILE=1
755 if ! [[ -n "$ROOTFS_DIR" ]]; then
756 export ROOTFS_DIR="$__ProjectRoot/cross/rootfs/$__BuildArch"
760 # init the target distro name
763 # Override tool directory
765 __CoreClrVersion=1.1.0
766 __sharedFxDir=$__BuildToolsDir/dotnetcli/shared/Microsoft.NETCore.App/$__CoreClrVersion/
768 echo "Building Tests..."
770 if [ -z "$__GenerateLayoutOnly" ]; then
776 if [ $? -ne 0 ]; then
777 echo "Failed to build tests"
781 echo "${__MsgPrefix}Test build successful."
782 echo "${__MsgPrefix}Test binaries are available at ${__TestBinDir}"
784 __testNativeBinDir=$__IntermediatesDir/tests
786 if [ $__RunTests -ne 0 ]; then
790 echo "${__TestDir}/runtest.sh --testRootDir=$__TestBinDir --coreClrBinDir=$__BinDir --coreFxBinDir=$__sharedFxDir --testNativeBinDir=$__testNativeBinDir"
792 $__TestDir/runtest.sh --testRootDir=$__TestBinDir --coreClrBinDir=$__BinDir --coreFxBinDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir
794 echo "Tests run successful."
796 echo "To run all tests use 'tests/runtests.sh' where:"
797 echo " testRootDir = $__TestBinDir"
798 echo " coreClrBinDir = $__BinDir"
799 echo " coreFxBinDir = $CORE_ROOT"
800 echo " testNativeBinDir = $__testNativeBinDir"
801 echo " -------------------------------------------------- "
802 echo " Example runtest.sh command"
804 echo " ./tests/runtest.sh --coreOverlayDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir --testRootDir=$__TestBinDir --copyNativeTestBin"
805 echo " -------------------------------------------------- "
806 echo "To run single test use the following command:"
807 echo " bash ${__TestBinDir}/__TEST_PATH__/__TEST_NAME__.sh -coreroot=${CORE_ROOT}"