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