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