Merge pull request #19344 from adityamandaleeka/aa64_vm_callconv_changes
[platform/upstream/coreclr.git] / build.cmd
1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
3
4 :: Define a prefix for most output progress messages that come from this script. That makes
5 :: it easier to see where these are coming from. Note that there is a trailing space here.
6 set "__MsgPrefix=BUILD: "
7
8 echo %__MsgPrefix%Starting Build at %TIME%
9
10 set __ThisScriptFull="%~f0"
11 set __ThisScriptDir="%~dp0"
12
13 call "%__ThisScriptDir%"\setup_vs_tools.cmd
14 if NOT '%ERRORLEVEL%' == '0' exit /b 1
15
16 if defined VS150COMNTOOLS (
17     set "__VSToolsRoot=%VS150COMNTOOLS%"
18     set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
19     set __VSVersion=vs2017
20 ) else (
21     set "__VSToolsRoot=%VS140COMNTOOLS%"
22     set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
23     set __VSVersion=vs2015
24 )
25
26 :: Work around Jenkins CI + msbuild problem: Jenkins sometimes creates very large environment
27 :: variables, and msbuild can't handle environment blocks with such large variables. So clear
28 :: out the variables that might be too large.
29 set ghprbCommentBody=
30
31 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
32 ::      __BuildArch         -- default: x64
33 ::      __BuildType         -- default: Debug
34 ::      __BuildOS           -- default: Windows_NT
35 ::      __ProjectDir        -- default: directory of the dir.props file
36 ::      __SourceDir         -- default: %__ProjectDir%\src\
37 ::      __PackagesDir       -- default: %__ProjectDir%\packages\
38 ::      __RootBinDir        -- default: %__ProjectDir%\bin\
39 ::      __BinDir            -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
40 ::      __IntermediatesDir
41 ::      __PackagesBinDir    -- default: %__BinDir%\.nuget
42 ::      __TestWorkingDir    -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
43 ::
44 :: Thus, these variables are not simply internal to this script!
45
46 :: Set the default arguments for build
47 set __BuildArch=x64
48 set __BuildType=Debug
49 set __BuildOS=Windows_NT
50
51 :: Set the various build properties here so that CMake and MSBuild can pick them up
52 set "__ProjectDir=%~dp0"
53 :: remove trailing slash
54 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
55 set "__ProjectFilesDir=%__ProjectDir%"
56 set "__SourceDir=%__ProjectDir%\src"
57 set "__PackagesDir=%DotNetRestorePackagesPath%"
58 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\packages"
59 set "__RootBinDir=%__ProjectDir%\bin"
60 set "__LogsDir=%__RootBinDir%\Logs"
61
62 set __BuildAll=
63
64 set __BuildArchX64=0
65 set __BuildArchX86=0
66 set __BuildArchArm=0
67 set __BuildArchArm64=0
68
69 set __BuildTypeDebug=0
70 set __BuildTypeChecked=0
71 set __BuildTypeRelease=0
72
73 set __PgoInstrument=0
74 set __PgoOptimize=1
75 set __EnforcePgo=0
76 set __IbcTuning=
77
78 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
79 REM when using "all".
80 set __PassThroughArgs=
81
82 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
83 set "__args= %*"
84 set processedArgs=
85 set __UnprocessedBuildArgs=
86 set __RunArgs=
87
88 set __BuildCoreLib=1
89 set __BuildSOS=1
90 set __BuildNative=1
91 set __BuildCrossArchNative=0
92 set __BuildTests=1
93 set __BuildPackages=1
94 set __BuildNativeCoreLib=1
95 set __BuildManagedTools=1
96 set __RestoreOptData=1
97 set __GenerateLayout=0
98 set __CrossgenAltJit=
99 set __CrossArch=
100 set __SkipNugetPackage=0
101 set __PgoOptDataVersion=
102 set __IbcOptDataVersion=
103
104 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
105 @REM    -priority=1
106 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
107 @REM and allow the "-priority=1" syntax.
108 set __Priority=
109
110 :Arg_Loop
111 if "%1" == "" goto ArgsDone
112
113 if /i "%1" == "/?"     goto Usage
114 if /i "%1" == "-?"     goto Usage
115 if /i "%1" == "/h"     goto Usage
116 if /i "%1" == "-h"     goto Usage
117 if /i "%1" == "/help"  goto Usage
118 if /i "%1" == "-help"  goto Usage
119 if /i "%1" == "--help" goto Usage
120
121 if /i "%1" == "-all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
122 if /i "%1" == "-x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
123 if /i "%1" == "-x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
124 if /i "%1" == "-arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
125 if /i "%1" == "-arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
126
127 if /i "%1" == "-debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "-checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130
131 REM TODO these are deprecated remove them eventually
132 REM don't add more, use the - syntax instead
133 if /i "%1" == "all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138
139 if /i "%1" == "debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142
143 if /i "%1" == "-priority"           (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
144
145 REM Explicitly block -Rebuild.
146 if /i "%1" == "Rebuild" (
147     echo "ERROR: 'Rebuild' is not supported.  Please remove it."
148     goto Usage
149 )
150 if /i "%1" == "-Rebuild" (
151     echo "ERROR: 'Rebuild' is not supported.  Please remove it."
152     goto Usage
153 )
154
155
156 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
157 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
158 if [!__PassThroughArgs!]==[] (
159     set __PassThroughArgs=%1
160 ) else (
161     set __PassThroughArgs=%__PassThroughArgs% %1
162 )
163
164 if /i "%1" == "-freebsdmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
165 if /i "%1" == "-linuxmscorlib"       (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
166 if /i "%1" == "-netbsdmscorlib"      (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
167 if /i "%1" == "-osxmscorlib"         (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
168 if /i "%1" == "-windowsmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
169 if /i "%1" == "-nativemscorlib"      (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
170 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)
171 if /i "%1" == "-skipconfigure"       (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "-skipmscorlib"        (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-skipnative"          (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-skiptests"           (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-skiprestoreoptdata"  (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 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)
178 if /i "%1" == "-pgoinstrument"       (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-enforcepgo"          (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-nopgooptimize"       (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-crossgenaltjit"      (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
183
184 REM TODO these are deprecated remove them eventually
185 REM don't add more, use the - syntax instead
186 if /i "%1" == "freebsdmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
187 if /i "%1" == "linuxmscorlib"       (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "netbsdmscorlib"      (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
189 if /i "%1" == "osxmscorlib"         (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "windowsmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "nativemscorlib"      (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
192 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)
193 if /i "%1" == "skipconfigure"       (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
194 if /i "%1" == "skipmscorlib"        (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
195 if /i "%1" == "skipnative"          (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
196 if /i "%1" == "skiptests"           (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
197 if /i "%1" == "skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
198 if /i "%1" == "skiprestoreoptdata"  (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if /i "%1" == "generatelayout"      (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 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)
201 if /i "%1" == "pgoinstrument"       (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "nopgooptimize"       (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "enforcepgo"          (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205
206 if [!processedArgs!]==[] (
207     set __UnprocessedBuildArgs=%__args%
208 ) else (
209     set __UnprocessedBuildArgs=%__args%
210     for %%t in (!processedArgs!) do (
211         set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
212     )
213 )
214
215 :ArgsDone
216
217 @REM Special handling for -priority=N argument.
218 if defined __Priority (
219     if defined __PassThroughArgs (
220         set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
221     ) else (
222         set __PassThroughArgs=-priority=%__Priority%
223     )
224     set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
225 )
226
227 if defined __BuildAll goto BuildAll
228
229 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
230 if %__TotalSpecifiedBuildArch% GTR 1 (
231     echo Error: more than one build architecture specified, but "all" not specified.
232     goto Usage
233 )
234
235 if %__BuildArchX64%==1      set __BuildArch=x64
236 if %__BuildArchX86%==1      set __BuildArch=x86
237 if %__BuildArchArm%==1 (
238     set __BuildArch=arm
239     set __CrossArch=x86
240 )
241 if %__BuildArchArm64%==1 (
242     set __BuildArch=arm64
243     set __CrossArch=x64
244 )
245
246 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
247 if %__TotalSpecifiedBuildType% GTR 1 (
248     echo Error: more than one build type specified, but "all" not specified.
249     goto Usage
250 )
251
252 if %__BuildTypeDebug%==1    set __BuildType=Debug
253 if %__BuildTypeChecked%==1  set __BuildType=Checked
254 if %__BuildTypeRelease%==1  set __BuildType=Release
255
256 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
257
258 if %__EnforcePgo%==1 (
259     if %__BuildArchArm%==1 (
260         echo NOTICE: enforcepgo does nothing on arm architecture
261     )
262     if %__BuildArchArm64%==1 (
263         echo NOTICE: enforcepgo does nothing on arm64 architecture
264     )
265 )
266
267 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
268
269 if %__BuildNative% EQU 1 (
270     if /i "%__BuildArch%"=="arm64" (
271         set __BuildCrossArchNative=1
272     )
273     if /i "%__BuildArch%"=="arm" (
274         set __BuildCrossArchNative=1
275     )
276 )
277
278 REM Set the remaining variables based upon the determined build configuration
279
280 if %__PgoOptimize%==0 set __RestoreOptData=0
281 if /i %__BuildType% NEQ Release set __RestoreOptData=0
282
283 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
284 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
285
286 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
287 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
288 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
289 set "__PackagesBinDir=%__BinDir%\.nuget"
290 set "__CrossComponentBinDir=%__BinDir%"
291 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
292
293
294 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
295 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
296 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
297
298 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
299 set "__CMakeBinDir=%__BinDir%"
300 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
301
302 if not exist "%__BinDir%"           md "%__BinDir%"
303 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
304 if not exist "%__LogsDir%"          md "%__LogsDir%"
305
306 REM It is convenient to have your Nuget search path include the location where the build
307 REM will place packages.  However nuget used during the build will fail if that directory
308 REM does not exist.   Avoid this in at least one case by aggressively creating the directory.
309 if not exist "%__BinDir%\.nuget\pkg"           md "%__BinDir%\.nuget\pkg"
310
311 echo %__MsgPrefix%Commencing CoreCLR product build
312
313 REM Set the remaining variables based upon the determined build configuration
314
315 echo %__MsgPrefix%Checking prerequisites
316
317 REM Eval the output from probe-win1.ps1
318 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
319
320 REM NumberOfCores is an WMI property providing number of physical cores on machine
321 REM processor(s). It is used to set optimal level of CL parallelism during native build step
322 if not defined NumberOfCores (
323     REM Determine number of physical processor cores available on machine
324     for /f "tokens=*" %%I in (
325         'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
326     ) do set %%I
327 )
328 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
329
330 REM =========================================================================================
331 REM ===
332 REM === Start the build steps
333 REM ===
334 REM =========================================================================================
335
336 @if defined _echo @echo on
337
338 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
339
340 REM =========================================================================================
341 REM ===
342 REM === Restore optimization profile data
343 REM ===
344 REM =========================================================================================
345
346 if %__RestoreOptData% EQU 1 (
347     echo %__MsgPrefix%Restoring the OptimizationData Package
348     call %__ProjectDir%\run.cmd build -optdata %__RunArgs% %__UnprocessedBuildArgs%
349     if not !errorlevel! == 0 (
350         echo %__MsgPrefix%Error: Failed to restore the optimization data package.
351         exit /b 1
352     )
353 )
354
355 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
356 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
357 if not exist "%DotNetCli%" (
358     echo %__MsgPrefix%Error: "%DotNetCli%" not found
359     exit /b 1
360 )
361 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
362 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
363     set __PgoOptDataVersion=%%s
364 )
365 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
366     set __IbcOptDataVersion=%%s
367 )
368
369 REM =========================================================================================
370 REM ===
371 REM === Generate source files for eventing
372 REM ===
373 REM =========================================================================================
374
375 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
376 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
377
378 REM Find python and set it to the variable PYTHON
379 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
380 set /p PYTHON=<%TEMP%\pythonlocation.txt
381
382 if NOT DEFINED PYTHON (
383     echo %__MsgPrefix%Error: Could not find a python installation
384     exit /b 1
385 )
386
387 if %__BuildNative% EQU 1 (
388
389     echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
390     echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
391     "!PYTHON!" -B -Wall  %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
392
393     echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
394     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
395
396     echo %__MsgPrefix%Laying out ETW event logging interface
397     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
398 )
399
400 if %__BuildCoreLib% EQU 1 (
401
402     echo %__MsgPrefix%Laying out dynamically generated EventSource classes
403     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
404 )
405
406 if %__BuildCrossArchNative% EQU 1 (
407
408     set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
409     set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
410
411     echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
412     echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
413     "!PYTHON!" -B -Wall  %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
414
415     echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
416     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
417
418     echo %__MsgPrefix%Laying out dynamically generated EventSource classes
419     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
420
421     echo %__MsgPrefix%Laying out ETW event logging interface
422     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
423 )
424
425 REM =========================================================================================
426 REM ===
427 REM === Build the CLR VM
428 REM ===
429 REM =========================================================================================
430
431 if %__BuildNative% EQU 1 (
432     REM Scope environment changes start {
433     setlocal
434
435     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
436
437     REM Set the environment for the native build
438     set __VCBuildArch=x86_amd64
439     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
440     if /i "%__BuildArch%" == "arm" (
441         set __VCBuildArch=x86_arm
442
443         REM Make CMake pick the highest installed version in the 10.0.* range
444         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
445     )
446     if /i "%__BuildArch%" == "arm64" (
447         set __VCBuildArch=x86_arm64
448
449         REM Make CMake pick the highest installed version in the 10.0.* range
450         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
451     )
452
453     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
454     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
455     @if defined _echo @echo on
456
457     if not defined VSINSTALLDIR (
458         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
459         exit /b 1
460     )
461     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
462
463     if defined __SkipConfigure goto SkipConfigure
464
465     echo %__MsgPrefix%Regenerating the Visual Studio solution
466
467     pushd "%__IntermediatesDir%"
468     set __ExtraCmakeArgs=!___SDKVersion! "-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%"
469     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
470     @if defined _echo @echo on
471     popd
472
473 :SkipConfigure
474     if not exist "%__IntermediatesDir%\install.vcxproj" (
475         echo %__MsgPrefix%Error: failed to generate native component build project!
476         exit /b 1
477     )
478
479     if defined __ConfigureOnly goto SkipNativeBuild
480
481     set __BuildLogRootName=CoreCLR
482     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
483     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
484     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
485     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
486     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
487     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
488     set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
489
490     call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
491
492     if not !errorlevel! == 0 (
493         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
494         echo     !__BuildLog!
495         echo     !__BuildWrn!
496         echo     !__BuildErr!
497         exit /b 1
498     )
499
500 :SkipNativeBuild
501     REM } Scope environment changes end
502     endlocal
503 )
504
505 REM =========================================================================================
506 REM ===
507 REM === Build Cross-Architecture Native Components (if applicable)
508 REM ===
509 REM =========================================================================================
510
511 if %__BuildCrossArchNative% EQU 1 (
512     REM Scope environment changes start {
513     setlocal
514
515     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
516
517     REM Set the environment for the cross-arch native build
518     set __VCBuildArch=x86_amd64
519     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
520
521     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
522     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
523     @if defined _echo @echo on
524
525     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
526     if defined __SkipConfigure goto SkipConfigureCrossBuild
527
528     pushd "%__CrossCompIntermediatesDir%"
529     set __CMakeBinDir=%__CrossComponentBinDir%
530     set "__CMakeBinDir=!__CMakeBinDir:\=/!"
531     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%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%" "-DCMAKE_SYSTEM_VERSION=10.0"
532     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
533     @if defined _echo @echo on
534     popd
535
536 :SkipConfigureCrossBuild
537     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
538         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
539         exit /b 1
540     )
541
542     if defined __ConfigureOnly goto SkipCrossCompBuild
543
544     set __BuildLogRootName=Cross
545     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
546     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
547     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
548     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
549     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
550     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
551     set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
552
553     call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__CrossArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
554
555     if not !errorlevel! == 0 (
556         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
557         echo     !__BuildLog!
558         echo     !__BuildWrn!
559         echo     !__BuildErr!
560         exit /b 1
561     )
562
563 :SkipCrossCompBuild
564     REM } Scope environment changes end
565     endlocal
566 )
567
568 REM =========================================================================================
569 REM ===
570 REM === CoreLib and NuGet package build section.
571 REM ===
572 REM =========================================================================================
573
574 if %__BuildCoreLib% EQU 1 (
575     REM Scope environment changes start {
576     setlocal
577
578     echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
579     rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
580     set Platform=
581
582     set __ExtraBuildArgs=
583     if not defined __IbcTuning (
584         set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
585         set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
586     )
587
588     if "%__BuildSOS%" == "0" (
589         set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
590     )
591
592     if "%__BuildManagedTools%" == "1" (
593         set __ExtraBuildArgs=!__ExtraBuildArgs! -BuildManagedTools=true
594     )
595
596     if "%__SkipNugetPackage%" == "1" (
597         set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=false
598     ) else (
599         set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=true
600     )
601
602     set __BuildLogRootName=System.Private.CoreLib
603     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
604     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
605     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
606     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
607     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
608     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
609     set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
610
611     call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj !__Logging! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
612
613     if not !errorlevel! == 0 (
614         echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
615         echo     !__BuildLog!
616         echo     !__BuildWrn!
617         echo     !__BuildErr!
618         exit /b 1
619     )
620
621     REM } Scope environment changes end
622     endlocal
623 )
624
625 REM =========================================================================================
626 REM ===
627 REM === Build native System.Private.CoreLib.
628 REM ===
629 REM =========================================================================================
630
631 REM Scope environment changes start {
632 setlocal
633
634 REM Need diasymreader.dll on your path for /CreatePdb
635 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
636
637 if %__BuildNativeCoreLib% EQU 1 (
638     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
639     if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
640
641     REM Need VS native tools environment for the **target** arch when running instrumented binaries
642     if %__PgoInstrument% EQU 1 (
643         set __VCExecArch=%__BuildArch%
644         if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
645         echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
646         call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
647         @if defined _echo @echo on
648         if NOT !errorlevel! == 0 (
649             echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
650             goto CrossgenFailure
651         )
652
653         REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
654         set __PgoRtPath=
655         for /f "tokens=*" %%f in ('where pgort*.dll') do (
656             if not defined __PgoRtPath set "__PgoRtPath=%%~f"
657         )
658         echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
659         copy /y "!__PgoRtPath!" "%__BinDir%" || (
660             echo %__MsgPrefix%Error: copy failed
661             goto CrossgenFailure
662         )
663         REM End HACK
664     )
665
666     if defined __CrossgenAltJit (
667         REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
668         REM so we don't need to save or unset these afterwards.
669         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
670         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
671         set COMPlus_AltJit=*
672         set COMPlus_AltJitNgen=*
673         set COMPlus_AltJitName=%__CrossgenAltJit%
674         set COMPlus_AltJitAssertOnNYI=1
675         set COMPlus_NoGuiOnAssert=1
676         set COMPlus_ContinueOnAssert=0
677     )
678
679     set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
680     echo %__MsgPrefix%!NEXTCMD!
681     echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
682     !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
683     if NOT !errorlevel! == 0 (
684         echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
685         REM Put it in the same log, helpful for Jenkins
686         type %__CrossGenCoreLibLog%
687         goto CrossgenFailure
688     )
689
690     set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
691     echo %__MsgPrefix%!NEXTCMD!
692     echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
693     !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
694     if NOT !errorlevel! == 0 (
695         echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
696         REM Put it in the same log, helpful for Jenkins
697         type %__CrossGenCoreLibLog%
698         goto CrossgenFailure
699     )
700 )
701
702 REM } Scope environment changes end
703 endlocal
704
705 REM =========================================================================================
706 REM ===
707 REM === Build packages
708 REM ===
709 REM =========================================================================================
710
711 if %__BuildPackages% EQU 1 (
712     REM Scope environment changes start {
713     setlocal
714
715     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
716
717     set __BuildLogRootName=Nuget
718     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
719     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
720     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
721     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
722     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
723     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
724     set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
725
726     REM The conditions as to what to build are captured in the builds file.
727     call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds !__Logging! -platform=%__BuildArch% %__RunArgs% %__UnprocessedBuildArgs%
728
729     if not !errorlevel! == 0 (
730         echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
731         echo     !__BuildLog!
732         echo     !__BuildWrn!
733         echo     !__BuildErr!
734         exit /b 1
735     )
736
737     REM } Scope environment changes end
738     endlocal
739 )
740
741 REM =========================================================================================
742 REM ===
743 REM === Test build section
744 REM ===
745 REM =========================================================================================
746
747 if %__BuildTests% EQU 1 (
748     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
749
750     set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
751     echo %__MsgPrefix%!NEXTCMD!
752     !NEXTCMD!
753
754     if not !errorlevel! == 0 (
755         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
756         exit /b 1
757     )
758 ) else if %__GenerateLayout% EQU 1 (
759     echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
760
761     set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
762     echo %__MsgPrefix%!NEXTCMD!
763     !NEXTCMD!
764
765     if not !errorlevel! == 0 (
766         REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
767         exit /b 1
768     )
769 )
770
771 REM =========================================================================================
772 REM ===
773 REM === All builds complete!
774 REM ===
775 REM =========================================================================================
776
777 echo %__MsgPrefix%Build succeeded.  Finished at %TIME%
778 echo %__MsgPrefix%Product binaries are available at !__BinDir!
779 exit /b 0
780
781 REM =========================================================================================
782 REM ===
783 REM === Handle the "all" case.
784 REM ===
785 REM =========================================================================================
786
787 :BuildAll
788
789 set __BuildArchList=
790
791 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
792 if %__TotalSpecifiedBuildArch% EQU 0 (
793     REM Nothing specified means we want to build all architectures.
794     set __BuildArchList=x64 x86 arm arm64
795 )
796
797 REM Otherwise, add all the specified architectures to the list.
798
799 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
800 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
801 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
802 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
803
804 set __BuildTypeList=
805
806 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
807 if %__TotalSpecifiedBuildType% EQU 0 (
808     REM Nothing specified means we want to build all build types.
809     set __BuildTypeList=Debug Checked Release
810 )
811
812 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
813 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
814 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
815
816 REM Create a temporary file to collect build results. We always build all flavors specified, and
817 REM report a summary of the results at the end.
818
819 set __AllBuildSuccess=true
820 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
821 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
822
823 for %%i in (%__BuildArchList%) do (
824     for %%j in (%__BuildTypeList%) do (
825         call :BuildOne %%i %%j
826     )
827 )
828
829 if %__AllBuildSuccess%==true (
830     echo %__MsgPrefix%All builds succeeded!
831     exit /b 0
832 ) else (
833     echo %__MsgPrefix%Builds failed:
834     type %__BuildResultFile%
835     del /f /q %__BuildResultFile%
836     exit /b 1
837 )
838
839 REM This code is unreachable, but leaving it nonetheless, just in case things change.
840 exit /b 99
841
842 :BuildOne
843 set __BuildArch=%1
844 set __BuildType=%2
845 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
846 echo %__MsgPrefix%Invoking: %__NextCmd%
847 %__NextCmd%
848 if not !errorlevel! == 0 (
849     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
850     set __AllBuildSuccess=false
851 )
852 exit /b 0
853
854 REM =========================================================================================
855 REM ===
856 REM === Helper routines
857 REM ===
858 REM =========================================================================================
859
860 :CrossgenFailure
861 exit /b 1
862
863 :Usage
864 echo.
865 echo Build the CoreCLR repo.
866 echo.
867 echo Usage:
868 echo     build.cmd [option1] [option2]
869 echo or:
870 echo     build.cmd all [option1] [option2]
871 echo.
872 echo All arguments are optional. The options are:
873 echo.
874 echo.-? -h -help --help: view this message.
875 echo -all: Builds all configurations and platforms.
876 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
877 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
878 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
879 echo     or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
880 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
881 echo     respectively^).
882 echo     add nativemscorlib to go further and build the native image for designated mscorlib.
883 echo -nopgooptimize: do not use profile guided optimizations.
884 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
885 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
886 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
887 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
888 echo -skipconfigure: skip CMake ^(default: CMake is run^)
889 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
890 echo -skipnative: skip building native components ^(default: native components are built^).
891 echo -skiptests: skip building tests ^(default: tests are built^).
892 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
893 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
894 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
895 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
896 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
897 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
898 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
899 echo portable : build for portable RID.
900 echo.
901 echo If "all" is specified, then all build architectures and types are built. If, in addition,
902 echo one or more build architectures or types is specified, then only those build architectures
903 echo and types are built.
904 echo.
905 echo For example:
906 echo     build -all
907 echo        -- builds all architectures, and all build types per architecture
908 echo     build -all -x86
909 echo        -- builds all build types for x86
910 echo     build -all -x64 -x86 -Checked -Release
911 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
912 exit /b 1
913
914 :NoDIA
915 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
916 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
917 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
918 of the previous version to "%VSINSTALLDIR%" and then build.
919 REM DIA SDK not included in Express editions
920 echo Visual Studio Express does not include the DIA SDK. ^
921 You need Visual Studio 2015 or 2017 (Community is free).
922 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
923 exit /b 1