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