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