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