Merge pull request #5039 from adityamandaleeka/sigterm_chaining
[platform/upstream/coreclr.git] / build.sh
1 #!/usr/bin/env bash
2
3 PYTHON=${PYTHON:-python}
4
5 usage()
6 {
7     echo "Usage: $0 [BuildArch] [BuildType] [clean] [verbose] [coverage] [cross] [clangx.y] [ninja] [configureonly] [skipconfigure] [skipnative] [skipmscorlib] [skiptests] [cmakeargs] [bindir]"
8     echo "BuildArch can be: x64, x86, arm, arm-softfp, arm64"
9     echo "BuildType can be: debug, checked, release"
10     echo "clean - optional argument to force a clean build."
11     echo "verbose - optional argument to enable verbose build output."
12     echo "coverage - optional argument to enable code coverage build (currently supported only for Linux and OSX)."
13     echo "ninja - target ninja instead of GNU make"
14     echo "clangx.y - optional argument to build using clang version x.y."
15     echo "cross - optional argument to signify cross compilation,"
16     echo "      - will use ROOTFS_DIR environment variable if set."
17     echo "configureonly - do not perform any builds; just configure the build."
18     echo "skipconfigure - skip build configuration."
19     echo "skipnative - do not build native components."
20     echo "skipmscorlib - do not build mscorlib.dll."
21     echo "skiptests - skip the tests in the 'tests' subdirectory."
22     echo "skiprestore - skip restoring nuget packages."
23     echo "skipnuget - skip building nuget packages."
24     echo "disableoss - Disable Open Source Signing for mscorlib."
25     echo "skipgenerateversion - disable version generation even if MSBuild is supported."
26     echo "cmakeargs - user-settable additional arguments passed to CMake."
27     echo "bindir - output directory (defaults to $__ProjectRoot/bin)"
28
29     exit 1
30 }
31
32 initDistroName()
33 {
34     if [ "$__BuildOS" == "Linux" ]; then
35         # Detect Distro
36         if [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then
37             export __DistroName=ubuntu
38         elif [ "$(cat /etc/*-release | grep -cim1 centos)" -eq 1 ]; then
39             export __DistroName=rhel
40         elif [ "$(cat /etc/*-release | grep -cim1 rhel)" -eq 1 ]; then
41             export __DistroName=rhel
42         elif [ "$(cat /etc/*-release | grep -cim1 debian)" -eq 1 ]; then
43             export __DistroName=debian
44         else
45             export __DistroName=""
46         fi
47     fi
48 }
49
50 setup_dirs()
51 {
52     echo Setting up directories for build
53
54     mkdir -p "$__RootBinDir"
55     mkdir -p "$__BinDir"
56     mkdir -p "$__LogsDir"
57     mkdir -p "$__IntermediatesDir"
58 }
59
60 # Performs "clean build" type actions (deleting and remaking directories)
61
62 clean()
63 {
64     echo Cleaning previous output for the selected configuration
65     rm -rf "$__BinDir"
66     rm -rf "$__IntermediatesDir"
67
68     rm -rf "$__TestWorkingDir"
69     rm -rf "$__TestIntermediatesDir"
70
71     rm -rf "$__LogsDir/*_$__BuildOS__$__BuildArch__$__BuildType.*"
72     rm -rf "$__ProjectRoot/Tools"
73 }
74
75 # Check the system to ensure the right prereqs are in place
76
77 check_prereqs()
78 {
79     echo "Checking prerequisites..."
80
81     # Check presence of CMake on the path
82     hash cmake 2>/dev/null || { echo >&2 "Please install cmake before running this script"; exit 1; }
83
84     # Check for clang
85     hash clang-$__ClangMajorVersion.$__ClangMinorVersion 2>/dev/null ||  hash clang$__ClangMajorVersion$__ClangMinorVersion 2>/dev/null ||  hash clang 2>/dev/null || { echo >&2 "Please install clang before running this script"; exit 1; }
86
87 }
88
89 build_coreclr()
90 {
91
92 # Event Logging Infrastructure
93    __GeneratedIntermediate="$__IntermediatesDir/Generated"
94    __GeneratedIntermediateEventProvider="$__GeneratedIntermediate/eventprovider_new"
95     if [[ -d "$__GeneratedIntermediateEventProvider" ]]; then
96         rm -rf  "$__GeneratedIntermediateEventProvider"
97     fi
98
99     if [[ ! -d "$__GeneratedIntermediate/eventprovider" ]]; then
100         mkdir -p "$__GeneratedIntermediate/eventprovider"
101     fi
102
103     mkdir -p "$__GeneratedIntermediateEventProvider"
104     if [[ $__SkipCoreCLR == 0 || $__ConfigureOnly == 1 ]]; then
105         echo "Laying out dynamically generated files consumed by the build system "
106         echo "Laying out dynamically generated Event Logging Test files"
107         $PYTHON -B -Wall -Werror "$__ProjectRoot/src/scripts/genXplatEventing.py" --man "$__ProjectRoot/src/vm/ClrEtwAll.man" --exc "$__ProjectRoot/src/vm/ClrEtwAllMeta.lst" --testdir "$__GeneratedIntermediateEventProvider/tests"
108
109         if  [[ $? != 0 ]]; then
110             exit
111         fi
112
113         #determine the logging system
114         case $__BuildOS in
115             Linux)
116                 echo "Laying out dynamically generated Event Logging Implementation of Lttng"
117                 $PYTHON -B -Wall -Werror "$__ProjectRoot/src/scripts/genXplatLttng.py" --man "$__ProjectRoot/src/vm/ClrEtwAll.man" --intermediate "$__GeneratedIntermediateEventProvider"
118                 if  [[ $? != 0 ]]; then
119                     exit
120                 fi
121                 ;;
122             *)
123                 ;;
124         esac
125     fi
126
127     echo "Cleaning the temp folder of dynamically generated Event Logging files"
128     $PYTHON -B -Wall -Werror -c "import sys;sys.path.insert(0,\"$__ProjectRoot/src/scripts\"); from Utilities import *;UpdateDirectory(\"$__GeneratedIntermediate/eventprovider\",\"$__GeneratedIntermediateEventProvider\")"
129     if  [[ $? != 0 ]]; then
130         exit
131     fi
132
133     rm -rf "$__GeneratedIntermediateEventProvider"
134
135     # All set to commence the build
136
137     echo "Commencing build of native components for $__BuildOS.$__BuildArch.$__BuildType in $__IntermediatesDir"
138
139     cd "$__IntermediatesDir"
140
141     generator=""
142     buildFile="Makefile"
143     buildTool="make"
144     if [ $__UseNinja == 1 ]; then
145         generator="ninja"
146         buildFile="build.ninja"
147         buildTool="ninja"
148     fi
149
150     if [ $__SkipConfigure == 0 ]; then
151         # if msbuild is not supported, then set __SkipGenerateVersion to 1
152         if [ $__isMSBuildOnNETCoreSupported == 0 ]; then __SkipGenerateVersion=1; fi
153         # Drop version.c file
154         __versionSourceFile=$__IntermediatesDir/version.cpp
155         if [ $__SkipGenerateVersion == 0 ]; then
156             "$__ProjectRoot/init-tools.sh" > "$__ProjectRoot/init-tools.log"
157             echo "Running: \"$__ProjectRoot/Tools/corerun\" \"$__ProjectRoot/Tools/MSBuild.exe\" \"$__ProjectRoot/build.proj\" /v:minimal /t:GenerateVersionSourceFile /p:NativeVersionSourceFile=$__versionSourceFile /p:GenerateVersionSourceFile=true /v:minimal $__OfficialBuildIdArg"
158             "$__ProjectRoot/Tools/corerun" "$__ProjectRoot/Tools/MSBuild.exe" "$__ProjectRoot/build.proj" /v:minimal /t:GenerateVersionSourceFile /p:NativeVersionSourceFile=$__versionSourceFile /p:GenerateVersionSourceFile=true /v:minimal $__OfficialBuildIdArg
159         else
160             __versionSourceLine="static char sccsid[] __attribute__((used)) = \"@(#)No version information produced\";"
161             echo $__versionSourceLine > $__versionSourceFile
162         fi
163         # Regenerate the CMake solution
164         echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion $__ClangMinorVersion $__BuildArch $__BuildType $__CodeCoverage $__IncludeTests $generator $__cmakeargs"
165         "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion $__ClangMinorVersion $__BuildArch $__BuildType $__CodeCoverage $__IncludeTests $generator "$__cmakeargs"
166     fi
167
168     if [ $__SkipCoreCLR == 1 ]; then
169         echo "Skipping CoreCLR build."
170         return
171     fi
172
173     # Check that the makefiles were created.
174
175     if [ ! -f "$__IntermediatesDir/$buildFile" ]; then
176         echo "Failed to generate native component build project!"
177         exit 1
178     fi
179
180     # Get the number of processors available to the scheduler
181     # Other techniques such as `nproc` only get the number of
182     # processors available to a single process.
183     if [ `uname` = "FreeBSD" ]; then
184         NumProc=`sysctl hw.ncpu | awk '{ print $2+1 }'`
185     elif [ `uname` = "NetBSD" ]; then
186         NumProc=$(($(getconf NPROCESSORS_ONLN)+1))
187     else
188         NumProc=$(($(getconf _NPROCESSORS_ONLN)+1))
189     fi
190
191     # Build CoreCLR
192
193     echo "Executing $buildTool install -j $NumProc $__UnprocessedBuildArgs"
194
195     $buildTool install -j $NumProc $__UnprocessedBuildArgs
196     if [ $? != 0 ]; then
197         echo "Failed to build coreclr components."
198         exit 1
199     fi
200 }
201
202 restoreBuildTools()
203 {
204     echo "Restoring BuildTools..."
205     $__ProjectRoot/init-tools.sh
206     if [ $? -ne 0 ]; then
207         echo "Failed to restore BuildTools."
208         exit 1
209     fi
210 }
211
212 isMSBuildOnNETCoreSupported()
213 {
214     # This needs to be updated alongwith corresponding changes to netci.groovy.
215     __isMSBuildOnNETCoreSupported=0
216
217     if [ "$__BuildArch" == "x64" ]; then
218         if [ "$__BuildOS" == "Linux" ]; then
219             if [ "$__DistroName" == "ubuntu" ]; then
220                 __OSVersion=$(lsb_release -rs)
221                 if [ "$__OSVersion" == "14.04" ]; then
222                     __isMSBuildOnNETCoreSupported=1
223                 elif [ "$(cat /etc/*-release | grep -cim1 14.04)" -eq 1 ]; then
224                     # Linux Mint based on Ubuntu 14.04
225                     __isMSBuildOnNETCoreSupported=1
226                 fi
227             elif [ "$__DistroName" == "rhel" ]; then
228                 __isMSBuildOnNETCoreSupported=1
229             elif [ "$__DistroName" == "debian" ]; then
230                 __isMSBuildOnNETCoreSupported=1
231             fi
232         elif [ "$__BuildOS" == "OSX" ]; then
233             __isMSBuildOnNETCoreSupported=1
234         fi
235     elif [ "$__BuildArch" == "arm" ] || [ "$__BuildArch" == "arm64" ] ; then
236         if [ "$__BuildOS" == "Linux" ]; then
237             if [ "$__DistroName" == "ubuntu" ]; then
238                 __isMSBuildOnNETCoreSupported=1
239             fi
240         fi
241
242     fi
243 }
244
245 build_CoreLib_ni()
246 {
247     if [ $__SkipCoreCLR == 0 -a -e $__BinDir/crossgen ]; then
248         echo "Generating native image for System.Private.CoreLib."
249         $__BinDir/crossgen $__BinDir/System.Private.CoreLib.dll
250         if [ $? -ne 0 ]; then
251             echo "Failed to generate native image for System.Private.CoreLib."
252             exit 1
253         fi
254
255         echo "Generating native image for MScorlib Facade."
256         $__BinDir/crossgen $__BinDir/mscorlib.dll
257         if [ $? -ne 0 ]; then
258             echo "Failed to generate native image for mscorlib facade."
259             exit 1
260         fi
261     fi
262 }
263
264 build_CoreLib()
265 {
266
267     if [ $__isMSBuildOnNETCoreSupported == 0 ]; then
268         echo "System.Private.CoreLib.dll build unsupported."
269         return
270     fi
271
272     if [ $__SkipMSCorLib == 1 ]; then
273        echo "Skipping building System.Private.CoreLib."
274        return
275     fi
276
277     # Restore buildTools
278
279     restoreBuildTools
280
281     echo "Commencing build of managed components for $__BuildOS.$__BuildArch.$__BuildType"
282
283     # Invoke MSBuild
284     $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/build.proj" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/System.Private.CoreLib_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:__RootBinDir=$__RootBinDir /p:BuildNugetPackage=false /p:UseSharedCompilation=false ${__SignTypeReal}
285
286     if [ $? -ne 0 ]; then
287         echo "Failed to build managed components."
288         exit 1
289     fi
290
291     # The cross build generates a crossgen with the target architecture.
292     if [ $__CrossBuild != 1 ]; then
293        # The architecture of host pc must be same architecture with target.
294        if [[ ( "$__HostArch" == "$__BuildArch" ) ]]; then
295            build_CoreLib_ni
296        elif [[ ( "$__HostArch" == "x64" ) && ( "$__BuildArch" == "x86" ) ]]; then
297            build_CoreLib_ni
298        elif [[ ( "$__HostArch" == "arm64" ) && ( "$__BuildArch" == "arm" ) ]]; then
299            build_CoreLib_ni
300        else 
301            exit 1
302        fi
303     fi 
304 }
305
306 generate_NugetPackages()
307 {
308     # We can only generate nuget package if we also support building mscorlib as part of this build.
309     if [ $__isMSBuildOnNETCoreSupported == 0 ]; then
310         echo "Nuget package generation unsupported."
311         return
312     fi
313
314     # Since we can build mscorlib for this OS, did we build the native components as well?
315     if [ $__SkipCoreCLR == 1 ]; then
316         echo "Unable to generate nuget packages since native components were not built."
317         return
318     fi
319
320     echo "Generating nuget packages for "$__BuildOS
321
322     if [ $__SkipMSCorLib == 1 ]; then
323         # Restore buildTools, since we skipped doing so with the mscorlib build.
324
325         restoreBuildTools
326
327        echo "Unable to generate Microsoft.NETCore.Runtime.CoreCLR nuget package since mscorlib was not built."
328     else
329         # Build the CoreCLR packages
330         $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/Microsoft.NETCore.Runtime.CoreCLR.builds" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:__RootBinDir=$__RootBinDir /p:BuildNugetPackage=false /p:UseSharedCompilation=false
331
332         if [ $? -ne 0 ]; then
333             echo "Failed to generate Nuget packages."
334             exit 1
335         fi
336     fi
337
338     # Build the JIT packages
339     $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/src/.nuget/Microsoft.NETCore.Jit/Microsoft.NETCore.Jit.builds" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:BuildNugetPackage=false /p:__RootBinDir=$__RootBinDir /p:UseSharedCompilation=false
340
341     if [ $? -ne 0 ]; then
342         echo "Failed to generate Nuget packages."
343         exit 1
344     fi
345 }
346
347 echo "Commencing CoreCLR Repo build"
348
349 # Argument types supported by this script:
350 #
351 # Build architecture - valid values are: x64, ARM.
352 # Build Type         - valid values are: Debug, Checked, Release
353 #
354 # Set the default arguments for build
355
356 # Obtain the location of the bash script to figure out where the root of the repo is.
357 __ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
358
359 # Use uname to determine what the CPU is.
360 CPUName=$(uname -p)
361 # Some Linux platforms report unknown for platform, but the arch for machine.
362 if [ $CPUName == "unknown" ]; then
363     CPUName=$(uname -m)
364 fi
365
366 case $CPUName in
367     i686)
368         echo "Unsupported CPU $CPUName detected, build might not succeed!"
369         __BuildArch=x86
370         __HostArch=x86
371         ;;
372
373     x86_64)
374         __BuildArch=x64
375         __HostArch=x64
376         ;;
377
378     armv7l)
379         echo "Unsupported CPU $CPUName detected, build might not succeed!"
380         __BuildArch=arm
381         __HostArch=arm
382         ;;
383
384     aarch64)
385         echo "Unsupported CPU $CPUName detected, build might not succeed!"
386         __BuildArch=arm64
387         __HostArch=arm64
388         ;;
389
390     *)
391         echo "Unknown CPU $CPUName detected, configuring as if for x64"
392         __BuildArch=x64
393         __HostArch=x64
394         ;;
395 esac
396
397 # Use uname to determine what the OS is.
398 OSName=$(uname -s)
399 case $OSName in
400     Linux)
401         __BuildOS=Linux
402         ;;
403
404     Darwin)
405         __BuildOS=OSX
406         ;;
407
408     FreeBSD)
409         __BuildOS=FreeBSD
410         ;;
411
412     OpenBSD)
413         __BuildOS=OpenBSD
414         ;;
415
416     NetBSD)
417         __BuildOS=NetBSD
418         ;;
419
420     SunOS)
421         __BuildOS=SunOS
422         ;;
423
424     *)
425         echo "Unsupported OS $OSName detected, configuring as if for Linux"
426         __BuildOS=Linux
427         ;;
428 esac
429
430 __BuildType=Debug
431 __CodeCoverage=
432 __IncludeTests=Include_Tests
433
434 # Set the various build properties here so that CMake and MSBuild can pick them up
435 __ProjectDir="$__ProjectRoot"
436 __SourceDir="$__ProjectDir/src"
437 __PackagesDir="$__ProjectDir/packages"
438 __RootBinDir="$__ProjectDir/bin"
439 __UnprocessedBuildArgs=
440 __MSBCleanBuildArgs=
441 __UseNinja=0
442 __ConfigureOnly=0
443 __SkipConfigure=0
444 __SkipRestore=""
445 __SkipNuget=0
446 __SkipCoreCLR=0
447 __SkipMSCorLib=0
448 __CleanBuild=0
449 __VerboseBuild=0
450 __SignTypeReal=""
451 __CrossBuild=0
452 __ClangMajorVersion=0
453 __ClangMinorVersion=0
454 __MSBuildPath=$__ProjectRoot/Tools/MSBuild.exe
455 __NuGetPath="$__PackagesDir/NuGet.exe"
456 __DistroName=""
457 __cmakeargs=""
458 __OfficialBuildIdArg=
459 __SkipGenerateVersion=0
460
461 while :; do
462     if [ $# -le 0 ]; then
463         break
464     fi
465
466     lowerI="$(echo $1 | awk '{print tolower($0)}')"
467     case $lowerI in
468         -\?|-h|--help)
469             usage
470             exit 1
471             ;;
472
473         x86)
474             __BuildArch=x86
475             ;;
476
477         x64)
478             __BuildArch=x64
479             ;;
480
481         arm)
482             __BuildArch=arm
483             ;;
484
485         arm-softfp)
486             __BuildArch=arm-softfp
487             ;;
488
489         arm64)
490             __BuildArch=arm64
491             ;;
492
493         debug)
494             __BuildType=Debug
495             ;;
496
497         checked)
498             __BuildType=Checked
499             ;;
500
501         release)
502             __BuildType=Release
503             ;;
504
505         coverage)
506             __CodeCoverage=Coverage
507             ;;
508
509         clean)
510             __CleanBuild=1
511             ;;
512
513         verbose)
514             __VerboseBuild=1
515             ;;
516
517         cross)
518             __CrossBuild=1
519             ;;
520
521         clang3.5)
522             __ClangMajorVersion=3
523             __ClangMinorVersion=5
524             ;;
525
526         clang3.6)
527             __ClangMajorVersion=3
528             __ClangMinorVersion=6
529             ;;
530
531         clang3.7)
532             __ClangMajorVersion=3
533             __ClangMinorVersion=7
534             ;;
535
536         clang3.8)
537             __ClangMajorVersion=3
538             __ClangMinorVersion=8
539             ;;
540
541         ninja)
542             __UseNinja=1
543             ;;
544
545         configureonly)
546             __ConfigureOnly=1
547             __SkipCoreCLR=1
548             __SkipMSCorLib=1
549             __IncludeTests=
550             ;;
551
552         skipconfigure)
553             __SkipConfigure=1
554             ;;
555
556         skipnative)
557             # Use "skipnative" to use the same option name as build.cmd.
558             __SkipCoreCLR=1
559             ;;
560
561         skipcoreclr)
562             # Accept "skipcoreclr" for backwards-compatibility.
563             __SkipCoreCLR=1
564             ;;
565
566         skipmscorlib)
567             __SkipMSCorLib=1
568             ;;
569
570         skipgenerateversion)
571             __SkipGenerateVersion=1
572             ;;
573
574         includetests)
575             ;;
576
577         skiptests)
578             __IncludeTests=
579             ;;
580
581         skiprestore)
582             __SkipRestore="/p:RestoreDuringBuild=true"
583             ;;
584
585         skipnuget)
586             __SkipNuget=1
587             ;;
588
589         disableoss)
590             __SignTypeReal="/p:SignType=real"
591             ;;
592
593         cmakeargs)
594             if [ -n "$2" ]; then
595                 __cmakeargs="$2"
596                 shift
597             else
598                 echo "ERROR: 'cmakeargs' requires a non-empty option argument"
599                 exit 1
600             fi
601             ;;
602
603         bindir)
604             if [ -n "$2" ]; then
605                 __RootBinDir="$2"
606                 if [ ! -d $__RootBinDir ]; then
607                     mkdir $__RootBinDir
608                 fi
609                 __RootBinParent=$(dirname $__RootBinDir)
610                 __RootBinName=${__RootBinDir##*/}
611                 __RootBinDir="$(cd $__RootBinParent &>/dev/null && printf %s/%s $PWD $__RootBinName)"
612                 shift
613             else
614                 echo "ERROR: 'bindir' requires a non-empty option argument"
615                 exit 1
616             fi
617             ;;
618
619         *)
620             if [[ $1 == "/p:OfficialBuildId="* ]]; then
621                 __OfficialBuildIdArg=$1
622             else
623                 __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
624             fi
625             ;;
626     esac
627
628     shift
629 done
630
631 # Set default clang version
632 if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then
633     if [ $__CrossBuild == 1 ]; then
634         __ClangMajorVersion=3
635         __ClangMinorVersion=6
636     else
637         __ClangMajorVersion=3
638         __ClangMinorVersion=5
639     fi
640 fi
641
642 # Set dependent variables
643 __LogsDir="$__RootBinDir/Logs"
644
645 if [[ $__ConfigureOnly == 1 && $__SkipConfigure == 1 ]]; then
646     echo "configureonly and skipconfigure are mutually exclusive!"
647     exit 1
648 fi
649
650 # init the distro name
651 initDistroName
652
653 # Set the remaining variables based upon the determined build configuration
654 __BinDir="$__RootBinDir/Product/$__BuildOS.$__BuildArch.$__BuildType"
655 __PackagesBinDir="$__BinDir/.nuget"
656 __ToolsDir="$__RootBinDir/tools"
657 __TestWorkingDir="$__RootBinDir/tests/$__BuildOS.$__BuildArch.$__BuildType"
658 export __IntermediatesDir="$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType"
659 __TestIntermediatesDir="$__RootBinDir/tests/obj/$__BuildOS.$__BuildArch.$__BuildType"
660 __isMSBuildOnNETCoreSupported=0
661
662 # Init if MSBuild for .NET Core is supported for this platform
663 isMSBuildOnNETCoreSupported
664
665 # CI_SPECIFIC - On CI machines, $HOME may not be set. In such a case, create a subfolder and set the variable to set.
666 # This is needed by CLI to function.
667 if [ -z "$HOME" ]; then
668     if [ ! -d "$__ProjectDir/temp_home" ]; then
669         mkdir temp_home
670     fi
671     export HOME=$__ProjectDir/temp_home
672     echo "HOME not defined; setting it to $HOME"
673 fi
674
675 # Specify path to be set for CMAKE_INSTALL_PREFIX.
676 # This is where all built CoreClr libraries will copied to.
677 export __CMakeBinDir="$__BinDir"
678
679 # Configure environment if we are doing a clean build.
680 if [ $__CleanBuild == 1 ]; then
681     clean
682 fi
683
684 # Configure environment if we are doing a verbose build
685 if [ $__VerboseBuild == 1 ]; then
686     export VERBOSE=1
687 fi
688
689 # Configure environment if we are doing a cross compile.
690 if [ $__CrossBuild == 1 ]; then
691     export CROSSCOMPILE=1
692     if ! [[ -n "$ROOTFS_DIR" ]]; then
693         export ROOTFS_DIR="$__ProjectRoot/cross/rootfs/$__BuildArch"
694     fi
695 fi
696
697 # Make the directories necessary for build if they don't exist
698
699 setup_dirs
700
701 # Check prereqs.
702
703 check_prereqs
704
705 # Build the coreclr (native) components.
706
707 build_coreclr
708
709 # Build System.Private.CoreLib.
710
711 build_CoreLib
712
713 # Generate nuget packages
714 if [ $__SkipNuget != 1 ]; then
715     generate_NugetPackages
716 fi
717
718
719 # Build complete
720
721 echo "Repo successfully built."
722 echo "Product binaries are available at $__BinDir"
723 exit 0