Port of dotnet/runtime#1059 to 3.1 branch (#27986)
[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 __BuildNative=1
92 set __BuildCrossArchNative=0
93 set __SkipCrossArchNative=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 __SkipRestoreArg=/p:RestoreDuringBuild=true
102 set __OfficialBuildIdArg=
103 set __CrossArch=
104 set __PgoOptDataVersion=
105 set __IbcOptDataVersion=
106 set __IbcMergeVersion=
107
108 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
109 @REM    -priority=1
110 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
111 @REM and allow the "-priority=1" syntax.
112 set __Priority=
113
114 :Arg_Loop
115 if "%1" == "" goto ArgsDone
116
117 if /i "%1" == "/?"     goto Usage
118 if /i "%1" == "-?"     goto Usage
119 if /i "%1" == "/h"     goto Usage
120 if /i "%1" == "-h"     goto Usage
121 if /i "%1" == "/help"  goto Usage
122 if /i "%1" == "-help"  goto Usage
123 if /i "%1" == "--help" goto Usage
124
125 if /i "%1" == "-all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
126 if /i "%1" == "-x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if /i "%1" == "-x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "-arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130
131 if /i "%1" == "-debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "-release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134
135 REM TODO these are deprecated remove them eventually
136 REM don't add more, use the - syntax instead
137 if /i "%1" == "all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142
143 if /i "%1" == "debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146
147 if /i "%1" == "-priority"           (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
148
149 REM Explicitly block -Rebuild.
150 if /i "%1" == "Rebuild" (
151     echo "ERROR: 'Rebuild' is not supported.  Please remove it."
152     goto Usage
153 )
154 if /i "%1" == "-Rebuild" (
155     echo "ERROR: 'Rebuild' is not supported.  Please remove it."
156     goto Usage
157 )
158
159
160 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
161 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
162 if [!__PassThroughArgs!]==[] (
163     set __PassThroughArgs=%1
164 ) else (
165     set __PassThroughArgs=%__PassThroughArgs% %1
166 )
167
168 if /i "%1" == "-freebsdmscorlib"     (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)
169 if /i "%1" == "-linuxmscorlib"       (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)
170 if /i "%1" == "-netbsdmscorlib"      (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)
171 if /i "%1" == "-osxmscorlib"         (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)
172 if /i "%1" == "-windowsmscorlib"     (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)
173 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)
174 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)
175 if /i "%1" == "-skipconfigure"       (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-skipmscorlib"        (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-skipnative"          (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-skiptests"           (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-skipmanagedtools"    (set __BuildManagedTools=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 __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 __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 __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 __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 __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 set PgoDataPackageVersionOutputFile="%__IntermediatesDir%\optdataversion.txt"
393 set IbcDataPackageVersionOutputFile="%__IntermediatesDir%\ibcoptdataversion.txt"
394
395 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
396 call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo %__CommonMSBuildArgs% /p:PgoDataPackageVersionOutputFile="!PgoDataPackageVersionOutputFile!"
397
398  if not !errorlevel! == 0 (
399     echo "Failed to get PGO data package version."
400     exit /b !errorlevel!
401 )
402 if not exist "!PgoDataPackageVersionOutputFile!" (
403     echo "Failed to get PGO data package version."
404     exit /b 1
405 )
406
407 set /p __PgoOptDataVersion=<"!PgoDataPackageVersionOutputFile!"
408
409 call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo %__CommonMSBuildArgs% /p:IbcDataPackageVersionOutputFile="!IbcDataPackageVersionOutputFile!"
410
411  if not !errorlevel! == 0 (
412     echo "Failed to get IBC data package version."
413     exit /b !errorlevel!
414 )
415
416 if not exist "!IbcDataPackageVersionOutputFile!" (
417     echo "Failed to get IBC data package version."
418     exit /b 1
419 )
420
421 set /p __IbcOptDataVersion=<"!IbcDataPackageVersionOutputFile!"
422
423 REM =========================================================================================
424 REM ===
425 REM === Generate source files for eventing
426 REM ===
427 REM =========================================================================================
428
429 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
430 set __IntermediatesEventingDir=%__IntermediatesDir%\Eventing
431
432 REM Find python and set it to the variable PYTHON
433 set _C=-c "import sys; sys.stdout.write(sys.executable)"
434 (py -3 %_C% || py -2 %_C% || python3 %_C% || python2 %_C% || python %_C%) > %TEMP%\pythonlocation.txt 2> NUL
435 set _C=
436 set /p PYTHON=<%TEMP%\pythonlocation.txt
437
438 if NOT DEFINED PYTHON (
439     echo %__MsgPrefix%Error: Could not find a python installation
440     exit /b 1
441 )
442
443 if %__BuildCoreLib% EQU 1 (
444     echo %__MsgPrefix%Laying out dynamically generated EventSource classes
445     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
446 )
447
448 REM =========================================================================================
449 REM ===
450 REM === Build Cross-Architecture Native Components (if applicable)
451 REM ===
452 REM =========================================================================================
453
454 if %__BuildCrossArchNative% EQU 1 (
455     REM Scope environment changes start {
456     setlocal
457
458     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
459
460     REM Set the environment for the cross-arch native build
461     set __VCBuildArch=x86_amd64
462     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
463
464     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
465     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
466     @if defined _echo @echo on
467
468     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
469     if defined __SkipConfigure goto SkipConfigureCrossBuild
470
471     pushd "%__CrossCompIntermediatesDir%"
472     set __CMakeBinDir=%__CrossComponentBinDir%
473     set "__CMakeBinDir=!__CMakeBinDir:\=/!"
474     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"
475     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
476     @if defined _echo @echo on
477     popd
478
479 :SkipConfigureCrossBuild
480     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
481         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
482         exit /b 1
483     )
484
485     if defined __ConfigureOnly goto SkipCrossCompBuild
486
487     set __BuildLogRootName=Cross
488     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
489     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
490     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
491     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
492     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
493     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
494     set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
495
496     call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
497       /p:PortableBuild=true /maxcpucount^
498       %__CrossCompIntermediatesDir%\install.vcxproj^
499       !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
500
501     if not !errorlevel! == 0 (
502         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
503         echo     !__BuildLog!
504         echo     !__BuildWrn!
505         echo     !__BuildErr!
506         exit /b 1
507     )
508
509 :SkipCrossCompBuild
510     REM } Scope environment changes end
511     endlocal
512 )
513
514 REM =========================================================================================
515 REM ===
516 REM === Build the CLR VM
517 REM ===
518 REM =========================================================================================
519
520 if %__BuildNative% EQU 1 (
521     REM Scope environment changes start {
522     setlocal
523
524     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
525
526     REM Set the environment for the native build
527     set __VCBuildArch=x86_amd64
528     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
529     if /i "%__BuildArch%" == "arm" (
530         set __VCBuildArch=x86_arm
531         REM Make CMake pick the highest installed version in the 10.0.* range
532         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
533         set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
534     )
535     if /i "%__BuildArch%" == "arm64" (
536         set __VCBuildArch=x86_arm64
537
538         REM Make CMake pick the highest installed version in the 10.0.* range
539         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
540         set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
541     )
542
543     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
544     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
545     @if defined _echo @echo on
546
547     if not defined VSINSTALLDIR (
548         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
549         exit /b 1
550     )
551     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
552
553     if defined __SkipConfigure goto SkipConfigure
554
555     echo %__MsgPrefix%Regenerating the Visual Studio solution
556
557     echo Cross Arch Defines !___CrossBuildDefine!
558
559     pushd "%__IntermediatesDir%"
560     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%"
561     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
562     @if defined _echo @echo on
563     popd
564
565 :SkipConfigure
566     if not exist "%__IntermediatesDir%\install.vcxproj" (
567         echo %__MsgPrefix%Error: failed to generate native component build project!
568         exit /b 1
569     )
570
571     if defined __ConfigureOnly goto SkipNativeBuild
572
573     set __BuildLogRootName=CoreCLR
574     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
575     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
576     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
577     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
578     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
579     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
580     set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
581
582     call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
583       /p:PortableBuild=true /maxcpucount %__IntermediatesDir%\install.vcxproj^
584       !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
585
586     if not !errorlevel! == 0 (
587         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
588         echo     !__BuildLog!
589         echo     !__BuildWrn!
590         echo     !__BuildErr!
591         exit /b 1
592     )
593
594 :SkipNativeBuild
595     REM } Scope environment changes end
596     endlocal
597 )
598
599 REM =========================================================================================
600 REM ===
601 REM === CoreLib and NuGet package build section.
602 REM ===
603 REM =========================================================================================
604
605 if %__BuildCoreLib% EQU 1 (
606     REM Scope environment changes start {
607     setlocal
608
609     if %__IbcOnly% EQU 0 (
610         echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
611         rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
612         set Platform=
613
614         set __ExtraBuildArgs=
615
616         if "%__BuildManagedTools%" == "1" (
617             set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
618         )
619
620         set __BuildLogRootName=System.Private.CoreLib
621         set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
622         set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
623         set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
624         set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
625         set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
626         set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
627         set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
628
629         call %__ProjectDir%\dotnet.cmd restore /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
630           /p:PortableBuild=true /maxcpucount /p:IncludeRestoreOnlyProjects=true /p:ArcadeBuild=true^
631           %__ProjectDir%\src\build.proj^
632           !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
633         if not !errorlevel! == 0 (
634             echo %__MsgPrefix%Error: Managed Product assemblies restore failed. Refer to the build log files for details:
635             echo     !__BuildLog!
636             echo     !__BuildWrn!
637             echo     !__BuildErr!
638             exit /b 1
639         )
640
641         call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
642           /p:PortableBuild=true /maxcpucount /p:ArcadeBuild=true^
643           %__ProjectDir%\src\build.proj^
644           !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
645         if not !errorlevel! == 0 (
646             echo %__MsgPrefix%Error: Managed Product assemblies build failed. Refer to the build log files for details:
647             echo     !__BuildLog!
648             echo     !__BuildWrn!
649             echo     !__BuildErr!
650             exit /b 1
651         )
652     )
653     if %__IbcOptimize% EQU 1 (
654         echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
655         set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
656         set IbcMergePackageVersionOutputFile="%__IntermediatesDir%\ibcmergeversion.txt"
657         call "%__ProjectDir%\dotnet.cmd" msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo %__CommonMSBuildArgs% /p:IbcMergePackageVersionOutputFile="!IbcMergePackageVersionOutputFile!"
658
659         if not !errorlevel! == 0 (
660             echo "Failed to determine IBC Merge version."
661             exit /b !errorlevel!
662         )
663         if not exist "!IbcMergePackageVersionOutputFile!" (
664             echo "Failed to determine IBC Merge version."
665             exit /b 1
666         )
667         
668         set /p __IbcMergeVersion=<"!IbcMergePackageVersionOutputFile!"
669
670         set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\tools\netcoreapp2.0\ibcmerge.dll
671         if exist !IbcMergePath! (
672             echo %__MsgPrefix%Optimizing using IBC training data
673             set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\System.Private.CoreLib.dll\
674             set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
675             set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
676
677             if exist "!InputAssemblyFile!" (
678                 set RawOptimizationDataFilePattern=!OptimizationDataDir!*.ibc
679                 set RawOptimizationDataFile=
680                 for %%x in (!RawOptimizationDataFilePattern!) do @(
681                   if [!RawOptimizationDataFile!] == [] (
682                     set RawOptimizationDataFile="%%x"
683                   ) else (
684                     set RawOptimizationDataFile=!RawOptimizationDataFile! "%%x"
685                   )
686                 )
687
688                 set IBCMergeCommand=%__ProjectDir%\dotnet.cmd --roll-forward-on-no-candidate-fx 2 "!IbcMergePath!"
689
690                 REM Merge the optimization data into the source DLL
691                 set NEXTCMD=!IBCMergeCommand! -q -f -delete -mo "!InputAssemblyFile!" !RawOptimizationDataFile!
692                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
693                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
694                 if NOT !errorlevel! == 0 (
695                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
696                     REM Put it in the same log, helpful for Jenkins
697                     type %__CrossGenCoreLibLog%
698                     goto CrossgenFailure
699                 )
700
701                 REM Verify that the optimization data has been merged
702                 set NEXTCMD=!IBCMergeCommand! -mi "!InputAssemblyFile!"
703                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
704                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
705                 if NOT !errorlevel! == 0 (
706                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
707                     REM Put it in the same log, helpful for Jenkins
708                     type %__CrossGenCoreLibLog%
709                     goto CrossgenFailure
710                 )
711
712                 REM Save the module as *.pgo to match the convention expected
713                 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
714             )
715
716             if exist "!TargetOptimizationDataFile!" (
717                 REM Customize IBCMerge's arguments depending on input props
718                 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
719
720                 REM Apply optimization data to the compiled assembly
721                 set NEXTCMD=!IBCMergeCommand! !IBCMergeArguments!
722                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
723                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
724                 if NOT !errorlevel! == 0 (
725                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
726                     REM Put it in the same log, helpful for Jenkins
727                     type %__CrossGenCoreLibLog%
728                     goto CrossgenFailure
729                 )
730
731                 REM Verify that the optimization data has been applied
732                 set NEXTCMD=!IBCMergeCommand! -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
733                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
734                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
735                 if NOT !errorlevel! == 0 (
736                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
737                     REM Put it in the same log, helpful for Jenkins
738                     type %__CrossGenCoreLibLog%
739                     goto CrossgenFailure
740                 )
741             ) else (
742                 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
743                 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
744                 REM Put it in the same log, helpful for Jenkins
745                 type %__CrossGenCoreLibLog%
746                 goto CrossgenFailure
747             )
748         ) else (
749           echo Could not find IBCMerge at !IbcMergePath!. Have you restored src/.nuget/optdata/ibcmerge.csproj?
750           goto CrossgenFailure
751         )
752     )
753
754     REM } Scope environment changes end
755     endlocal
756 )
757
758 REM =========================================================================================
759 REM ===
760 REM === Build native System.Private.CoreLib.
761 REM ===
762 REM =========================================================================================
763
764 REM Scope environment changes start {
765 setlocal
766
767 REM Need diasymreader.dll on your path for /CreatePdb
768 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
769
770 if %__BuildNativeCoreLib% EQU 1 (
771     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
772     if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
773
774     REM Need VS native tools environment for the **target** arch when running instrumented binaries
775     if %__PgoInstrument% EQU 1 (
776         set __VCExecArch=%__BuildArch%
777         if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
778         echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
779         call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
780         @if defined _echo @echo on
781         if NOT !errorlevel! == 0 (
782             echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
783             goto CrossgenFailure
784         )
785
786         REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
787         set __PgoRtPath=
788         for /f "tokens=*" %%f in ('where pgort*.dll') do (
789             if not defined __PgoRtPath set "__PgoRtPath=%%~f"
790         )
791         echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
792         copy /y "!__PgoRtPath!" "%__BinDir%" || (
793             echo %__MsgPrefix%Error: copy failed
794             goto CrossgenFailure
795         )
796         REM End HACK
797     )
798
799     if defined __CrossgenAltJit (
800         REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
801         REM so we don't need to save or unset these afterwards.
802         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
803         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
804         set COMPlus_AltJit=*
805         set COMPlus_AltJitNgen=*
806         set COMPlus_AltJitName=%__CrossgenAltJit%
807         set COMPlus_AltJitAssertOnNYI=1
808         set COMPlus_NoGuiOnAssert=1
809         set COMPlus_ContinueOnAssert=0
810     )
811
812     set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%\IL" /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
813     echo %__MsgPrefix%!NEXTCMD!
814     echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
815     !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
816     if NOT !errorlevel! == 0 (
817         echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
818         REM Put it in the same log, helpful for Jenkins
819         type %__CrossGenCoreLibLog%
820         goto CrossgenFailure
821     )
822
823     set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
824     echo %__MsgPrefix%!NEXTCMD!
825     echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
826     !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
827     if NOT !errorlevel! == 0 (
828         echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
829         REM Put it in the same log, helpful for Jenkins
830         type %__CrossGenCoreLibLog%
831         goto CrossgenFailure
832     )
833 )
834
835 REM } Scope environment changes end
836 endlocal
837
838 REM =========================================================================================
839 REM ===
840 REM === Build packages
841 REM ===
842 REM =========================================================================================
843
844 if %__BuildPackages% EQU 1 (
845     REM Scope environment changes start {
846     setlocal
847
848     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
849
850     set __BuildLog="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.binlog"
851
852     REM The conditions as to what to build are captured in the builds file.
853     REM Package build uses the Arcade system and scripts, relying on it to restore required toolsets as part of build
854     powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\build.ps1"^
855         -r -b -projects %__SourceDir%\.nuget\packages.builds^
856         -verbosity minimal /nodeReuse:false /bl:!__BuildLog!^
857         /p:PortableBuild=true /p:ArcadeBuild=true^
858         /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
859     if not !errorlevel! == 0 (
860         echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log file for details:
861         echo     !__BuildLog!
862         exit /b !errorlevel!
863     )
864
865     REM } Scope environment changes end
866     endlocal
867 )
868
869 REM =========================================================================================
870 REM ===
871 REM === Test build section
872 REM ===
873 REM =========================================================================================
874
875 if %__BuildTests% EQU 1 (
876     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
877
878     set  __PriorityArg=
879     if defined __Priority (
880         set __PriorityArg=-priority=%__Priority%
881     )
882     set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% !__PriorityArg! %__UnprocessedBuildArgs%
883     echo %__MsgPrefix%!NEXTCMD!
884     !NEXTCMD!
885
886     if not !errorlevel! == 0 (
887         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
888         exit /b 1
889     )
890 ) else if %__GenerateLayout% EQU 1 (
891     echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
892
893     set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly msbuildargs %__UnprocessedBuildArgs%
894     echo %__MsgPrefix%!NEXTCMD!
895     !NEXTCMD!
896
897     if not !errorlevel! == 0 (
898         REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
899         exit /b 1
900     )
901 )
902
903 REM =========================================================================================
904 REM ===
905 REM === All builds complete!
906 REM ===
907 REM =========================================================================================
908
909 echo %__MsgPrefix%Build succeeded.  Finished at %TIME%
910 echo %__MsgPrefix%Product binaries are available at !__BinDir!
911 exit /b 0
912
913 REM =========================================================================================
914 REM ===
915 REM === Handle the "all" case.
916 REM ===
917 REM =========================================================================================
918
919 :BuildAll
920
921 set __BuildArchList=
922
923 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
924 if %__TotalSpecifiedBuildArch% EQU 0 (
925     REM Nothing specified means we want to build all architectures.
926     set __BuildArchList=x64 x86 arm arm64
927 )
928
929 REM Otherwise, add all the specified architectures to the list.
930
931 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
932 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
933 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
934 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
935
936 set __BuildTypeList=
937
938 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
939 if %__TotalSpecifiedBuildType% EQU 0 (
940     REM Nothing specified means we want to build all build types.
941     set __BuildTypeList=Debug Checked Release
942 )
943
944 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
945 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
946 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
947
948 REM Create a temporary file to collect build results. We always build all flavors specified, and
949 REM report a summary of the results at the end.
950
951 set __AllBuildSuccess=true
952 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
953 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
954
955 for %%i in (%__BuildArchList%) do (
956     for %%j in (%__BuildTypeList%) do (
957         call :BuildOne %%i %%j
958     )
959 )
960
961 if %__AllBuildSuccess%==true (
962     echo %__MsgPrefix%All builds succeeded!
963     exit /b 0
964 ) else (
965     echo %__MsgPrefix%Builds failed:
966     type %__BuildResultFile%
967     del /f /q %__BuildResultFile%
968     exit /b 1
969 )
970
971 REM This code is unreachable, but leaving it nonetheless, just in case things change.
972 exit /b 99
973
974 :BuildOne
975 set __BuildArch=%1
976 set __BuildType=%2
977 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
978 echo %__MsgPrefix%Invoking: %__NextCmd%
979 %__NextCmd%
980 if not !errorlevel! == 0 (
981     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
982     set __AllBuildSuccess=false
983 )
984 exit /b 0
985
986 REM =========================================================================================
987 REM ===
988 REM === Helper routines
989 REM ===
990 REM =========================================================================================
991
992 :CrossgenFailure
993 exit /b 1
994
995 :Usage
996 echo.
997 echo Build the CoreCLR repo.
998 echo.
999 echo Usage:
1000 echo     build.cmd [option1] [option2]
1001 echo or:
1002 echo     build.cmd all [option1] [option2]
1003 echo.
1004 echo All arguments are optional. The options are:
1005 echo.
1006 echo.-? -h -help --help: view this message.
1007 echo -all: Builds all configurations and platforms.
1008 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
1009 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
1010 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
1011 echo     or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
1012 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
1013 echo     respectively^).
1014 echo     add nativemscorlib to go further and build the native image for designated mscorlib.
1015 echo -nopgooptimize: do not use profile guided optimizations.
1016 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
1017 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
1018 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
1019 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
1020 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
1021 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
1022 echo -skipconfigure: skip CMake ^(default: CMake is run^)
1023 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
1024 echo -skipnative: skip building native components ^(default: native components are built^).
1025 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
1026 echo -skiptests: skip building tests ^(default: tests are built^).
1027 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
1028 echo -skipmanagedtools: skip build tools such as R2R dump and RunInContext
1029 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1030 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1031 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1032 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1033 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1034 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1035 echo portable : build for portable RID.
1036 echo.
1037 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1038 echo one or more build architectures or types is specified, then only those build architectures
1039 echo and types are built.
1040 echo.
1041 echo For example:
1042 echo     build -all
1043 echo        -- builds all architectures, and all build types per architecture
1044 echo     build -all -x86
1045 echo        -- builds all build types for x86
1046 echo     build -all -x64 -x86 -Checked -Release
1047 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
1048 exit /b 1
1049
1050 :NoDIA
1051 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1052 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1053 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1054 of the previous version to "%VSINSTALLDIR%" and then build.
1055 REM DIA SDK not included in Express editions
1056 echo Visual Studio Express does not include the DIA SDK. ^
1057 You need Visual Studio 2017 or 2019 (Community is free).
1058 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
1059 exit /b 1