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