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 __ManagedTestBuiltMarker=${__TestBinDir}/managed_test_build
243 if [ ! -f $__ManagedTestBuiltMarker ]; then
245 build_Tests_internal "Tests_Managed" "$__ProjectDir/tests/build.proj" "$__up" "Managed tests build (build tests)"
247 if [ $? -ne 0 ]; then
248 echo "${__MsgPrefix}Error: build failed. Refer to the build log files for details (above)"
251 echo "Tests have been built."
252 echo "Create marker \"${__ManagedTestBuiltMarker}\""
253 touch $__ManagedTestBuiltMarker
256 echo "Managed Tests had been built before."
259 if [ $__BuildTestWrappers -ne -0 ]; then
260 echo "${__MsgPrefix}Creating test wrappers..."
262 __XUnitWrapperBuiltMarker=${__TestBinDir}/xunit_wrapper_build
264 if [ ! -f $__XUnitWrapperBuiltMarker ]; then
266 build_Tests_internal "Tests_XunitWrapper" "$__ProjectDir/tests/runtest.proj" "-BuildWrappers -MsBuildEventLogging=\" \" " "Test Xunit Wrapper"
268 if [ $? -ne 0 ]; then
269 echo "${__MsgPrefix}Error: build failed. Refer to the build log files for details (above)"
272 echo "XUnit Wrappers have been built."
273 echo "Create marker \"${__XUnitWrapperBuiltMarker}\""
274 touch $__XUnitWrapperBuiltMarker
277 echo "XUnit Wrappers had been built before."
281 if [ -n "$__UpdateInvalidPackagesArg" ]; then
282 __up=-updateinvalidpackageversion
285 echo "${__MsgPrefix}Creating test overlay..."
289 if [ $__ZipTests -ne 0 ]; then
290 echo "${__MsgPrefix}ZIP tests packages..."
291 build_Tests_internal "Helix_Prep" "$__ProjectDir/tests/helixprep.proj" " " "Prep test binaries for Helix publishing"
295 build_Tests_internal()
299 extraBuildParameters=$3
302 # Set up directories and file names
303 __BuildLogRootName=$subDirectoryName
304 __BuildLog="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.log"
305 __BuildWrn="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.wrn"
306 __BuildErr="$__LogsDir/${__BuildLogRootName}.${__BuildOS}.${__BuildArch}.${__BuildType}.err"
307 __msbuildLog="\"/flp:Verbosity=normal;LogFile=${__BuildLog}\""
308 __msbuildWrn="\"/flp1:WarningsOnly;LogFile=${__BuildWrn}\""
309 __msbuildErr="\"/flp2:ErrorsOnly;LogFile=${__BuildErr}\""
311 # Generate build command
312 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"
314 echo "Building step '$stepName' via $buildCommand"
320 # $__ProjectRoot/run.sh build -Project=$projectName -MsBuildLog="$__msbuildLog" -MsBuildWrn="$__msbuildWrn" -MsBuildErr="$__msbuildErr" $extraBuildParameters $__RunArgs $__UnprocessedBuildArgs
322 # Make sure everything is OK
323 if [ $? -ne 0 ]; then
324 echo "${__MsgPrefix}Failed to build $stepName. See the build logs:"
334 echo "Usage: $0 [BuildArch] [BuildType] [verbose] [coverage] [cross] [clangx.y] [ninja] [runtests] [bindir]"
335 echo "BuildArch can be: x64, x86, arm, armel, arm64"
336 echo "BuildType can be: debug, checked, release"
337 echo "coverage - optional argument to enable code coverage build (currently supported only for Linux and OSX)."
338 echo "ninja - target ninja instead of GNU make"
339 echo "clangx.y - optional argument to build using clang version x.y - supported version 3.5 - 6.0"
340 echo "cross - optional argument to signify cross compilation,"
341 echo " - will use ROOTFS_DIR environment variable if set."
342 echo "crosscomponent - optional argument to build cross-architecture component,"
343 echo " - will use CAC_ROOTFS_DIR environment variable if set."
344 echo "portableLinux - build for Portable Linux Distribution"
345 echo "portablebuild - Use portable build."
346 echo "verbose - optional argument to enable verbose build output."
347 echo "rebuild - if tests have already been built - rebuild them"
348 echo "generatelayoutonly - only pull down dependencies and build coreroot"
349 echo "buildagainstpackages - pull down and build using packages."
350 echo "runtests - run tests after building them"
351 echo "ziptests - zips CoreCLR tests & Core_Root for a Helix run"
352 echo "bindir - output directory (defaults to $__ProjectRoot/bin)"
353 echo "msbuildonunsupportedplatform - build managed binaries even if distro is not officially supported."
358 # Obtain the location of the bash script to figure out where the root of the repo is.
359 __ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
361 # $__ProjectRoot/build.sh $1 $2
363 # Use uname to determine what the CPU is.
366 # Some Linux platforms report unknown for platform, but the arch for machine.
367 if [ "$CPUName" == "unknown" ]; then
373 echo "Unsupported CPU $CPUName detected, build might not succeed!"
384 echo "Unsupported CPU $CPUName detected, build might not succeed!"
395 echo "Unknown CPU $CPUName detected, configuring as if for x64"
401 # Use uname to determine what the OS is.
435 echo "Unsupported OS $OSName detected, configuring as if for Linux"
443 __IncludeTests=INCLUDE_TESTS
445 # Set the various build properties here so that CMake and MSBuild can pick them up
446 export __ProjectDir="$__ProjectRoot"
447 __SourceDir="$__ProjectDir/src"
448 __PackagesDir="$__ProjectDir/packages"
449 __RootBinDir="$__ProjectDir/bin"
450 __BuildToolsDir="$__ProjectDir/Tools"
451 __UnprocessedBuildArgs=
458 __ClangMajorVersion=0
459 __ClangMinorVersion=0
460 __NuGetPath="$__PackagesDir/NuGet.exe"
462 __BuildAgainstPackagesArg=
466 __msbuildonunsupportedplatform=0
468 __NativeTestIntermediatesDir=
471 __BuildTestWrappers=0
472 __GenerateLayoutOnly=
476 if [ $# -le 0 ]; then
480 lowerI="$(echo $1 | awk '{print tolower($0)}')"
520 __CodeCoverage=Coverage
532 if [ "$__BuildOS" == "Linux" ]; then
535 echo "ERROR: portableLinux not supported for non-Linux platforms."
545 __ClangMajorVersion=3
546 __ClangMinorVersion=5
550 __ClangMajorVersion=3
551 __ClangMinorVersion=6
555 __ClangMajorVersion=3
556 __ClangMinorVersion=7
560 __ClangMajorVersion=3
561 __ClangMinorVersion=8
565 __ClangMajorVersion=3
566 __ClangMinorVersion=9
570 __ClangMajorVersion=4
571 __ClangMinorVersion=0
575 __ClangMajorVersion=5
576 __ClangMinorVersion=0
580 __ClangMajorVersion=6
581 __ClangMinorVersion=0
601 __GenerateLayoutOnly=1
604 buildagainstpackages)
605 __BuildAgainstPackagesArg=1
611 if [ ! -d $__RootBinDir ]; then
614 __RootBinParent=$(dirname $__RootBinDir)
615 __RootBinName=${__RootBinDir##*/}
616 __RootBinDir="$(cd $__RootBinParent &>/dev/null && printf %s/%s $PWD $__RootBinName)"
619 echo "ERROR: 'bindir' requires a non-empty option argument"
624 msbuildonunsupportedplatform)
625 __msbuildonunsupportedplatform=1
628 __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
636 __RunArgs="-BuildArch=$__BuildArch -BuildType=$__BuildType -BuildOS=$__BuildOS"
638 # Configure environment if we are doing a verbose build
639 if [ $__VerboseBuild == 1 ]; then
641 __RunArgs="$__RunArgs -verbose"
644 # Set default clang version
645 if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then
646 if [ $__CrossBuild == 1 ]; then
647 __ClangMajorVersion=3
648 __ClangMinorVersion=6
650 __ClangMajorVersion=3
651 __ClangMinorVersion=5
656 # Set dependent variables
657 __LogsDir="$__RootBinDir/Logs"
659 # init the host distro name
662 # Set the remaining variables based upon the determined build configuration
663 __BinDir="$__RootBinDir/Product/$__BuildOS.$__BuildArch.$__BuildType"
664 __PackagesBinDir="$__BinDir/.nuget"
665 __ToolsDir="$__RootBinDir/tools"
666 __TestDir="$__ProjectDir/tests"
667 __TestWorkingDir="$__RootBinDir/tests/$__BuildOS.$__BuildArch.$__BuildType"
668 __IntermediatesDir="$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType"
669 __TestIntermediatesDir="$__RootBinDir/tests/obj/$__BuildOS.$__BuildArch.$__BuildType"
670 __isMSBuildOnNETCoreSupported=0
671 __CrossComponentBinDir="$__BinDir"
672 __CrossCompIntermediatesDir="$__IntermediatesDir/crossgen"
674 __CrossArch="$__HostArch"
675 if [[ "$__HostArch" == "x64" && "$__BuildArch" == "arm" ]]; then
678 if [ $__CrossBuild == 1 ]; then
679 __CrossComponentBinDir="$__CrossComponentBinDir/$__CrossArch"
681 __CrossgenCoreLibLog="$__LogsDir/CrossgenCoreLib_$__BuildOS.$BuildArch.$__BuildType.log"
682 __CrossgenExe="$__CrossComponentBinDir/crossgen"
684 isMSBuildOnNETCoreSupported
686 # CI_SPECIFIC - On CI machines, $HOME may not be set. In such a case, create a subfolder and set the variable to set.
687 # This is needed by CLI to function.
688 if [ -z "$HOME" ]; then
689 if [ ! -d "$__ProjectDir/temp_home" ]; then
692 export HOME=$__ProjectDir/temp_home
693 echo "HOME not defined; setting it to $HOME"
696 # Specify path to be set for CMAKE_INSTALL_PREFIX.
697 # This is where all built CoreClr libraries will copied to.
698 export __CMakeBinDir="$__BinDir"
700 if [ ! -d "$__BinDir" ] || [ ! -d "$__BinDir/bin" ]; then
702 echo "Cannot find build directory for the CoreCLR Product or native tests."
703 echo "Please make sure CoreCLR and native tests are built before building managed tests."
704 echo "Example use: './build.sh $__BuildArch $__BuildType' without -skiptests switch"
708 # Configure environment if we are doing a cross compile.
709 if [ $__CrossBuild == 1 ]; then
710 export CROSSCOMPILE=1
711 if ! [[ -n "$ROOTFS_DIR" ]]; then
712 export ROOTFS_DIR="$__ProjectRoot/cross/rootfs/$__BuildArch"
716 # init the target distro name
719 # Override tool directory
721 __CoreClrVersion=1.1.0
722 __sharedFxDir=$__BuildToolsDir/dotnetcli/shared/Microsoft.NETCore.App/$__CoreClrVersion/
724 echo "Building Tests..."
726 if [ -z "$__GenerateLayoutOnly" ]; then
732 if [ $? -ne 0 ]; then
733 echo "Failed to build tests"
737 echo "${__MsgPrefix}Test build successful."
738 echo "${__MsgPrefix}Test binaries are available at ${__TestBinDir}"
740 __testNativeBinDir=$__IntermediatesDir/tests
742 if [ $__RunTests -ne 0 ]; then
746 echo "${__TestDir}/runtest.sh --testRootDir=$__TestBinDir --coreClrBinDir=$__BinDir --coreFxBinDir=$__sharedFxDir --testNativeBinDir=$__testNativeBinDir"
748 $__TestDir/runtest.sh --testRootDir=$__TestBinDir --coreClrBinDir=$__BinDir --coreFxBinDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir
750 echo "Tests run successful."
752 echo "To run all tests use 'tests/runtests.sh' where:"
753 echo " testRootDir = $__TestBinDir"
754 echo " coreClrBinDir = $__BinDir"
755 echo " coreFxBinDir = $CORE_ROOT"
756 echo " testNativeBinDir = $__testNativeBinDir"
757 echo " -------------------------------------------------- "
758 echo " Example runtest.sh command"
760 echo " ./tests/runtest.sh --coreOverlayDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir --testRootDir=$__TestBinDir --copyNativeTestBin"
761 echo " -------------------------------------------------- "
762 echo "To run single test use the following command:"
763 echo " bash ${__TestBinDir}/__TEST_PATH__/__TEST_NAME__.sh -coreroot=${CORE_ROOT}"