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