Merge pull request #5167 from dotnet-bot/from-tfs
[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-$__ClangMajorVersion.$__ClangMinorVersion before running this script"; exit 1; }
86
87 }
88
89 build_coreclr()
90 {
91
92     if [ $__SkipCoreCLR == 1 ]; then
93         echo "Skipping CoreCLR build."
94         return
95     fi
96
97 # Event Logging Infrastructure
98    __GeneratedIntermediate="$__IntermediatesDir/Generated"
99    __GeneratedIntermediateEventProvider="$__GeneratedIntermediate/eventprovider_new"
100     if [[ -d "$__GeneratedIntermediateEventProvider" ]]; then
101         rm -rf  "$__GeneratedIntermediateEventProvider"
102     fi
103
104     if [[ ! -d "$__GeneratedIntermediate/eventprovider" ]]; then
105         mkdir -p "$__GeneratedIntermediate/eventprovider"
106     fi
107
108     mkdir -p "$__GeneratedIntermediateEventProvider"
109     if [[ $__SkipCoreCLR == 0 || $__ConfigureOnly == 1 ]]; then
110         echo "Laying out dynamically generated files consumed by the build system "
111         echo "Laying out dynamically generated Event Logging Test files"
112         $PYTHON -B -Wall -Werror "$__ProjectRoot/src/scripts/genXplatEventing.py" --man "$__ProjectRoot/src/vm/ClrEtwAll.man" --exc "$__ProjectRoot/src/vm/ClrEtwAllMeta.lst" --testdir "$__GeneratedIntermediateEventProvider/tests"
113
114         if  [[ $? != 0 ]]; then
115             exit
116         fi
117
118         #determine the logging system
119         case $__BuildOS in
120             Linux)
121                 echo "Laying out dynamically generated Event Logging Implementation of Lttng"
122                 $PYTHON -B -Wall -Werror "$__ProjectRoot/src/scripts/genXplatLttng.py" --man "$__ProjectRoot/src/vm/ClrEtwAll.man" --intermediate "$__GeneratedIntermediateEventProvider"
123                 if  [[ $? != 0 ]]; then
124                     exit
125                 fi
126                 ;;
127             *)
128                 ;;
129         esac
130     fi
131
132     echo "Cleaning the temp folder of dynamically generated Event Logging files"
133     $PYTHON -B -Wall -Werror -c "import sys;sys.path.insert(0,\"$__ProjectRoot/src/scripts\"); from Utilities import *;UpdateDirectory(\"$__GeneratedIntermediate/eventprovider\",\"$__GeneratedIntermediateEventProvider\")"
134     if  [[ $? != 0 ]]; then
135         exit
136     fi
137
138     rm -rf "$__GeneratedIntermediateEventProvider"
139
140     # All set to commence the build
141
142     echo "Commencing build of native components for $__BuildOS.$__BuildArch.$__BuildType in $__IntermediatesDir"
143
144     cd "$__IntermediatesDir"
145
146     generator=""
147     buildFile="Makefile"
148     buildTool="make"
149     if [ $__UseNinja == 1 ]; then
150         generator="ninja"
151         buildFile="build.ninja"
152         buildTool="ninja"
153     fi
154
155     if [ $__SkipConfigure == 0 ]; then
156         # if msbuild is not supported, then set __SkipGenerateVersion to 1
157         if [ $__isMSBuildOnNETCoreSupported == 0 ]; then __SkipGenerateVersion=1; fi
158         # Drop version.c file
159         __versionSourceFile=$__IntermediatesDir/version.cpp
160         if [ $__SkipGenerateVersion == 0 ]; then
161             "$__ProjectRoot/init-tools.sh" > "$__ProjectRoot/init-tools.log"
162             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"
163             "$__ProjectRoot/Tools/corerun" "$__ProjectRoot/Tools/MSBuild.exe" "$__ProjectRoot/build.proj" /v:minimal /t:GenerateVersionSourceFile /p:NativeVersionSourceFile=$__versionSourceFile /p:GenerateVersionSourceFile=true /v:minimal $__OfficialBuildIdArg
164         else
165             __versionSourceLine="static char sccsid[] __attribute__((used)) = \"@(#)No version information produced\";"
166             echo $__versionSourceLine > $__versionSourceFile
167         fi
168         # Regenerate the CMake solution
169         echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion $__ClangMinorVersion $__BuildArch $__BuildType $__CodeCoverage $__IncludeTests $generator $__cmakeargs"
170         "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion $__ClangMinorVersion $__BuildArch $__BuildType $__CodeCoverage $__IncludeTests $generator "$__cmakeargs"
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
262         if [ "$__BuildOS" == "Linux" ]; then
263             echo "Generating symbol file for System.Private.CoreLib."
264             $__BinDir/crossgen /CreatePerfMap $__BinDir $__BinDir/System.Private.CoreLib.ni.dll
265             if [ $? -ne 0 ]; then
266                 echo "Failed to generate symbol file for System.Private.CoreLib."
267                 exit 1
268             fi
269         fi
270     fi
271 }
272
273 build_CoreLib()
274 {
275
276     if [ $__isMSBuildOnNETCoreSupported == 0 ]; then
277         echo "System.Private.CoreLib.dll build unsupported."
278         return
279     fi
280
281     if [ $__SkipMSCorLib == 1 ]; then
282        echo "Skipping building System.Private.CoreLib."
283        return
284     fi
285
286     # Restore buildTools
287
288     restoreBuildTools
289
290     echo "Commencing build of managed components for $__BuildOS.$__BuildArch.$__BuildType"
291
292     # Invoke MSBuild
293     $__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}
294
295     if [ $? -ne 0 ]; then
296         echo "Failed to build managed components."
297         exit 1
298     fi
299
300     # The cross build generates a crossgen with the target architecture.
301     if [ $__CrossBuild != 1 ]; then
302        # The architecture of host pc must be same architecture with target.
303        if [[ ( "$__HostArch" == "$__BuildArch" ) ]]; then
304            build_CoreLib_ni
305        elif [[ ( "$__HostArch" == "x64" ) && ( "$__BuildArch" == "x86" ) ]]; then
306            build_CoreLib_ni
307        elif [[ ( "$__HostArch" == "arm64" ) && ( "$__BuildArch" == "arm" ) ]]; then
308            build_CoreLib_ni
309        else 
310            exit 1
311        fi
312     fi 
313 }
314
315 generate_NugetPackages()
316 {
317     # We can only generate nuget package if we also support building mscorlib as part of this build.
318     if [ $__isMSBuildOnNETCoreSupported == 0 ]; then
319         echo "Nuget package generation unsupported."
320         return
321     fi
322
323     # Since we can build mscorlib for this OS, did we build the native components as well?
324     if [ $__SkipCoreCLR == 1 ]; then
325         echo "Unable to generate nuget packages since native components were not built."
326         return
327     fi
328
329     echo "Generating nuget packages for "$__BuildOS
330
331     if [ $__SkipMSCorLib == 1 ]; then
332         # Restore buildTools, since we skipped doing so with the mscorlib build.
333
334         restoreBuildTools
335
336        echo "Unable to generate Microsoft.NETCore.Runtime.CoreCLR nuget package since mscorlib was not built."
337     else
338         # Build the CoreCLR packages
339         $__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
340
341         if [ $? -ne 0 ]; then
342             echo "Failed to generate Nuget packages."
343             exit 1
344         fi
345     fi
346
347     # Build the JIT packages
348     $__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
349
350     if [ $? -ne 0 ]; then
351         echo "Failed to generate Nuget packages."
352         exit 1
353     fi
354 }
355
356 echo "Commencing CoreCLR Repo build"
357
358 # Argument types supported by this script:
359 #
360 # Build architecture - valid values are: x64, ARM.
361 # Build Type         - valid values are: Debug, Checked, Release
362 #
363 # Set the default arguments for build
364
365 # Obtain the location of the bash script to figure out where the root of the repo is.
366 __ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
367
368 # Use uname to determine what the CPU is.
369 CPUName=$(uname -p)
370 # Some Linux platforms report unknown for platform, but the arch for machine.
371 if [ $CPUName == "unknown" ]; then
372     CPUName=$(uname -m)
373 fi
374
375 case $CPUName in
376     i686)
377         echo "Unsupported CPU $CPUName detected, build might not succeed!"
378         __BuildArch=x86
379         __HostArch=x86
380         ;;
381
382     x86_64)
383         __BuildArch=x64
384         __HostArch=x64
385         ;;
386
387     armv7l)
388         echo "Unsupported CPU $CPUName detected, build might not succeed!"
389         __BuildArch=arm
390         __HostArch=arm
391         ;;
392
393     aarch64)
394         echo "Unsupported CPU $CPUName detected, build might not succeed!"
395         __BuildArch=arm64
396         __HostArch=arm64
397         ;;
398
399     *)
400         echo "Unknown CPU $CPUName detected, configuring as if for x64"
401         __BuildArch=x64
402         __HostArch=x64
403         ;;
404 esac
405
406 # Use uname to determine what the OS is.
407 OSName=$(uname -s)
408 case $OSName in
409     Linux)
410         __BuildOS=Linux
411         ;;
412
413     Darwin)
414         __BuildOS=OSX
415         ;;
416
417     FreeBSD)
418         __BuildOS=FreeBSD
419         ;;
420
421     OpenBSD)
422         __BuildOS=OpenBSD
423         ;;
424
425     NetBSD)
426         __BuildOS=NetBSD
427         ;;
428
429     SunOS)
430         __BuildOS=SunOS
431         ;;
432
433     *)
434         echo "Unsupported OS $OSName detected, configuring as if for Linux"
435         __BuildOS=Linux
436         ;;
437 esac
438
439 __BuildType=Debug
440 __CodeCoverage=
441 __IncludeTests=Include_Tests
442
443 # Set the various build properties here so that CMake and MSBuild can pick them up
444 __ProjectDir="$__ProjectRoot"
445 __SourceDir="$__ProjectDir/src"
446 __PackagesDir="$__ProjectDir/packages"
447 __RootBinDir="$__ProjectDir/bin"
448 __UnprocessedBuildArgs=
449 __MSBCleanBuildArgs=
450 __UseNinja=0
451 __ConfigureOnly=0
452 __SkipConfigure=0
453 __SkipRestore=""
454 __SkipNuget=0
455 __SkipCoreCLR=0
456 __SkipMSCorLib=0
457 __CleanBuild=0
458 __VerboseBuild=0
459 __SignTypeReal=""
460 __CrossBuild=0
461 __ClangMajorVersion=0
462 __ClangMinorVersion=0
463 __MSBuildPath=$__ProjectRoot/Tools/MSBuild.exe
464 __NuGetPath="$__PackagesDir/NuGet.exe"
465 __DistroName=""
466 __cmakeargs=""
467 __OfficialBuildIdArg=
468 __SkipGenerateVersion=0
469
470 while :; do
471     if [ $# -le 0 ]; then
472         break
473     fi
474
475     lowerI="$(echo $1 | awk '{print tolower($0)}')"
476     case $lowerI in
477         -\?|-h|--help)
478             usage
479             exit 1
480             ;;
481
482         x86)
483             __BuildArch=x86
484             ;;
485
486         x64)
487             __BuildArch=x64
488             ;;
489
490         arm)
491             __BuildArch=arm
492             ;;
493
494         arm-softfp)
495             __BuildArch=arm-softfp
496             ;;
497
498         arm64)
499             __BuildArch=arm64
500             ;;
501
502         debug)
503             __BuildType=Debug
504             ;;
505
506         checked)
507             __BuildType=Checked
508             ;;
509
510         release)
511             __BuildType=Release
512             ;;
513
514         coverage)
515             __CodeCoverage=Coverage
516             ;;
517
518         clean)
519             __CleanBuild=1
520             ;;
521
522         verbose)
523             __VerboseBuild=1
524             ;;
525
526         cross)
527             __CrossBuild=1
528             ;;
529
530         clang3.5)
531             __ClangMajorVersion=3
532             __ClangMinorVersion=5
533             ;;
534
535         clang3.6)
536             __ClangMajorVersion=3
537             __ClangMinorVersion=6
538             ;;
539
540         clang3.7)
541             __ClangMajorVersion=3
542             __ClangMinorVersion=7
543             ;;
544
545         clang3.8)
546             __ClangMajorVersion=3
547             __ClangMinorVersion=8
548             ;;
549
550         ninja)
551             __UseNinja=1
552             ;;
553
554         configureonly)
555             __ConfigureOnly=1
556             __SkipCoreCLR=1
557             __SkipMSCorLib=1
558             __IncludeTests=
559             ;;
560
561         skipconfigure)
562             __SkipConfigure=1
563             ;;
564
565         skipnative)
566             # Use "skipnative" to use the same option name as build.cmd.
567             __SkipCoreCLR=1
568             ;;
569
570         skipcoreclr)
571             # Accept "skipcoreclr" for backwards-compatibility.
572             __SkipCoreCLR=1
573             ;;
574
575         skipmscorlib)
576             __SkipMSCorLib=1
577             ;;
578
579         skipgenerateversion)
580             __SkipGenerateVersion=1
581             ;;
582
583         includetests)
584             ;;
585
586         skiptests)
587             __IncludeTests=
588             ;;
589
590         skiprestore)
591             __SkipRestore="/p:RestoreDuringBuild=true"
592             ;;
593
594         skipnuget)
595             __SkipNuget=1
596             ;;
597
598         disableoss)
599             __SignTypeReal="/p:SignType=real"
600             ;;
601
602         cmakeargs)
603             if [ -n "$2" ]; then
604                 __cmakeargs="$2"
605                 shift
606             else
607                 echo "ERROR: 'cmakeargs' requires a non-empty option argument"
608                 exit 1
609             fi
610             ;;
611
612         bindir)
613             if [ -n "$2" ]; then
614                 __RootBinDir="$2"
615                 if [ ! -d $__RootBinDir ]; then
616                     mkdir $__RootBinDir
617                 fi
618                 __RootBinParent=$(dirname $__RootBinDir)
619                 __RootBinName=${__RootBinDir##*/}
620                 __RootBinDir="$(cd $__RootBinParent &>/dev/null && printf %s/%s $PWD $__RootBinName)"
621                 shift
622             else
623                 echo "ERROR: 'bindir' requires a non-empty option argument"
624                 exit 1
625             fi
626             ;;
627
628         *)
629             if [[ $1 == "/p:OfficialBuildId="* ]]; then
630                 __OfficialBuildIdArg=$1
631             else
632                 __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
633             fi
634             ;;
635     esac
636
637     shift
638 done
639
640 # Set default clang version
641 if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then
642     if [ $__CrossBuild == 1 ]; then
643         __ClangMajorVersion=3
644         __ClangMinorVersion=6
645     else
646         __ClangMajorVersion=3
647         __ClangMinorVersion=5
648     fi
649 fi
650
651 # Set dependent variables
652 __LogsDir="$__RootBinDir/Logs"
653
654 if [[ $__ConfigureOnly == 1 && $__SkipConfigure == 1 ]]; then
655     echo "configureonly and skipconfigure are mutually exclusive!"
656     exit 1
657 fi
658
659 # init the distro name
660 initDistroName
661
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 __TestWorkingDir="$__RootBinDir/tests/$__BuildOS.$__BuildArch.$__BuildType"
667 export __IntermediatesDir="$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType"
668 __TestIntermediatesDir="$__RootBinDir/tests/obj/$__BuildOS.$__BuildArch.$__BuildType"
669 __isMSBuildOnNETCoreSupported=0
670
671 # Init if MSBuild for .NET Core is supported for this platform
672 isMSBuildOnNETCoreSupported
673
674 # CI_SPECIFIC - On CI machines, $HOME may not be set. In such a case, create a subfolder and set the variable to set.
675 # This is needed by CLI to function.
676 if [ -z "$HOME" ]; then
677     if [ ! -d "$__ProjectDir/temp_home" ]; then
678         mkdir temp_home
679     fi
680     export HOME=$__ProjectDir/temp_home
681     echo "HOME not defined; setting it to $HOME"
682 fi
683
684 # Specify path to be set for CMAKE_INSTALL_PREFIX.
685 # This is where all built CoreClr libraries will copied to.
686 export __CMakeBinDir="$__BinDir"
687
688 # Configure environment if we are doing a clean build.
689 if [ $__CleanBuild == 1 ]; then
690     clean
691 fi
692
693 # Configure environment if we are doing a verbose build
694 if [ $__VerboseBuild == 1 ]; then
695     export VERBOSE=1
696 fi
697
698 # Configure environment if we are doing a cross compile.
699 if [ $__CrossBuild == 1 ]; then
700     export CROSSCOMPILE=1
701     if ! [[ -n "$ROOTFS_DIR" ]]; then
702         export ROOTFS_DIR="$__ProjectRoot/cross/rootfs/$__BuildArch"
703     fi
704 fi
705
706 # Make the directories necessary for build if they don't exist
707
708 setup_dirs
709
710 # Check prereqs.
711
712 check_prereqs
713
714 # Build the coreclr (native) components.
715
716 build_coreclr
717
718 # Build System.Private.CoreLib.
719
720 build_CoreLib
721
722 # Generate nuget packages
723 if [ $__SkipNuget != 1 ]; then
724     generate_NugetPackages
725 fi
726
727
728 # Build complete
729
730 echo "Repo successfully built."
731 echo "Product binaries are available at $__BinDir"
732 exit 0