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" "Restore product binaries (build tests)" "-BatchRestorePackages"
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" "Creating test overlay" "-testOverlay"
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
187 export TEST_HOST=$xUnitTestBinBase/testhost
189 if [ -d "${TEST_HOST}" ]; then
193 echo "${__MsgPrefix}Creating test overlay..."
196 build_Tests_internal "Tests_Generate_TestHost" "${__ProjectDir}/tests/runtest.proj" "Creating test host" "-testHost"
202 __TestDir=$__ProjectDir/tests
203 __ProjectFilesDir=$__TestDir
204 __TestBinDir=$__TestWorkingDir
206 if [ $__RebuildTests -ne 0 ]; then
207 if [ -d "${__TestBinDir}" ]; then
208 echo "Removing tests build dir: ${__TestBinDir}"
213 __CMakeBinDir="${__TestBinDir}"
215 if [ -z "$__TestIntermediateDir" ]; then
216 __TestIntermediateDir="tests/obj/${__BuildOS}.${__BuildArch}.${__BuildType}"
219 echo "__BuildOS: ${__BuildOS}"
220 echo "__BuildArch: ${__BuildArch}"
221 echo "__BuildType: ${__BuildType}"
222 echo "__TestIntermediateDir: ${__TestIntermediateDir}"
224 if [ ! -f "$__TestBinDir" ]; then
225 echo "Creating TestBinDir: ${__TestBinDir}"
226 mkdir -p $__TestBinDir
228 if [ ! -f "$__LogsDir" ]; then
229 echo "Creating LogsDir: ${__LogsDir}"
233 __BuildProperties="-p:OSGroup=${__BuildOS} -p:BuildOS=${__BuildOS} -p:BuildArch=${__BuildArch} -p:BuildType=${__BuildType}"
235 # =========================================================================================
237 # === Restore product binaries from packages
239 # =========================================================================================
241 build_Tests_internal "Restore_Product" "${__ProjectDir}/tests/build.proj" "Restore product binaries (build tests)" "-BatchRestorePackages"
243 if [ -n "$__BuildAgainstPackagesArg" ]; then
244 build_Tests_internal "Tests_GenerateRuntimeLayout" "${__ProjectDir}/tests/runtest.proj" "Restore product binaries (run tests)" "-BinPlaceRef" "-BinPlaceProduct" "-CopyCrossgenToProduct"
247 echo "Starting the Managed Tests Build..."
249 build_Tests_internal "Tests_Managed" "$__ProjectDir/tests/build.proj" "Managed tests build (build tests)" "$__up"
251 if [ $? -ne 0 ]; then
252 echo "${__MsgPrefix}Error: build failed. Refer to the build log files for details (above)"
255 echo "Managed tests build success!"
258 if [ $__BuildTestWrappers -ne -0 ]; then
259 echo "${__MsgPrefix}Creating test wrappers..."
261 __XUnitWrapperBuiltMarker=${__TestBinDir}/xunit_wrapper_build
263 if [ ! -f $__XUnitWrapperBuiltMarker ]; then
265 build_Tests_internal "Tests_XunitWrapper" "$__ProjectDir/tests/runtest.proj" "Test Xunit Wrapper" "-BuildWrappers" "-MsBuildEventLogging= " "-TargetsWindows=false"
267 if [ $? -ne 0 ]; then
268 echo "${__MsgPrefix}Error: build failed. Refer to the build log files for details (above)"
271 echo "XUnit Wrappers have been built."
272 echo "Create marker \"${__XUnitWrapperBuiltMarker}\""
273 touch $__XUnitWrapperBuiltMarker
276 echo "XUnit Wrappers had been built before."
280 if [ -n "$__UpdateInvalidPackagesArg" ]; then
281 __up=-updateinvalidpackageversion
284 echo "${__MsgPrefix}Creating test overlay..."
288 if [ $__ZipTests -ne 0 ]; then
289 echo "${__MsgPrefix}ZIP tests packages..."
290 build_Tests_internal "Helix_Prep" "$__ProjectDir/tests/helixprep.proj" "Prep test binaries for Helix publishing" " "
294 build_Tests_internal()
302 extraBuildParameters=("$@")
304 # Set up directories and file names
305 __BuildLogRootName=$subDirectoryName
306 __BuildLog="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.log"
307 __BuildWrn="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.wrn"
308 __BuildErr="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.err"
310 # Use binclashlogger by default if no other logger is specified
311 if [[ "${extraBuildParameters[*]}" == *"-MsBuildEventLogging"* ]]; then
312 msbuildEventLogging=""
314 msbuildEventLogging="-MsBuildEventLogging=\"/l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log\""
317 if [[ "$subDirectoryName" == "Tests_Managed" ]]; then
318 # Execute msbuild managed test build in stages - workaround for excessive data retention in MSBuild ConfigCache
319 # See https://github.com/Microsoft/msbuild/issues/2993
321 # __SkipPackageRestore and __SkipTargetingPackBuild used to control build by tests/src/dirs.proj
322 export __SkipPackageRestore=false
323 export __SkipTargetingPackBuild=false
324 export __BuildLoopCount=2
325 export __TestGroupToBuild=1
328 if [ -n __priority1 ]; then
329 export __BuildLoopCount=16
330 export __TestGroupToBuild=2
333 for (( slice=1 ; slice <= __BuildLoopCount; slice = slice + 1 ))
335 __msbuildLog="\"/flp:Verbosity=normal;LogFile=${__BuildLog};Append=${__AppendToLog}\""
336 __msbuildWrn="\"/flp1:WarningsOnly;LogFile=${__BuildWrn};Append=${__AppendToLog}\""
337 __msbuildErr="\"/flp2:ErrorsOnly;LogFile=${__BuildErr};Append=${__AppendToLog}\""
339 export TestBuildSlice=$slice
341 # Generate build command
342 buildArgs=("-Project=$projectName" "-MsBuildLog=${__msbuildLog}" "-MsBuildWrn=${__msbuildWrn}" "-MsBuildErr=${__msbuildErr}")
343 buildArgs+=("$msbuildEventLogging")
344 buildArgs+=("${extraBuildParameters[@]}")
345 buildArgs+=("${__RunArgs[@]}")
346 buildArgs+=("${__UnprocessedBuildArgs[@]}")
348 echo "Building step '$stepName' slice=$slice via $buildCommand"
351 "$__ProjectRoot/run.sh" build "${buildArgs[@]}"
353 # Make sure everything is OK
354 if [ $? -ne 0 ]; then
355 echo "${__MsgPrefix}Failed to build $stepName. See the build logs:"
361 export __SkipPackageRestore=true
362 export __SkipTargetingPackBuild=true
366 __msbuildLog="\"/flp:Verbosity=normal;LogFile=${__BuildLog}\""
367 __msbuildWrn="\"/flp1:WarningsOnly;LogFile=${__BuildWrn}\""
368 __msbuildErr="\"/flp2:ErrorsOnly;LogFile=${__BuildErr}\""
370 # Generate build command
371 buildArgs=("-Project=$projectName" "-MsBuildLog=${__msbuildLog}" "-MsBuildWrn=${__msbuildWrn}" "-MsBuildErr=${__msbuildErr}")
372 buildArgs+=("$msbuildEventLogging")
373 buildArgs+=("${extraBuildParameters[@]}")
374 buildArgs+=("${__RunArgs[@]}")
375 buildArgs+=("${__UnprocessedBuildArgs[@]}")
377 echo "Building step '$stepName' via $buildCommand"
380 "$__ProjectRoot/run.sh" build "${buildArgs[@]}"
382 # Make sure everything is OK
383 if [ $? -ne 0 ]; then
384 echo "${__MsgPrefix}Failed to build $stepName. See the build logs:"
395 echo "Usage: $0 [BuildArch] [BuildType] [verbose] [coverage] [cross] [clangx.y] [ninja] [runtests] [bindir]"
396 echo "BuildArch can be: x64, x86, arm, armel, arm64"
397 echo "BuildType can be: debug, checked, release"
398 echo "coverage - optional argument to enable code coverage build (currently supported only for Linux and OSX)."
399 echo "ninja - target ninja instead of GNU make"
400 echo "clangx.y - optional argument to build using clang version x.y - supported version 3.5 - 6.0"
401 echo "cross - optional argument to signify cross compilation,"
402 echo " - will use ROOTFS_DIR environment variable if set."
403 echo "crosscomponent - optional argument to build cross-architecture component,"
404 echo " - will use CAC_ROOTFS_DIR environment variable if set."
405 echo "portableLinux - build for Portable Linux Distribution"
406 echo "portablebuild - Use portable build."
407 echo "verbose - optional argument to enable verbose build output."
408 echo "rebuild - if tests have already been built - rebuild them"
409 echo "generatelayoutonly - only pull down dependencies and build coreroot"
410 echo "generatetesthostonly - only pull down dependencies and build coreroot and the CoreFX testhost"
411 echo "buildagainstpackages - pull down and build using packages."
412 echo "runtests - run tests after building them"
413 echo "ziptests - zips CoreCLR tests & Core_Root for a Helix run"
414 echo "bindir - output directory (defaults to $__ProjectRoot/bin)"
415 echo "msbuildonunsupportedplatform - build managed binaries even if distro is not officially supported."
416 echo "priority1 - include priority=1 tests in the build"
421 # Obtain the location of the bash script to figure out where the root of the repo is.
422 __ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
424 # $__ProjectRoot/build.sh $1 $2
426 # Use uname to determine what the CPU is.
429 # Some Linux platforms report unknown for platform, but the arch for machine.
430 if [ "$CPUName" == "unknown" ]; then
436 echo "Unsupported CPU $CPUName detected, build might not succeed!"
447 echo "Unsupported CPU $CPUName detected, build might not succeed!"
458 echo "Unknown CPU $CPUName detected, configuring as if for x64"
464 # Use uname to determine what the OS is.
498 echo "Unsupported OS $OSName detected, configuring as if for Linux"
506 __IncludeTests=INCLUDE_TESTS
508 # Set the various build properties here so that CMake and MSBuild can pick them up
509 export __ProjectDir="$__ProjectRoot"
510 __SourceDir="$__ProjectDir/src"
511 __PackagesDir="$__ProjectDir/packages"
512 __RootBinDir="$__ProjectDir/bin"
513 __BuildToolsDir="$__ProjectDir/Tools"
514 __UnprocessedBuildArgs=
521 __ClangMajorVersion=0
522 __ClangMinorVersion=0
523 __NuGetPath="$__PackagesDir/NuGet.exe"
525 __BuildAgainstPackagesArg=
529 __msbuildonunsupportedplatform=0
531 __NativeTestIntermediatesDir=
534 __BuildTestWrappers=1
535 __GenerateLayoutOnly=
536 __GenerateTestHostOnly=
541 if [ $# -le 0 ]; then
545 lowerI="$(echo $1 | awk '{print tolower($0)}')"
585 __CodeCoverage=Coverage
597 if [ "$__BuildOS" == "Linux" ]; then
600 echo "ERROR: portableLinux not supported for non-Linux platforms."
610 __ClangMajorVersion=3
611 __ClangMinorVersion=5
615 __ClangMajorVersion=3
616 __ClangMinorVersion=6
620 __ClangMajorVersion=3
621 __ClangMinorVersion=7
625 __ClangMajorVersion=3
626 __ClangMinorVersion=8
630 __ClangMajorVersion=3
631 __ClangMinorVersion=9
635 __ClangMajorVersion=4
636 __ClangMinorVersion=0
640 __ClangMajorVersion=5
641 __ClangMinorVersion=0
645 __ClangMajorVersion=6
646 __ClangMinorVersion=0
666 __GenerateLayoutOnly=1
668 generatetesthostonly)
669 __GenerateTestHostOnly=1
671 buildagainstpackages)
672 __BuildAgainstPackagesArg=1
678 if [ ! -d $__RootBinDir ]; then
681 __RootBinParent=$(dirname $__RootBinDir)
682 __RootBinName=${__RootBinDir##*/}
683 __RootBinDir="$(cd $__RootBinParent &>/dev/null && printf %s/%s $PWD $__RootBinName)"
686 echo "ERROR: 'bindir' requires a non-empty option argument"
691 msbuildonunsupportedplatform)
692 __msbuildonunsupportedplatform=1
696 __UnprocessedBuildArgs+=("-priority=1")
699 __UnprocessedBuildArgs+=("$1")
707 __RunArgs=("-BuildArch=$__BuildArch" "-BuildType=$__BuildType" "-BuildOS=$__BuildOS")
709 # Configure environment if we are doing a verbose build
710 if [ $__VerboseBuild == 1 ]; then
712 __RunArgs+=("-verbose")
715 # Set default clang version
716 if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then
717 if [ $__CrossBuild == 1 ]; then
718 __ClangMajorVersion=3
719 __ClangMinorVersion=6
721 __ClangMajorVersion=3
722 __ClangMinorVersion=5
727 # Set dependent variables
728 __LogsDir="$__RootBinDir/Logs"
730 # init the host distro name
733 # Set the remaining variables based upon the determined build configuration
734 __BinDir="$__RootBinDir/Product/$__BuildOS.$__BuildArch.$__BuildType"
735 __PackagesBinDir="$__BinDir/.nuget"
736 __ToolsDir="$__RootBinDir/tools"
737 __TestDir="$__ProjectDir/tests"
738 __TestWorkingDir="$__RootBinDir/tests/$__BuildOS.$__BuildArch.$__BuildType"
739 __IntermediatesDir="$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType"
740 __TestIntermediatesDir="$__RootBinDir/tests/obj/$__BuildOS.$__BuildArch.$__BuildType"
741 __isMSBuildOnNETCoreSupported=0
742 __CrossComponentBinDir="$__BinDir"
743 __CrossCompIntermediatesDir="$__IntermediatesDir/crossgen"
745 __CrossArch="$__HostArch"
746 if [[ "$__HostArch" == "x64" && "$__BuildArch" == "arm" ]]; then
749 if [ $__CrossBuild == 1 ]; then
750 __CrossComponentBinDir="$__CrossComponentBinDir/$__CrossArch"
752 __CrossgenCoreLibLog="$__LogsDir/CrossgenCoreLib_$__BuildOS.$BuildArch.$__BuildType.log"
753 __CrossgenExe="$__CrossComponentBinDir/crossgen"
755 isMSBuildOnNETCoreSupported
757 # CI_SPECIFIC - On CI machines, $HOME may not be set. In such a case, create a subfolder and set the variable to it.
758 # This is needed by CLI to function.
759 if [ -z "$HOME" ]; then
760 if [ ! -d "$__ProjectDir/temp_home" ]; then
763 export HOME=$__ProjectDir/temp_home
764 echo "HOME not defined; setting it to $HOME"
767 # Specify path to be set for CMAKE_INSTALL_PREFIX.
768 # This is where all built CoreClr libraries will copied to.
769 export __CMakeBinDir="$__BinDir"
770 if [ [ ! -d "$__BinDir" ] || [ ! -d "$__BinDir/bin" ] ]; then
771 if [ [ -z "$__GenerateLayoutOnly" ] && [ -z "$__GenerateTestHostOnly" ] ]; then
773 echo "Cannot find build directory for the CoreCLR native tests."
774 echo "Please make sure native tests are built before building managed tests."
775 echo "Example use: './build.sh $__BuildArch $__BuildType' without -skiptests switch"
777 echo "Cannot find build directory for the CoreCLR Product."
778 echo "Please make sure CoreCLR and native tests are built before building managed tests."
779 echo "Example use: './build.sh $__BuildArch $__BuildType' "
786 # Configure environment if we are doing a cross compile.
787 if [ $__CrossBuild == 1 ]; then
788 export CROSSCOMPILE=1
789 if ! [[ -n "$ROOTFS_DIR" ]]; then
790 export ROOTFS_DIR="$__ProjectRoot/cross/rootfs/$__BuildArch"
794 # init the target distro name
797 # Override tool directory
799 __CoreClrVersion=1.1.0
800 __sharedFxDir=$__BuildToolsDir/dotnetcli/shared/Microsoft.NETCore.App/$__CoreClrVersion/
803 if [[ (-z "$__GenerateLayoutOnly") && (-z "$__GenerateTestHostOnly") ]]; then
804 echo "Building Tests..."
807 echo "Generating test layout..."
809 if [ ! -z "$__GenerateTestHostOnly" ]; then
810 echo "Generating test host..."
815 if [ $? -ne 0 ]; then
816 echo "Failed to build tests"
820 echo "${__MsgPrefix}Test build successful."
821 echo "${__MsgPrefix}Test binaries are available at ${__TestBinDir}"
823 __testNativeBinDir=$__IntermediatesDir/tests
825 if [ $__RunTests -ne 0 ]; then
829 echo "${__TestDir}/runtest.sh --testRootDir=$__TestBinDir --coreClrBinDir=$__BinDir --coreFxBinDir=$__sharedFxDir --testNativeBinDir=$__testNativeBinDir"
831 $__TestDir/runtest.sh --testRootDir=$__TestBinDir --coreClrBinDir=$__BinDir --coreFxBinDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir
833 echo "Tests run successful."
835 echo "To run all tests use 'tests/runtests.sh' where:"
836 echo " testRootDir = $__TestBinDir"
837 echo " coreClrBinDir = $__BinDir"
838 echo " coreFxBinDir = $CORE_ROOT"
839 echo " testNativeBinDir = $__testNativeBinDir"
840 echo " -------------------------------------------------- "
841 echo " Example runtest.sh command"
843 echo " ./tests/runtest.sh --coreOverlayDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir --testRootDir=$__TestBinDir --copyNativeTestBin"
844 echo " -------------------------------------------------- "
845 echo "To run single test use the following command:"
846 echo " bash ${__TestBinDir}/__TEST_PATH__/__TEST_NAME__.sh -coreroot=${CORE_ROOT}"