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