Merge pull request #10269 from BruceForstall/FixBuildAll
[platform/upstream/coreclr.git] / build.cmd
1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
3
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
6
7 :: Default to highest Visual Studio version available
8 ::
9 :: For VS2015 (and prior), only a single instance is allowed to be installed on a box
10 :: and VS140COMNTOOLS is set as a global environment variable by the installer. This
11 :: allows users to locate where the instance of VS2015 is installed.
12 ::
13 :: For VS2017, multiple instances can be installed on the same box SxS and VS150COMNTOOLS
14 :: is no longer set as a global environment variable and is instead only set if the user
15 :: has launched the VS2017 Developer Command Prompt.
16 ::
17 :: Following this logic, we will default to the VS2017 toolset if VS150COMNTOOLS tools is
18 :: set, as this indicates the user is running from the VS2017 Developer Command Prompt and
19 :: is already configured to use that toolset. Otherwise, we will fallback to using the VS2015
20 :: toolset if it is installed. Finally, we will fail the script if no supported VS instance
21 :: can be found.
22 if defined VS150COMNTOOLS (
23   set "__VSToolsRoot=%VS150COMNTOOLS%"
24   set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
25   set __VSVersion=vs2017
26 ) else (
27   set "__VSToolsRoot=%VS140COMNTOOLS%"
28   set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
29   set __VSVersion=vs2015
30 )
31
32 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
33 ::      __BuildArch         -- default: x64
34 ::      __BuildType         -- default: Debug
35 ::      __BuildOS           -- default: Windows_NT
36 ::      __ProjectDir        -- default: directory of the dir.props file
37 ::      __SourceDir         -- default: %__ProjectDir%\src\
38 ::      __PackagesDir       -- default: %__ProjectDir%\packages\
39 ::      __RootBinDir        -- default: %__ProjectDir%\bin\
40 ::      __BinDir            -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
41 ::      __IntermediatesDir
42 ::      __PackagesBinDir    -- default: %__BinDir%\.nuget
43 ::      __TestWorkingDir    -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
44 ::
45 :: Thus, these variables are not simply internal to this script!
46
47 :: Set the default arguments for build
48 set __BuildArch=x64
49 set __BuildType=Debug
50 set __BuildOS=Windows_NT
51
52 :: Define a prefix for most output progress messages that come from this script. That makes
53 :: it easier to see where these are coming from. Note that there is a trailing space here.
54 set "__MsgPrefix=BUILD: "
55
56 :: Set the various build properties here so that CMake and MSBuild can pick them up
57 set "__ProjectDir=%~dp0"
58 :: remove trailing slash
59 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
60 set "__ProjectFilesDir=%__ProjectDir%"
61 set "__SourceDir=%__ProjectDir%\src"
62 set "__PackagesDir=%__ProjectDir%\packages"
63 set "__RootBinDir=%__ProjectDir%\bin"
64 set "__LogsDir=%__RootBinDir%\Logs"
65 set "__PgoOptDataVersion="
66 set "__IbcOptDataVersion="
67
68 set __BuildAll=
69
70 set __BuildArchX64=0
71 set __BuildArchX86=0
72 set __BuildArchArm=0
73 set __BuildArchArm64=0
74
75 set __BuildTypeDebug=0
76 set __BuildTypeChecked=0
77 set __BuildTypeRelease=0
78 set __BuildJit32="-DBUILD_JIT32=0"
79 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
80
81 set __PgoInstrument=0
82 set __IbcTuning=
83
84 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
85 REM when using "all".
86 set __PassThroughArgs=
87
88 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
89 set "__args= %*"
90 set processedArgs=
91 set __UnprocessedBuildArgs=
92 set __RunArgs=
93
94 set __BuildCoreLib=1
95 set __BuildNative=1
96 set __BuildTests=1
97 set __BuildPackages=1
98 set __BuildNativeCoreLib=1
99 set __RestoreOptData=1
100
101 :Arg_Loop
102 if "%1" == "" goto ArgsDone
103
104 if /i "%1" == "-?"    goto Usage
105 if /i "%1" == "-h"    goto Usage
106 if /i "%1" == "-help" goto Usage
107
108 if /i "%1" == "all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
109 if /i "%1" == "x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
111 if /i "%1" == "arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
112 if /i "%1" == "arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113
114 if /i "%1" == "debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116 if /i "%1" == "release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
117
118 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
119 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
120 if [!__PassThroughArgs!]==[] (
121     set __PassThroughArgs=%1
122 ) else (
123     set __PassThroughArgs=%__PassThroughArgs% %1
124 )
125
126 if /i "%1" == "freebsdmscorlib"     (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if /i "%1" == "linuxmscorlib"       (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "netbsdmscorlib"      (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "osxmscorlib"         (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "windowsmscorlib"     (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "nativemscorlib"      (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "configureonly"       (set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "skipconfigure"       (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "skipmscorlib"        (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "skipnative"          (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "skiptests"           (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "skiprestoreoptdata"  (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "usenmakemakefiles"   (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "buildjit32"          (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "pgoinstrument"       (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "toolset_dir"         (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
144 if /i "%1" == "compatjitcrossgen"   (set __CompatJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "buildstandalonegc"   (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146
147 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
148 if /i "%1" == "altjitcrossgen"      (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
149
150 if [!processedArgs!]==[] (
151   call set __UnprocessedBuildArgs=!__args!
152 ) else (
153   call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
154 )
155
156 :ArgsDone
157
158 if defined __BuildAll goto BuildAll
159
160 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
161 if %__TotalSpecifiedBuildArch% GTR 1 (
162     echo Error: more than one build architecture specified, but "all" not specified.
163     goto Usage
164 )
165
166 if %__BuildArchX64%==1      set __BuildArch=x64
167 if %__BuildArchX86%==1      set __BuildArch=x86
168 if %__BuildArchArm%==1 (
169     set __BuildArch=arm
170     set __CrossArch=x86
171 )
172 if %__BuildArchArm64%==1 (
173     set __BuildArch=arm64
174     set __CrossArch=x64
175 )
176
177 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
178 if %__TotalSpecifiedBuildType% GTR 1 (
179     echo Error: more than one build type specified, but "all" not specified.
180     goto Usage
181 )
182
183 if %__BuildTypeDebug%==1    set __BuildType=Debug
184 if %__BuildTypeChecked%==1  set __BuildType=Checked
185 if %__BuildTypeRelease%==1  set __BuildType=Release
186
187 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
188
189 :: Set the remaining variables based upon the determined build configuration
190 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
191 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
192 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
193 set "__PackagesBinDir=%__BinDir%\.nuget"
194 set "__TestRootDir=%__RootBinDir%\tests"
195 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
196 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
197 set "__CrossComponentBinDir=%__BinDir%"
198 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
199
200 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
201 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
202 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
203
204 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
205 set "__CMakeBinDir=%__BinDir%"
206 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
207
208 if not exist "%__BinDir%"           md "%__BinDir%"
209 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
210 if not exist "%__LogsDir%"          md "%__LogsDir%"
211
212 REM It is convinient to have your Nuget search path include the location where the build
213 REM will plass packages.  However nuget used during the build will fail if that directory 
214 REM does not exist.   Avoid this in at least one case by agressively creating the directory. 
215 if not exist "%__BinDir%\.nuget\pkg"           md "%__BinDir%\.nuget\pkg"
216
217 echo %__MsgPrefix%Commencing CoreCLR Repo build
218
219 :: Set the remaining variables based upon the determined build configuration
220
221 echo %__MsgPrefix%Checking prerequisites
222 :: Eval the output from probe-win1.ps1
223 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
224
225 REM =========================================================================================
226 REM ===
227 REM === Start the build steps
228 REM ===
229 REM =========================================================================================
230
231 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
232 call                                 "%__VSToolsRoot%\VsDevCmd.bat"
233
234 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs% 
235
236 REM =========================================================================================
237 REM ===
238 REM === Restore optimization profile data
239 REM ===
240 REM =========================================================================================
241
242 REM Parse the package version out of project.json so that we can pass it on to CMake
243 where /q python || (
244     echo %__MsgPrefix%Error: Python not found on PATH, please make sure that it is installed.
245     exit /b 1
246 )
247 set OptDataProjectJsonPath=%__ProjectDir%\src\.nuget\optdata\project.json
248 if EXIST "%OptDataProjectJsonPath%" (
249     for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.PGO.CoreCLR') do @(
250         set __PgoOptDataVersion=%%s
251     )
252     for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.IBC.CoreCLR') do @(
253         set __IbcOptDataVersion=%%s
254     )
255 )
256
257 if %__RestoreOptData% EQU 1 (
258     echo %__MsgPrefix%Restoring the OptimizationData Package
259     @call %__ProjectDir%\run.cmd sync -optdata
260     if not !errorlevel! == 0 (
261         echo %__MsgPrefix%Error: Failed to restore the optimization data package.
262         exit /b 1
263     )
264 )
265
266 REM =========================================================================================
267 REM ===
268 REM === Build the CLR VM
269 REM ===
270 REM =========================================================================================
271
272 if %__BuildNative% EQU 1 ( 
273     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
274
275         set nativePlatfromArgs=-platform=%__BuildArch%
276     if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
277
278     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
279     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
280     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
281
282     if /i "%__BuildArch%" == "arm64" ( 
283         rem arm64 builds currently use private toolset which has not been released yet
284         REM TODO, remove once the toolset is open.
285         call :PrivateToolSet
286         goto GenVSSolution
287     )
288
289     :: Set the environment for the native build
290     set __VCBuildArch=x86_amd64
291     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
292     if /i "%__BuildArch%" == "arm" (
293         set __VCBuildArch=x86_arm
294         
295         REM Make CMake pick the highest installed version in the 10.0.* range
296         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
297     )
298
299     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
300     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
301         @if defined _echo @echo on
302
303     if not defined VSINSTALLDIR (
304         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
305         exit /b 1
306     )
307     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
308
309 :GenVSSolution
310     if defined __SkipConfigure goto SkipConfigure
311
312     echo %__MsgPrefix%Regenerating the Visual Studio solution
313
314     pushd "%__IntermediatesDir%"
315     set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%"
316     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32% %__BuildStandaloneGC% !__ExtraCmakeArgs!
317         @if defined _echo @echo on
318     popd
319 :SkipConfigure
320     if defined __ConfigureOnly goto SkipNativeBuild
321
322     if not exist "%__IntermediatesDir%\install.vcxproj" (
323         echo %__MsgPrefix%Error: failed to generate native component build project!
324         exit /b 1
325     )
326
327     @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
328
329     if not !errorlevel! == 0 (
330         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
331         echo     "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
332         echo     "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
333         echo     "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
334         exit /b 1
335     )   
336 )
337 :SkipNativeBuild
338
339 REM =========================================================================================
340 REM ===
341 REM === Build Cross-Architecture Native Components (if applicable)
342 REM ===
343 REM =========================================================================================
344
345 if /i "%__BuildArch%"=="arm64" (
346     set __DoCrossArchBuild=1
347     )
348
349 if /i "%__BuildArch%"=="arm" (
350     set __DoCrossArchBuild=1
351     )
352
353 if /i "%__DoCrossArchBuild%"=="1" (
354
355     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
356
357     :: Set the environment for the native build
358     set __VCBuildArch=x86_amd64
359     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
360     @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
361     @if defined _echo @echo on
362
363     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
364     if defined __SkipConfigure goto SkipConfigureCrossBuild
365
366     pushd "%__CrossCompIntermediatesDir%"
367     set __CMakeBinDir=%__CrossComponentBinDir%
368     set "__CMakeBinDir=!__CMakeBinDir:\=/!"
369     set __ExtraCmakeArgs="-DCLR_CROSS_COMPONENTS_BUILD=1" "-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%"
370     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
371     @if defined _echo @echo on
372     popd
373 :SkipConfigureCrossBuild
374     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
375         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
376         exit /b 1
377     )
378
379     if defined __ConfigureOnly goto SkipCrossCompBuild
380
381     echo %__MsgPrefix%Invoking msbuild
382
383     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
384     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
385     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
386     @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
387     if not !errorlevel! == 0 (
388         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
389         echo     "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
390         echo     "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
391         echo     "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
392         exit /b 1
393     )    
394 )
395
396 :SkipCrossCompBuild
397
398 REM =========================================================================================
399 REM ===
400 REM === CoreLib and NuGet package build section.
401 REM ===
402 REM =========================================================================================
403
404 if %__BuildCoreLib% EQU 1 (  
405         
406         echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
407     rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
408     set Platform=
409
410     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
411     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
412     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
413
414     set __ExtraBuildArgs=
415     if not defined __IbcTuning (
416       set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
417       set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
418     )
419
420     if /i "%__BuildArch%" == "arm64" (
421                 set __nugetBuildArgs=-buildNugetPackage=false
422     ) else if "%__SkipNugetPackage%" == "1" (
423                 set __nugetBuildArgs=-buildNugetPackage=false
424     ) else (
425                 set __nugetBuildArgs=-buildNugetPackage=true
426         )
427
428     @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
429     if not !errorlevel! == 0 (
430         echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
431         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
432         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
433         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
434         exit /b 1
435     )
436 )
437
438 REM Need diasymreader.dll on your path for /CreatePdb
439 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
440
441 if %__BuildNativeCoreLib% EQU 1 (
442     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
443
444     if "%__CompatJitCrossgen%"=="1" (
445         set COMPlus_UseWindowsX86CoreLegacyJit=1
446     )
447
448     echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll"
449     "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
450     if NOT !errorlevel! == 0 (
451         echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
452         :: Put it in the same log, helpful for Jenkins
453         type %__CrossGenCoreLibLog%
454         goto CrossgenFailure
455     )
456     "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.ni.dll" >> "%__CrossGenCoreLibLog%" 2>&1
457     if NOT !errorlevel! == 0 (
458         echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
459         :: Put it in the same log, helpful for Jenkins
460         type %__CrossGenCoreLibLog%
461         goto CrossgenFailure
462     )
463
464     if "%__CompatJitCrossgen%"=="1" (
465         set COMPlus_UseWindowsX86CoreLegacyJit=
466     )
467 )
468
469 if %__BuildPackages% EQU 1 (
470     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
471
472     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
473         set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
474         set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
475
476     REM The conditions as to what to build are captured in the builds file.
477     @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
478
479     if not !errorlevel! == 0 (
480         echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
481         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
482         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
483         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
484         exit /b 1
485     )
486 )
487
488 REM =========================================================================================
489 REM ===
490 REM === Test build section
491 REM ===
492 REM =========================================================================================
493
494 if %__BuildTests% EQU 1 (
495     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
496
497     REM Construct the arguments to pass to the test build script.
498
499     rem arm64 builds currently use private toolset which has not been released yet
500     REM TODO, remove once the toolset is open.
501     if /i "%__BuildArch%" == "arm64" call :PrivateToolSet 
502
503     echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
504     @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
505
506     if not !errorlevel! == 0 (
507         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
508         exit /b 1
509     )
510 )
511
512 REM =========================================================================================
513 REM ===
514 REM === All builds complete!
515 REM ===
516 REM =========================================================================================
517
518 echo %__MsgPrefix%Repo successfully built.  Finished at %TIME%
519 echo %__MsgPrefix%Product binaries are available at !__BinDir!
520 if %__BuildTests% EQU 1 (
521     echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
522 )
523 exit /b 0
524
525 REM =========================================================================================
526 REM ===
527 REM === Handle the "all" case.
528 REM ===
529 REM =========================================================================================
530
531 :BuildAll
532
533 set __BuildArchList=
534
535 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
536 if %__TotalSpecifiedBuildArch% EQU 0 (
537     REM Nothing specified means we want to build all architectures.
538     set __BuildArchList=x64 x86 arm arm64
539 )
540
541 REM Otherwise, add all the specified architectures to the list.
542
543 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
544 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
545 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
546 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
547
548 set __BuildTypeList=
549
550 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
551 if %__TotalSpecifiedBuildType% EQU 0 (
552     REM Nothing specified means we want to build all build types.
553     set __BuildTypeList=Debug Checked Release
554 )
555
556 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
557 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
558 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
559
560 REM Create a temporary file to collect build results. We always build all flavors specified, and
561 REM report a summary of the results at the end.
562
563 set __AllBuildSuccess=true
564 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
565 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
566
567 for %%i in (%__BuildArchList%) do (
568     for %%j in (%__BuildTypeList%) do (
569         call :BuildOne %%i %%j
570     )
571 )
572
573 if %__AllBuildSuccess%==true (
574     echo %__MsgPrefix%All builds succeeded!
575     exit /b 0
576 ) else (
577     echo %__MsgPrefix%Builds failed:
578     type %__BuildResultFile%
579     del /f /q %__BuildResultFile%
580     exit /b 1
581 )
582
583 REM This code is unreachable, but leaving it nonetheless, just in case things change.
584 exit /b 99
585
586 :BuildOne
587 set __BuildArch=%1
588 set __BuildType=%2
589 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
590 echo %__MsgPrefix%Invoking: %__NextCmd%
591 %__NextCmd%
592 if not !errorlevel! == 0 (
593     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
594     set __AllBuildSuccess=false
595 )
596 exit /b 0
597
598 REM =========================================================================================
599 REM ===
600 REM === Helper routines
601 REM ===
602 REM =========================================================================================
603
604 :CrossgenFailure
605 exit /b 1
606
607 :Usage
608 echo.
609 echo Build the CoreCLR repo.
610 echo.
611 echo Usage:
612 echo     build.cmd [option1] [option2]
613 echo or:
614 echo     build.cmd all [option1] [option2] -- ...
615 echo.
616 echo All arguments are optional. The options are:
617 echo.
618 echo.-? -h -help: view this message.
619 echo all: Builds all configurations and platforms.
620 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
621 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
622 echo -- ... : all arguments following this tag will be passed directly to msbuild.
623 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
624 echo     or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
625 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
626 echo     respectively^).
627 echo     add nativemscorlib to go further and build the native image for designated mscorlib.
628 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
629 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
630 echo ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
631 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
632 echo skipconfigure: skip CMake ^(default: CMake is run^)
633 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
634 echo skipnative: skip building native components ^(default: native components are built^).
635 echo skiptests: skip building tests ^(default: tests are built^).
636 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
637 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
638 echo buildstandalonegc: builds the GC in a standalone mode.
639 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
640 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
641 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
642 echo -sequential: force a non-parallel build ^(default is to build in parallel
643 echo     using all processors^).
644 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
645 echo -Rebuild: passes /t:rebuild to the build projects.
646 echo.
647 echo If "all" is specified, then all build architectures and types are built. If, in addition,
648 echo one or more build architectures or types is specified, then only those build architectures
649 echo and types are built.
650 echo.
651 echo For example:
652 echo     build all
653 echo        -- builds all architectures, and all build types per architecture
654 echo     build all x86
655 echo        -- builds all build types for x86
656 echo     build all x64 x86 Checked Release
657 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
658 exit /b 1
659
660 :NoDIA
661 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
662 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
663 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
664 of the previous version to "%VSINSTALLDIR%" and then build.
665 :: DIA SDK not included in Express editions
666 echo Visual Studio Express does not include the DIA SDK. ^
667 You need Visual Studio 2015 or 2017 (Community is free).
668 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
669 exit /b 1
670
671 :PrivateToolSet
672
673 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
674
675 if /i "%__ToolsetDir%" == "" (
676     echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
677     exit /b 1
678 )
679
680 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
681 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
682 set INCLUDE=^
683 %__ToolsetDir%\VC_sdk\inc;^
684 %__ToolsetDir%\sdpublic\sdk\inc;^
685 %__ToolsetDir%\sdpublic\shared\inc;^
686 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
687 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
688 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
689 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
690 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
691 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
692 %__ToolsetDir%\diasdk\include
693 exit /b 0