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