3 # Work around Jenkins CI + msbuild problem: Jenkins sometimes creates very large environment
4 # variables, and msbuild can't handle environment blocks with such large variables. So clear
5 # out the variables that might be too large.
6 export ghprbCommentBody=
8 # resolve python-version to use
9 if [ "$PYTHON" == "" ] ; then
10 if ! PYTHON=$(command -v python3 || command -v python2 || command -v python || command -v py)
12 echo "Unable to locate build-dependency python!" 1>&2
16 # validate python-dependency
17 # useful in case of explicitly set option.
18 if ! command -v $PYTHON > /dev/null
20 echo "Unable to locate build-dependency python ($PYTHON)!" 1>&2
28 echo "Usage: $0 [BuildArch] [BuildType] [-verbose] [-coverage] [-cross] [-gccx.y] [-clangx.y] [-ninja] [-configureonly] [-skipconfigure] [-skipnative] [-skipcrossarchnative] [-skipmanaged] [-skipmscorlib] [-skiptests] [-stripsymbols] [-ignorewarnings] [-cmakeargs] [-bindir]"
29 echo "BuildArch can be: -x64, -x86, -arm, -armel, -arm64"
30 echo "BuildType can be: -debug, -checked, -release"
31 echo "-coverage - optional argument to enable code coverage build (currently supported only for Linux and OSX)."
32 echo "-ninja - target ninja instead of GNU make"
33 echo "-gccx.y - optional argument to build using gcc version x.y."
34 echo "-clangx.y - optional argument to build using clang version x.y."
35 echo "-cross - optional argument to signify cross compilation,"
36 echo " - will use ROOTFS_DIR environment variable if set."
37 echo "-nopgooptimize - do not use profile guided optimizations."
38 echo "-pgoinstrument - generate instrumented code for profile guided optimization enabled binaries."
39 echo "-ibcinstrument - generate IBC-tuning-enabled native images when invoking crossgen."
40 echo "-configureonly - do not perform any builds; just configure the build."
41 echo "-skipconfigure - skip build configuration."
42 echo "-skipnative - do not build native components."
43 echo "-skipcrossarchnative - do not build cross-architecture native components."
44 echo "-skipmanaged - do not build managed components."
45 echo "-skipmscorlib - do not build mscorlib.dll."
46 echo "-skiptests - skip the tests in the 'tests' subdirectory."
47 echo "-skipnuget - skip building nuget packages."
48 echo "-skiprestoreoptdata - skip restoring optimization data used by profile-based optimizations."
49 echo "-skipcrossgen - skip native image generation"
50 echo "-crossgenonly - only run native image generation"
51 echo "-partialngen - build CoreLib as PartialNGen"
52 echo "-verbose - optional argument to enable verbose build output."
53 echo "-skiprestore: skip restoring packages ^(default: packages are restored during build^)."
54 echo "-disableoss: Disable Open Source Signing for System.Private.CoreLib."
55 echo "-officialbuildid=^<ID^>: specify the official build ID to be used by this build."
56 echo "-stripSymbols - Optional argument to strip native symbols during the build."
57 echo "-skipgenerateversion - disable version generation even if MSBuild is supported."
58 echo "-ignorewarnings - do not treat warnings as errors"
59 echo "-cmakeargs - user-settable additional arguments passed to CMake."
60 echo "-bindir - output directory (defaults to $__ProjectRoot/bin)"
61 echo "-msbuildonunsupportedplatform - build managed binaries even if distro is not officially supported."
62 echo "-numproc - set the number of build processes."
63 echo "-portablebuild - pass -portablebuild=false to force a non-portable build."
64 echo "-staticanalyzer - build with clang static analyzer enabled."
70 source init-distro-rid.sh
72 local passedRootfsDir=""
74 # Only pass ROOTFS_DIR if cross is specified.
75 if (( ${__CrossBuild} == 1 )); then
76 passedRootfsDir=${ROOTFS_DIR}
77 elif [ "${__BuildArch}" != "${__HostArch}" ]; then
78 echo "Error, you are building a cross scenario without passing -cross."
82 initDistroRidGlobal ${__BuildOS} ${__BuildArch} ${__PortableBuild} ${passedRootfsDir}
87 echo Setting up directories for build
89 mkdir -p "$__RootBinDir"
92 mkdir -p "$__MsbuildDebugLogsDir"
93 mkdir -p "$__IntermediatesDir"
95 if [ $__CrossBuild == 1 ]; then
96 mkdir -p "$__CrossComponentBinDir"
100 # Check the system to ensure the right prereqs are in place
104 echo "Checking prerequisites..."
106 # Check presence of CMake on the path
107 hash cmake 2>/dev/null || { echo >&2 "Please install cmake before running this script"; exit 1; }
110 # Minimum required version of clang is version 4.0 for arm/armel cross build
111 if [[ $__CrossBuild == 1 && $__GccBuild == 0 && ("$__BuildArch" == "arm" || "$__BuildArch" == "armel") ]]; then
112 if ! [[ "$__ClangMajorVersion" -ge "4" ]]; then
113 echo "Please install clang4.0 or latest for arm/armel cross build"; exit 1;
118 if [[ $__GccBuild == 0 ]]; then
119 __ClangCombinedDottedVersion=$__ClangMajorVersion;
120 if [[ "$__ClangMinorVersion" != "" ]]; then
121 __ClangCombinedDottedVersion=$__ClangCombinedDottedVersion.$__ClangMinorVersion
123 hash clang-$__ClangCombinedDottedVersion 2>/dev/null || hash clang$__ClangMajorVersion$__ClangMinorVersion 2>/dev/null || hash clang 2>/dev/null || { echo >&2 "Please install clang-$__ClangMajorVersion.$__ClangMinorVersion before running this script"; exit 1; }
125 __GccCombinedDottedVersion=$__GccMajorVersion;
126 if [[ "$__GccMinorVersion" != "" ]]; then
127 __GccCombinedDottedVersion=$__GccCombinedDottedVersion.$__GccMinorVersion
129 hash gcc-$__GccCombinedDottedVersion 2>/dev/null || hash gcc$__GccMajorVersion$__GccMinorVersion 2>/dev/null || hash gcc 2>/dev/null || { echo >&2 "Please install gcc-$__GccMajorVersion.$__GccMinorVersion before running this script"; exit 1; }
136 # we only need optdata on a Release build
137 if [[ "$__BuildType" != "Release" ]]; then __SkipRestoreOptData=1; fi
139 local OptDataProjectFilePath="$__ProjectRoot/src/.nuget/optdata/optdata.csproj"
140 if [[ ( $__SkipRestoreOptData == 0 ) && ( $__isMSBuildOnNETCoreSupported == 1 ) ]]; then
141 echo "Restoring the OptimizationData package"
142 "$__ProjectRoot/dotnet.sh" restore /nologo /verbosity:minimal /clp:Summary /m \
143 $OptDataProjectFilePath \
144 $__CommonMSBuildArgs $__UnprocessedBuildArgs
146 echo "Failed to restore the optimization data package."
151 if [ $__isMSBuildOnNETCoreSupported == 1 ]; then
152 # Parse the optdata package versions out of msbuild so that we can pass them on to CMake
155 source "${__ProjectRoot}/init-dotnet.sh"
156 local DotNetCli=${_InitializeDotNetCli}/dotnet
158 __PgoOptDataVersion=$(DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 $DotNetCli msbuild $OptDataProjectFilePath /t:DumpPgoDataPackageVersion /nologo)
160 echo "Failed to get PGO data package version."
163 __PgoOptDataVersion=$(echo $__PgoOptDataVersion | sed 's/^\s*//')
164 __IbcOptDataVersion=$(DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 $DotNetCli msbuild $OptDataProjectFilePath /t:DumpIbcDataPackageVersion /nologo)
166 echo "Failed to get IBC data package version."
169 __IbcOptDataVersion=$(echo $__IbcOptDataVersion | sed 's/^[[:blank:]]*//')
173 generate_event_logging_sources()
176 __OutputEventingDir="$__OutputDir/Eventing"
178 __PythonWarningFlags="-Wall"
179 if [[ $__IgnoreWarnings == 0 ]]; then
180 __PythonWarningFlags="$__PythonWarningFlags -Werror"
183 echo "Laying out dynamically generated EventSource classes"
184 $PYTHON -B $__PythonWarningFlags "$__ProjectRoot/src/scripts/genRuntimeEventSources.py" --man "$__ProjectRoot/src/vm/ClrEtwAll.man" --intermediate "$__OutputEventingDir"
187 generate_event_logging()
189 # Event Logging Infrastructure
190 if [[ $__SkipMSCorLib == 0 ]]; then
191 generate_event_logging_sources "$__IntermediatesDir"
199 intermediatesForBuild="$3"
200 extraCmakeArguments="$4"
203 if [ $skipCondition == 1 ]; then
204 echo "Skipping $message build."
208 # All set to commence the build
209 echo "Commencing build of $message for $__BuildOS.$__BuildArch.$__BuildType in $intermediatesForBuild"
214 if [ $__UseNinja == 1 ]; then
216 buildFile="build.ninja"
217 if ! buildTool=$(command -v ninja || command -v ninja-build); then
218 echo "Unable to locate ninja!" 1>&2
223 if [ $__SkipConfigure == 0 ]; then
224 # if msbuild is not supported, then set __SkipGenerateVersion to 1
225 if [ $__isMSBuildOnNETCoreSupported == 0 ]; then __SkipGenerateVersion=1; fi
226 # Drop version.c file
227 __versionSourceFile="$intermediatesForBuild/version.c"
228 if [ $__SkipGenerateVersion == 0 ]; then
230 "$__ProjectRoot/eng/common/msbuild.sh" $__ProjectRoot/eng/empty.csproj \
231 /p:NativeVersionFile=$__versionSourceFile \
232 /p:ArcadeBuild=true /t:GenerateNativeVersionFile /restore \
233 $__CommonMSBuildArgs $__UnprocessedBuildArgs
234 if [ $? -ne 0 ]; then
235 echo "Failed to generate native version file."
239 # Generate the dummy version.c, but only if it didn't exist to make sure we don't trigger unnecessary rebuild
240 __versionSourceLine="static char sccsid[] __attribute__((used)) = \"@(#)No version information produced\";"
241 if [ -e $__versionSourceFile ]; then
242 read existingVersionSourceLine < $__versionSourceFile
244 if [ "$__versionSourceLine" != "$existingVersionSourceLine" ]; then
245 echo $__versionSourceLine > $__versionSourceFile
250 pushd "$intermediatesForBuild"
251 # Regenerate the CMake solution
253 scriptDir="$__ProjectRoot/src/pal/tools"
254 if [[ $__GccBuild == 0 ]]; then
256 if [[ $__StaticAnalyzer == 1 ]]; then
257 scan_build=scan-build
259 echo "Invoking \"$scriptDir/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion \"$__ClangMinorVersion\" $platformArch "$scriptDir" $__BuildType $__CodeCoverage $scan_build $generator $extraCmakeArguments $__cmakeargs"
260 source "$scriptDir/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion "$__ClangMinorVersion" $platformArch "$scriptDir" $__BuildType $__CodeCoverage $scan_build $generator "$extraCmakeArguments" "$__cmakeargs"
262 echo "Invoking \"$scriptDir/gen-buildsys-gcc.sh\" \"$__ProjectRoot\" $__GccMajorVersion \"$__GccMinorVersion\" $platformArch "$scriptDir" $__BuildType $__CodeCoverage $generator $extraCmakeArguments $__cmakeargs"
263 source "$scriptDir/gen-buildsys-gcc.sh" "$__ProjectRoot" "$__GccMajorVersion" "$__CGccMinorVersion" $platformArch "$scriptDir" $__BuildType $__CodeCoverage $generator "$extraCmakeArguments" "$__cmakeargs"
268 if [ ! -f "$intermediatesForBuild/$buildFile" ]; then
269 echo "Failed to generate $message build project!"
274 if [ $__ConfigureOnly == 1 ]; then
275 echo "Finish configuration & skipping $message build."
279 # Check that the makefiles were created.
280 pushd "$intermediatesForBuild"
282 if [ $__StaticAnalyzer == 1 ]; then
283 buildTool="$SCAN_BUILD_COMMAND $buildTool"
286 echo "Executing $buildTool install -j $__NumProc"
288 $buildTool install -j $__NumProc
290 echo "Failed to build $message."
297 build_cross_architecture_components()
299 local intermediatesForBuild="$__IntermediatesDir/Host$__CrossArch/crossgen"
300 local crossArchBinDir="$__BinDir/$__CrossArch"
302 mkdir -p "$intermediatesForBuild"
303 mkdir -p "$crossArchBinDir"
305 generate_event_logging_sources "$intermediatesForBuild" "the crossarch build system"
307 __SkipCrossArchBuild=1
308 # check supported cross-architecture components host(__HostArch)/target(__BuildArch) pair
309 if [[ ("$__BuildArch" == "arm" || "$__BuildArch" == "armel") && ("$__CrossArch" == "x86" || "$__CrossArch" == "x64") ]]; then
310 __SkipCrossArchBuild=0
311 elif [[ "$__BuildArch" == "arm64" && "$__CrossArch" == "x64" ]]; then
312 __SkipCrossArchBuild=0
318 export __CMakeBinDir="$crossArchBinDir"
319 export CROSSCOMPILE=0
321 __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__BuildArch -DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument -DCLR_CMAKE_OPTDATA_VERSION=$__PgoOptDataVersion -DCLR_CMAKE_PGO_OPTIMIZE=$__PgoOptimize -DCLR_CROSS_COMPONENTS_BUILD=1"
322 build_native $__SkipCrossArchBuild "$__CrossArch" "$intermediatesForBuild" "$__ExtraCmakeArgs" "cross-architecture components"
324 export CROSSCOMPILE=1
327 isMSBuildOnNETCoreSupported()
329 __isMSBuildOnNETCoreSupported=$__msbuildonunsupportedplatform
331 if [ $__isMSBuildOnNETCoreSupported == 1 ]; then
335 if [ $__SkipManaged == 1 ]; then
336 __isMSBuildOnNETCoreSupported=0
340 if [ "$__HostArch" == "x64" ]; then
341 if [ "$__HostOS" == "Linux" ]; then
342 __isMSBuildOnNETCoreSupported=1
343 # note: the RIDs below can use globbing patterns
344 UNSUPPORTED_RIDS=("ubuntu.17.04-x64")
345 for UNSUPPORTED_RID in "${UNSUPPORTED_RIDS[@]}"
347 if [[ ${__DistroRid} == $UNSUPPORTED_RID ]]; then
348 __isMSBuildOnNETCoreSupported=0
352 elif [ "$__HostOS" == "OSX" ]; then
353 __isMSBuildOnNETCoreSupported=1
354 elif [ "$__HostOS" == "FreeBSD" ]; then
355 __isMSBuildOnNETCoreSupported=1
363 local __CrossGenExec=$1
364 local __CoreLibILDir=$2
366 if [ $__PartialNgen == 1 ]; then
367 export COMPlus_PartialNGen=1
370 if [ -e $__CrossGenCoreLibLog ]; then
371 rm $__CrossGenCoreLibLog
373 echo "Generating native image of System.Private.CoreLib.dll for $__BuildOS.$__BuildArch.$__BuildType. Logging to \"$__CrossGenCoreLibLog\"."
374 echo "$__CrossGenExec /Platform_Assemblies_Paths $__CoreLibILDir $__IbcTuning /out $__BinDir/System.Private.CoreLib.dll $__CoreLibILDir/System.Private.CoreLib.dll"
375 $__CrossGenExec /Platform_Assemblies_Paths $__CoreLibILDir $__IbcTuning /out $__BinDir/System.Private.CoreLib.dll $__CoreLibILDir/System.Private.CoreLib.dll >> $__CrossGenCoreLibLog 2>&1
376 if [ $? -ne 0 ]; then
377 echo "Failed to generate native image for System.Private.CoreLib. Refer to $__CrossGenCoreLibLog"
381 if [ "$__BuildOS" == "Linux" ]; then
382 echo "Generating symbol file for System.Private.CoreLib.dll"
383 echo "$__CrossGenExec /Platform_Assemblies_Paths $__BinDir /CreatePerfMap $__BinDir $__BinDir/System.Private.CoreLib.dll"
384 $__CrossGenExec /Platform_Assemblies_Paths $__BinDir /CreatePerfMap $__BinDir $__BinDir/System.Private.CoreLib.dll >> $__CrossGenCoreLibLog 2>&1
385 if [ $? -ne 0 ]; then
386 echo "Failed to generate symbol file for System.Private.CoreLib. Refer to $__CrossGenCoreLibLog"
394 if [ $__isMSBuildOnNETCoreSupported == 0 ]; then
395 echo "System.Private.CoreLib.dll build unsupported."
399 if [ $__SkipMSCorLib == 1 ]; then
400 echo "Skipping building System.Private.CoreLib."
404 echo "Commencing build of managed components for $__BuildOS.$__BuildArch.$__BuildType"
408 if [[ "$__IbcTuning" == "" ]]; then
409 __ExtraBuildArgs="$__ExtraBuildArgs /p:OptimizationDataDir=\"$__PackagesDir/optimization.$__BuildOS-$__BuildArch.IBC.CoreCLR/$__IbcOptDataVersion/data\""
410 __ExtraBuildArgs="$__ExtraBuildArgs /p:EnableProfileGuidedOptimization=true"
413 if [[ "$__BuildManagedTools" -eq "1" ]]; then
414 __ExtraBuildArgs="$__ExtraBuildArgs /p:BuildManagedTools=true"
417 $__ProjectRoot/dotnet.sh restore /nologo /verbosity:minimal /clp:Summary \
418 /p:PortableBuild=true /maxcpucount /p:IncludeRestoreOnlyProjects=true /p:ArcadeBuild=true\
419 $__ProjectDir/src/build.proj \
420 /flp:Verbosity=normal\;LogFile=$__LogsDir/System.Private.CoreLib_$__BuildOS__$__BuildArch__$__BuildType.log \
421 /p:__IntermediatesDir=$__IntermediatesDir /p:__RootBinDir=$__RootBinDir \
422 $__CommonMSBuildArgs $__ExtraBuildArgs $__UnprocessedBuildArgs
424 if [ $? -ne 0 ]; then
425 echo "Failed to restore managed components."
429 $__ProjectRoot/dotnet.sh msbuild /nologo /verbosity:minimal /clp:Summary \
430 /p:PortableBuild=true /maxcpucount /p:ArcadeBuild=true\
431 $__ProjectDir/src/build.proj \
432 /flp:Verbosity=normal\;LogFile=$__LogsDir/System.Private.CoreLib_$__BuildOS__$__BuildArch__$__BuildType.log \
433 /p:__IntermediatesDir=$__IntermediatesDir /p:__RootBinDir=$__RootBinDir \
434 $__CommonMSBuildArgs $__ExtraBuildArgs $__UnprocessedBuildArgs
436 if [ $? -ne 0 ]; then
437 echo "Failed to build managed components."
441 local __CoreLibILDir=$__BinDir/IL
443 if [ $__SkipCrossgen == 1 ]; then
444 echo "Skipping generating native image"
446 if [ $__CrossBuild == 1 ]; then
447 # Crossgen not performed, so treat the IL version as the final version
448 cp $__CoreLibILDir/System.Private.CoreLib.dll $__BinDir/System.Private.CoreLib.dll
454 # The cross build generates a crossgen with the target architecture.
455 if [ $__CrossBuild == 0 ]; then
456 if [ $__SkipCoreCLR == 1 ]; then
460 # The architecture of host pc must be same architecture with target.
461 if [[ ( "$__HostArch" == "$__BuildArch" ) ]]; then
462 build_CoreLib_ni "$__BinDir/crossgen" $__CoreLibILDir
463 elif [[ ( "$__HostArch" == "x64" ) && ( "$__BuildArch" == "x86" ) ]]; then
464 build_CoreLib_ni "$__BinDir/crossgen" $__CoreLibILDir
465 elif [[ ( "$__HostArch" == "arm64" ) && ( "$__BuildArch" == "arm" ) ]]; then
466 build_CoreLib_ni "$__BinDir/crossgen" $__CoreLibILDir
471 if [[ ( "$__CrossArch" == "x86" ) && ( "$__BuildArch" == "arm" ) ]]; then
472 build_CoreLib_ni "$__CrossComponentBinDir/crossgen" $__CoreLibILDir
473 elif [[ ( "$__CrossArch" == "x64" ) && ( "$__BuildArch" == "arm" ) ]]; then
474 build_CoreLib_ni "$__CrossComponentBinDir/crossgen" $__CoreLibILDir
475 elif [[ ( "$__HostArch" == "x64" ) && ( "$__BuildArch" == "arm64" ) ]]; then
476 build_CoreLib_ni "$__CrossComponentBinDir/crossgen" $__CoreLibILDir
478 # Crossgen not performed, so treat the IL version as the final version
479 cp $__CoreLibILDir/System.Private.CoreLib.dll $__BinDir/System.Private.CoreLib.dll
484 generate_NugetPackages()
486 # We can only generate nuget package if we also support building mscorlib as part of this build.
487 if [ $__isMSBuildOnNETCoreSupported == 0 ]; then
488 echo "Nuget package generation unsupported."
492 # Since we can build mscorlib for this OS, did we build the native components as well?
493 if [[ $__SkipCoreCLR == 1 && $__CrossgenOnly == 0 ]]; then
494 echo "Unable to generate nuget packages since native components were not built."
498 echo "Generating nuget packages for "$__BuildOS
499 echo "DistroRid is "$__DistroRid
500 echo "ROOTFS_DIR is "$ROOTFS_DIR
502 # Package build uses the Arcade system and scripts, relying on it to restore required toolsets as part of build
503 $__ProjectRoot/eng/common/build.sh -r -b -projects $__SourceDir/.nuget/packages.builds \
504 -verbosity minimal -bl:$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.binlog \
505 /p:PortableBuild=true /p:ArcadeBuild=true \
506 /p:__IntermediatesDir=$__IntermediatesDir /p:__RootBinDir=$__RootBinDir /p:__DoCrossArchBuild=$__CrossBuild \
507 $__CommonMSBuildArgs $__UnprocessedBuildArgs
509 if [ $? -ne 0 ]; then
510 echo "Failed to generate Nuget packages."
515 echo "Commencing CoreCLR Repo build"
517 # Argument types supported by this script:
519 # Build architecture - valid values are: x64, ARM.
520 # Build Type - valid values are: Debug, Checked, Release
522 # Set the default arguments for build
524 # Obtain the location of the bash script to figure out where the root of the repo is.
525 __ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
527 # Use uname to determine what the CPU is.
529 # Some Linux platforms report unknown for platform, but the arch for machine.
530 if [ "$CPUName" == "unknown" ]; then
536 echo "Unsupported CPU $CPUName detected, build might not succeed!"
547 echo "Unsupported CPU $CPUName detected, build might not succeed!"
562 echo "Unknown CPU $CPUName detected, configuring as if for x64"
568 # Use uname to determine what the OS is.
602 echo "Unsupported OS $OSName detected, configuring as if for Linux"
612 # Set the various build properties here so that CMake and MSBuild can pick them up
613 __ProjectDir="$__ProjectRoot"
614 __SourceDir="$__ProjectDir/src"
615 __PackagesDir="${DotNetRestorePackagesPath:-${__ProjectDir}/.packages}"
616 __RootBinDir="$__ProjectDir/bin"
617 __UnprocessedBuildArgs=
631 __SkipCrossArchNative=0
633 __SkipRestoreOptData=0
639 __ClangMajorVersion=0
640 __ClangMinorVersion=0
644 __NuGetPath="$__PackagesDir/NuGet.exe"
647 __SkipGenerateVersion=0
649 __msbuildonunsupportedplatform=0
650 __PgoOptDataVersion=""
651 __IbcOptDataVersion=""
652 __BuildManagedTools=1
653 __SkipRestoreArg="/p:RestoreDuringBuild=true"
655 __OfficialBuildIdArg=""
658 # Get the number of processors available to the scheduler
659 # Other techniques such as `nproc` only get the number of
660 # processors available to a single process.
661 if [ `uname` = "FreeBSD" ]; then
662 __NumProc=`sysctl hw.ncpu | awk '{ print $2+1 }'`
663 elif [ `uname` = "NetBSD" ]; then
664 __NumProc=$(($(getconf NPROCESSORS_ONLN)+1))
665 elif [ `uname` = "Darwin" ]; then
666 __NumProc=$(($(getconf _NPROCESSORS_ONLN)+1))
668 __NumProc=$(nproc --all)
672 if [ $# -le 0 ]; then
676 lowerI="$(echo $1 | awk '{print tolower($0)}')"
716 __CodeCoverage=Coverage
723 -portablebuild=false)
731 stripsymbols|-stripsymbols)
732 __cmakeargs="$__cmakeargs -DSTRIP_SYMBOLS=true"
736 __ClangMajorVersion=3
737 __ClangMinorVersion=5
741 __ClangMajorVersion=3
742 __ClangMinorVersion=6
746 __ClangMajorVersion=3
747 __ClangMinorVersion=7
751 __ClangMajorVersion=3
752 __ClangMinorVersion=8
756 __ClangMajorVersion=3
757 __ClangMinorVersion=9
761 __ClangMajorVersion=4
762 __ClangMinorVersion=0
766 __ClangMajorVersion=5
767 __ClangMinorVersion=0
771 __ClangMajorVersion=6
772 __ClangMinorVersion=0
776 __ClangMajorVersion=7
814 pgoinstrument|-pgoinstrument)
818 nopgooptimize|-nopgooptimize)
820 __SkipRestoreOptData=1
823 ibcinstrument|-ibcinstrument)
824 __IbcTuning="/Tuning"
827 configureonly|-configureonly)
833 skipconfigure|-skipconfigure)
837 skipnative|-skipnative)
838 # Use "skipnative" to use the same option name as build.cmd.
842 skipcoreclr|-skipcoreclr)
843 # Accept "skipcoreclr" for backwards-compatibility.
847 skipcrossarchnative|-skipcrossarchnative)
848 __SkipCrossArchNative=1
851 skipmanaged|-skipmanaged)
855 skipmscorlib|-skipmscorlib)
859 skipgenerateversion|-skipgenerateversion)
860 __SkipGenerateVersion=1
863 skiprestoreoptdata|-skiprestoreoptdata)
864 __SkipRestoreOptData=1
867 skipcrossgen|-skipcrossgen)
871 crossgenonly|-crossgenonly)
876 partialngen|-partialngen)
880 skiptests|-skiptests)
884 skipnuget|-skipnuget|skipbuildpackages|-skipbuildpackages)
888 ignorewarnings|-ignorewarnings)
890 __cmakeargs="$__cmakeargs -DCLR_CMAKE_WARNINGS_ARE_ERRORS=OFF"
893 cmakeargs|-cmakeargs)
895 __cmakeargs="$__cmakeargs $2"
898 echo "ERROR: 'cmakeargs' requires a non-empty option argument"
906 if [ ! -d $__RootBinDir ]; then
909 __RootBinParent=$(dirname $__RootBinDir)
910 __RootBinName=${__RootBinDir##*/}
911 __RootBinDir="$(cd $__RootBinParent &>/dev/null && printf %s/%s $PWD $__RootBinName)"
914 echo "ERROR: 'bindir' requires a non-empty option argument"
918 msbuildonunsupportedplatform|-msbuildonunsupportedplatform)
919 __msbuildonunsupportedplatform=1
926 echo "ERROR: 'numproc' requires a non-empty option argument"
935 echo "ERROR: 'osgroup' requires a non-empty option argument"
940 echo "ERROR: 'Rebuild' is not supported. Please remove it."
945 __SkipRestoreArg="/p:RestoreDuringBuild=false"
949 __SignTypeArg="/p:SignType=real"
953 __Id=$(echo $1| cut -d'=' -f 2)
954 __OfficialBuildIdArg="/p:OfficialBuildId=$__Id"
962 # Skip -Option=Value style argument passing
966 __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
973 __CommonMSBuildArgs="/p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__BuildOS=$__BuildOS /nodeReuse:false $__OfficialBuildIdArg $__SignTypeArg $__SkipRestoreArg"
975 # Configure environment if we are doing a verbose build
976 if [ $__VerboseBuild == 1 ]; then
978 __CommonMSBuildArgs="$__CommonMSBuildArgs /v:detailed"
981 # Set default clang version
982 if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then
983 if [[ "$__BuildArch" == "arm" || "$__BuildArch" == "armel" ]]; then
984 __ClangMajorVersion=5
985 __ClangMinorVersion=0
987 __ClangMajorVersion=3
988 __ClangMinorVersion=9
992 # Set dependent variables
993 __LogsDir="$__RootBinDir/Logs"
994 __MsbuildDebugLogsDir="$__LogsDir/MsbuildDebugLogs"
996 # Set the remaining variables based upon the determined build configuration
997 __BinDir="$__RootBinDir/Product/$__BuildOS.$__BuildArch.$__BuildType"
998 __PackagesBinDir="$__BinDir/.nuget"
999 export __IntermediatesDir="$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType"
1000 __isMSBuildOnNETCoreSupported=0
1001 __CrossComponentBinDir="$__BinDir"
1003 __CrossArch="$__HostArch"
1004 if [ $__CrossBuild == 1 ]; then
1005 __CrossComponentBinDir="$__CrossComponentBinDir/$__CrossArch"
1007 __CrossGenCoreLibLog="$__LogsDir/CrossgenCoreLib_$__BuildOS.$__BuildArch.$__BuildType.log"
1009 # Configure environment if we are doing a cross compile.
1010 if [ $__CrossBuild == 1 ]; then
1011 export CROSSCOMPILE=1
1012 if ! [[ -n "$ROOTFS_DIR" ]]; then
1013 export ROOTFS_DIR="$__ProjectRoot/cross/rootfs/$__BuildArch"
1017 # init the target distro name
1020 if [ $__PortableBuild == 0 ]; then
1021 __CommonMSBuildArgs="$__CommonMSBuildArgs /p:PortableBuild=false"
1024 # Init if MSBuild for .NET Core is supported for this platform
1025 isMSBuildOnNETCoreSupported
1027 # CI_SPECIFIC - On CI machines, $HOME may not be set. In such a case, create a subfolder and set the variable to set.
1028 # This is needed by CLI to function.
1029 if [ -z "$HOME" ]; then
1030 if [ ! -d "$__ProjectDir/temp_home" ]; then
1033 export HOME=$__ProjectDir/temp_home
1034 echo "HOME not defined; setting it to $HOME"
1037 # Specify path to be set for CMAKE_INSTALL_PREFIX.
1038 # This is where all built CoreClr libraries will copied to.
1039 export __CMakeBinDir="$__BinDir"
1041 # Make the directories necessary for build if they don't exist
1044 # Set up the directory for MSBuild debug logs.
1045 export MSBUILDDEBUGPATH="${__MsbuildDebugLogsDir}"
1050 # Restore the package containing profile counts for profile-guided optimizations
1053 # Generate event logging infrastructure sources
1054 generate_event_logging
1056 # Build the coreclr (native) components.
1057 __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument -DCLR_CMAKE_OPTDATA_VERSION=$__PgoOptDataVersion -DCLR_CMAKE_PGO_OPTIMIZE=$__PgoOptimize"
1059 # [TODO] Remove this when the `build-test.sh` script properly builds and deploys test assets.
1060 if [ $__SkipTests != 1 ]; then
1061 echo "Adding CMake flags to build native tests for $__BuildOS.$__BuildArch.$__BuildType"
1062 __ExtraCmakeArgs="$__ExtraCmakeArgs -DCLR_CMAKE_BUILD_TESTS=ON"
1065 build_native $__SkipCoreCLR "$__BuildArch" "$__IntermediatesDir" "$__ExtraCmakeArgs" "CoreCLR component"
1067 # Build cross-architecture components
1068 if [ $__SkipCrossArchNative != 1 ]; then
1069 if [[ $__CrossBuild == 1 ]]; then
1070 build_cross_architecture_components
1074 # Build System.Private.CoreLib.
1078 if [ $__CrossgenOnly == 1 ]; then
1079 build_CoreLib_ni "$__BinDir/crossgen"
1082 # Generate nuget packages
1083 if [ $__SkipNuget != 1 ]; then
1084 generate_NugetPackages
1090 echo "Repo successfully built."
1091 echo "Product binaries are available at $__BinDir"