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