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