Disable outdated test until it is updated
[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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 if /i "%1" == "-ibconly"             (set __IbcOptimize=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" == "ibcoptimize"         (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
211 if /i "%1" == "ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if /i "%1" == "crossgenaltjit"      (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
213
214 if [!processedArgs!]==[] (
215     set __UnprocessedBuildArgs=%__args%
216 ) else (
217     set __UnprocessedBuildArgs=%__args%
218     for %%t in (!processedArgs!) do (
219         set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
220     )
221 )
222
223 :ArgsDone
224
225 @REM Special handling for -priority=N argument.
226 if defined __Priority (
227     if defined __PassThroughArgs (
228         set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
229     ) else (
230         set __PassThroughArgs=-priority=%__Priority%
231     )
232     set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
233 )
234
235 if defined __BuildAll goto BuildAll
236
237 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
238 if %__TotalSpecifiedBuildArch% GTR 1 (
239     echo Error: more than one build architecture specified, but "all" not specified.
240     goto Usage
241 )
242
243 if %__BuildArchX64%==1      set __BuildArch=x64
244 if %__BuildArchX86%==1      set __BuildArch=x86
245 if %__BuildArchArm%==1 (
246     set __BuildArch=arm
247     set __CrossArch=x86
248 )
249 if %__BuildArchArm64%==1 (
250     set __BuildArch=arm64
251     set __CrossArch=x64
252 )
253
254 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
255 if %__TotalSpecifiedBuildType% GTR 1 (
256     echo Error: more than one build type specified, but "all" not specified.
257     goto Usage
258 )
259
260 if %__BuildTypeDebug%==1    set __BuildType=Debug
261 if %__BuildTypeChecked%==1  set __BuildType=Checked
262 if %__BuildTypeRelease%==1  set __BuildType=Release
263
264 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
265
266 if %__EnforcePgo%==1 (
267     if %__BuildArchArm%==1 (
268         echo NOTICE: enforcepgo does nothing on arm architecture
269     )
270     if %__BuildArchArm64%==1 (
271         echo NOTICE: enforcepgo does nothing on arm64 architecture
272     )
273 )
274
275 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
276
277 if %__BuildNative% EQU 1 (
278     if /i "%__BuildArch%"=="arm64" (
279         set __BuildCrossArchNative=1
280     )
281     if /i "%__BuildArch%"=="arm" (
282         set __BuildCrossArchNative=1
283     )
284 )
285
286 REM Set the remaining variables based upon the determined build configuration
287
288 if %__PgoOptimize%==0 set __RestoreOptData=0
289 if /i %__BuildType% NEQ Release set __RestoreOptData=0
290
291 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
292 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
293
294 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
295 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
296 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
297 set "__PackagesBinDir=%__BinDir%\.nuget"
298 set "__CrossComponentBinDir=%__BinDir%"
299 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
300
301
302 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
303 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
304 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
305
306 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
307 set "__CMakeBinDir=%__BinDir%"
308 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
309
310 if not exist "%__BinDir%"           md "%__BinDir%"
311 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
312 if not exist "%__LogsDir%"          md "%__LogsDir%"
313
314 REM It is convenient to have your Nuget search path include the location where the build
315 REM will place packages.  However nuget used during the build will fail if that directory
316 REM does not exist.   Avoid this in at least one case by aggressively creating the directory.
317 if not exist "%__BinDir%\.nuget\pkg"           md "%__BinDir%\.nuget\pkg"
318
319 echo %__MsgPrefix%Commencing CoreCLR product build
320
321 REM Set the remaining variables based upon the determined build configuration
322
323 echo %__MsgPrefix%Checking prerequisites
324
325 set __CMakeNeeded=1
326 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
327 if %__CMakeNeeded%==1 (
328     REM Eval the output from set-cmake-path.ps1
329     for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
330     REM echo Using CMake from %CMakePath%
331 )
332
333 REM NumberOfCores is an WMI property providing number of physical cores on machine
334 REM processor(s). It is used to set optimal level of CL parallelism during native build step
335 if not defined NumberOfCores (
336     REM Determine number of physical processor cores available on machine
337     set TotalNumberOfCores=0
338     for /f "tokens=*" %%I in (
339         'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
340     ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
341     set NumberOfCores=!TotalNumberOfCores!
342 )
343 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
344
345 REM =========================================================================================
346 REM ===
347 REM === Start the build steps
348 REM ===
349 REM =========================================================================================
350
351 @if defined _echo @echo on
352
353 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
354
355 REM =========================================================================================
356 REM ===
357 REM === Restore optimization profile data
358 REM ===
359 REM =========================================================================================
360
361 if %__RestoreOptData% EQU 1 (
362     echo %__MsgPrefix%Restoring the OptimizationData Package
363     call %__ProjectDir%\run.cmd build -optdata %__RunArgs% %__UnprocessedBuildArgs%
364     if not !errorlevel! == 0 (
365         echo %__MsgPrefix%Error: Failed to restore the optimization data package.
366         exit /b 1
367     )
368 )
369
370 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
371 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
372 if not exist "%DotNetCli%" (
373     echo %__MsgPrefix%Error: "%DotNetCli%" not found
374     exit /b 1
375 )
376 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
377 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
378     set __PgoOptDataVersion=%%s
379 )
380 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
381     set __IbcOptDataVersion=%%s
382 )
383
384 REM =========================================================================================
385 REM ===
386 REM === Generate source files for eventing
387 REM ===
388 REM =========================================================================================
389
390 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
391 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
392
393 REM Find python and set it to the variable PYTHON
394 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
395 set /p PYTHON=<%TEMP%\pythonlocation.txt
396
397 if NOT DEFINED PYTHON (
398     echo %__MsgPrefix%Error: Could not find a python installation
399     exit /b 1
400 )
401
402 if %__BuildNative% EQU 1 (
403
404     echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
405     echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
406     "!PYTHON!" -B -Wall  %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
407
408     echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
409     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
410
411     echo %__MsgPrefix%Laying out ETW event logging interface
412     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
413 )
414
415 if %__BuildCoreLib% EQU 1 (
416
417     echo %__MsgPrefix%Laying out dynamically generated EventSource classes
418     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
419 )
420
421 if %__BuildCrossArchNative% EQU 1 (
422
423     set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
424     set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
425
426     echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
427     echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
428     "!PYTHON!" -B -Wall  %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
429
430     echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
431     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
432
433     echo %__MsgPrefix%Laying out dynamically generated EventSource classes
434     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
435
436     echo %__MsgPrefix%Laying out ETW event logging interface
437     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
438 )
439
440 REM =========================================================================================
441 REM ===
442 REM === Build the CLR VM
443 REM ===
444 REM =========================================================================================
445
446 if %__BuildNative% EQU 1 (
447     REM Scope environment changes start {
448     setlocal
449
450     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
451
452     REM Set the environment for the native build
453     set __VCBuildArch=x86_amd64
454     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
455     if /i "%__BuildArch%" == "arm" (
456         set __VCBuildArch=x86_arm
457
458         REM Make CMake pick the highest installed version in the 10.0.* range
459         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
460     )
461     if /i "%__BuildArch%" == "arm64" (
462         set __VCBuildArch=x86_arm64
463
464         REM Make CMake pick the highest installed version in the 10.0.* range
465         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
466     )
467
468     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
469     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
470     @if defined _echo @echo on
471
472     if not defined VSINSTALLDIR (
473         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
474         exit /b 1
475     )
476     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
477
478     if defined __SkipConfigure goto SkipConfigure
479
480     echo %__MsgPrefix%Regenerating the Visual Studio solution
481
482     pushd "%__IntermediatesDir%"
483     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%"
484     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
485     @if defined _echo @echo on
486     popd
487
488 :SkipConfigure
489     if not exist "%__IntermediatesDir%\install.vcxproj" (
490         echo %__MsgPrefix%Error: failed to generate native component build project!
491         exit /b 1
492     )
493
494     if defined __ConfigureOnly goto SkipNativeBuild
495
496     set __BuildLogRootName=CoreCLR
497     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
498     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
499     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
500     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
501     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
502     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
503     set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
504
505     call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
506
507     if not !errorlevel! == 0 (
508         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
509         echo     !__BuildLog!
510         echo     !__BuildWrn!
511         echo     !__BuildErr!
512         exit /b 1
513     )
514
515 :SkipNativeBuild
516     REM } Scope environment changes end
517     endlocal
518 )
519
520 REM =========================================================================================
521 REM ===
522 REM === Build Cross-Architecture Native Components (if applicable)
523 REM ===
524 REM =========================================================================================
525
526 if %__BuildCrossArchNative% EQU 1 (
527     REM Scope environment changes start {
528     setlocal
529
530     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
531
532     REM Set the environment for the cross-arch native build
533     set __VCBuildArch=x86_amd64
534     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
535
536     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
537     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
538     @if defined _echo @echo on
539
540     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
541     if defined __SkipConfigure goto SkipConfigureCrossBuild
542
543     pushd "%__CrossCompIntermediatesDir%"
544     set __CMakeBinDir=%__CrossComponentBinDir%
545     set "__CMakeBinDir=!__CMakeBinDir:\=/!"
546     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"
547     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
548     @if defined _echo @echo on
549     popd
550
551 :SkipConfigureCrossBuild
552     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
553         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
554         exit /b 1
555     )
556
557     if defined __ConfigureOnly goto SkipCrossCompBuild
558
559     set __BuildLogRootName=Cross
560     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
561     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
562     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
563     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
564     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
565     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
566     set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
567
568     call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__CrossArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
569
570     if not !errorlevel! == 0 (
571         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
572         echo     !__BuildLog!
573         echo     !__BuildWrn!
574         echo     !__BuildErr!
575         exit /b 1
576     )
577
578 :SkipCrossCompBuild
579     REM } Scope environment changes end
580     endlocal
581 )
582
583 REM =========================================================================================
584 REM ===
585 REM === CoreLib and NuGet package build section.
586 REM ===
587 REM =========================================================================================
588
589 if %__BuildCoreLib% EQU 1 (
590     REM Scope environment changes start {
591     setlocal
592
593     if %__IbcOnly% EQU 0 (
594         echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
595         rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
596         set Platform=
597
598         set __ExtraBuildArgs=
599
600         if "%__BuildSOS%" == "0" (
601             set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
602         )
603
604         if "%__BuildManagedTools%" == "1" (
605             set __ExtraBuildArgs=!__ExtraBuildArgs! -BuildManagedTools=true
606         )
607
608         if "%__SkipNugetPackage%" == "1" (
609             set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=false
610         ) else (
611             set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=true
612         )
613
614         set __BuildLogRootName=System.Private.CoreLib
615         set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
616         set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
617         set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
618         set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
619         set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
620         set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
621         set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
622
623         call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj !__Logging! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
624
625         if not !errorlevel! == 0 (
626             echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
627             echo     !__BuildLog!
628             echo     !__BuildWrn!
629             echo     !__BuildErr!
630             exit /b 1
631         )
632     )
633     if %__IbcOptimize% EQU 1 (
634         echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
635         set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
636         for /f "tokens=*" %%s in ('%DotNetCli% msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
637             set __IbcMergeVersion=%%s
638         )
639
640         set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
641         if exist !IbcMergePath! (
642             echo %__MsgPrefix%Optimizing using IBC training data
643             set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\
644             set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
645             set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
646
647             if exist "!InputAssemblyFile!" (
648                 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
649
650                 REM Merge the optimization data into the source DLL
651                 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
652                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
653                 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
654                 if NOT !errorlevel! == 0 (
655                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
656                     REM Put it in the same log, helpful for Jenkins
657                     type %__CrossGenCoreLibLog%
658                     goto CrossgenFailure
659                 )
660
661                 REM Verify that the optimization data has been merged
662                 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
663                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
664                 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
665                 if NOT !errorlevel! == 0 (
666                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
667                     REM Put it in the same log, helpful for Jenkins
668                     type %__CrossGenCoreLibLog%
669                     goto CrossgenFailure
670                 )
671
672                 REM Save the module as *.pgo to match the convention expected
673                 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
674             )
675
676             if exist "!TargetOptimizationDataFile!" (
677                 REM Customize IBCMerge's arguments depending on input props
678                 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
679
680                 REM Apply optimization data to the compiled assembly
681                 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
682                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
683                 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
684                 if NOT !errorlevel! == 0 (
685                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
686                     REM Put it in the same log, helpful for Jenkins
687                     type %__CrossGenCoreLibLog%
688                     goto CrossgenFailure
689                 )
690                 
691                 REM Verify that the optimization data has been applied
692                 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
693                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
694                 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
695                 if NOT !errorlevel! == 0 (
696                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
697                     REM Put it in the same log, helpful for Jenkins
698                     type %__CrossGenCoreLibLog%
699                     goto CrossgenFailure
700                 )
701             ) else (
702                 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
703                 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
704                 REM Put it in the same log, helpful for Jenkins
705                 type %__CrossGenCoreLibLog%
706                 goto CrossgenFailure
707             )
708         )
709     )
710
711     REM } Scope environment changes end
712     endlocal
713 )
714
715 REM =========================================================================================
716 REM ===
717 REM === Build native System.Private.CoreLib.
718 REM ===
719 REM =========================================================================================
720
721 REM Scope environment changes start {
722 setlocal
723
724 REM Need diasymreader.dll on your path for /CreatePdb
725 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
726
727 if %__BuildNativeCoreLib% EQU 1 (
728     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
729     if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
730
731     REM Need VS native tools environment for the **target** arch when running instrumented binaries
732     if %__PgoInstrument% EQU 1 (
733         set __VCExecArch=%__BuildArch%
734         if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
735         echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
736         call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
737         @if defined _echo @echo on
738         if NOT !errorlevel! == 0 (
739             echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
740             goto CrossgenFailure
741         )
742
743         REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
744         set __PgoRtPath=
745         for /f "tokens=*" %%f in ('where pgort*.dll') do (
746             if not defined __PgoRtPath set "__PgoRtPath=%%~f"
747         )
748         echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
749         copy /y "!__PgoRtPath!" "%__BinDir%" || (
750             echo %__MsgPrefix%Error: copy failed
751             goto CrossgenFailure
752         )
753         REM End HACK
754     )
755
756     if defined __CrossgenAltJit (
757         REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
758         REM so we don't need to save or unset these afterwards.
759         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
760         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
761         set COMPlus_AltJit=*
762         set COMPlus_AltJitNgen=*
763         set COMPlus_AltJitName=%__CrossgenAltJit%
764         set COMPlus_AltJitAssertOnNYI=1
765         set COMPlus_NoGuiOnAssert=1
766         set COMPlus_ContinueOnAssert=0
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