Enhance the Missing Resources Exception Message (#24645)
[platform/upstream/coreclr.git] / build.cmd
1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
3
4 :: Define a prefix for most output progress messages that come from this script. That makes
5 :: it easier to see where these are coming from. Note that there is a trailing space here.
6 set "__MsgPrefix=BUILD: "
7
8 echo %__MsgPrefix%Starting Build at %TIME%
9
10 set __ThisScriptFull="%~f0"
11 set __ThisScriptDir="%~dp0"
12
13 call "%__ThisScriptDir%"\setup_vs_tools.cmd
14 if NOT '%ERRORLEVEL%' == '0' exit /b 1
15
16 if defined VS160COMNTOOLS (
17     set "__VSToolsRoot=%VS160COMNTOOLS%"
18     set "__VCToolsRoot=%VS160COMNTOOLS%\..\..\VC\Auxiliary\Build"
19     set __VSVersion=vs2019
20 ) else if defined VS150COMNTOOLS (
21     set "__VSToolsRoot=%VS150COMNTOOLS%"
22     set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
23     set __VSVersion=vs2017
24 )
25
26 :: Work around Jenkins CI + msbuild problem: Jenkins sometimes creates very large environment
27 :: variables, and msbuild can't handle environment blocks with such large variables. So clear
28 :: out the variables that might be too large.
29 set ghprbCommentBody=
30
31 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
32 ::      __BuildArch         -- default: x64
33 ::      __BuildType         -- default: Debug
34 ::      __BuildOS           -- default: Windows_NT
35 ::      __ProjectDir        -- default: directory of the dir.props file
36 ::      __SourceDir         -- default: %__ProjectDir%\src\
37 ::      __PackagesDir       -- default: %__ProjectDir%\.packages\
38 ::      __RootBinDir        -- default: %__ProjectDir%\bin\
39 ::      __BinDir            -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
40 ::      __IntermediatesDir
41 ::      __PackagesBinDir    -- default: %__BinDir%\.nuget
42 ::      __TestWorkingDir    -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
43 ::
44 :: Thus, these variables are not simply internal to this script!
45
46 :: Set the default arguments for build
47 set __BuildArch=x64
48 set __BuildType=Debug
49 set __BuildOS=Windows_NT
50
51 :: Set the various build properties here so that CMake and MSBuild can pick them up
52 set "__ProjectDir=%~dp0"
53 :: remove trailing slash
54 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
55 set "__ProjectFilesDir=%__ProjectDir%"
56 set "__SourceDir=%__ProjectDir%\src"
57 set "__PackagesDir=%DotNetRestorePackagesPath%"
58 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\.packages"
59 set "__RootBinDir=%__ProjectDir%\bin"
60 set "__LogsDir=%__RootBinDir%\Logs"
61 set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"
62
63 set __BuildAll=
64
65 set __BuildArchX64=0
66 set __BuildArchX86=0
67 set __BuildArchArm=0
68 set __BuildArchArm64=0
69
70 set __BuildTypeDebug=0
71 set __BuildTypeChecked=0
72 set __BuildTypeRelease=0
73
74 set __PgoInstrument=0
75 set __PgoOptimize=1
76 set __EnforcePgo=0
77 set __IbcTuning=
78 set __IbcOptimize=0
79 set __IbcOnly=0
80
81 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
82 REM when using "all".
83 set __PassThroughArgs=
84
85 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
86 set "__args= %*"
87 set processedArgs=
88 set __UnprocessedBuildArgs=
89 set __CommonMSBuildArgs=
90
91 set __BuildCoreLib=1
92 set __BuildSOS=1
93 set __BuildNative=1
94 set __BuildCrossArchNative=0
95 set __SkipCrossArchNative=0
96 set __BuildTests=1
97 set __BuildPackages=1
98 set __BuildNativeCoreLib=1
99 set __BuildManagedTools=1
100 set __RestoreOptData=1
101 set __GenerateLayout=0
102 set __CrossgenAltJit=
103 set __SkipRestoreArg=/p:RestoreDuringBuild=true
104 set __OfficialBuildIdArg=
105 set __CrossArch=
106 set __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 %__BuildCoreLib% EQU 1 (
423     echo %__MsgPrefix%Laying out dynamically generated EventSource classes
424     "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
425 )
426
427 REM =========================================================================================
428 REM ===
429 REM === Build Cross-Architecture Native Components (if applicable)
430 REM ===
431 REM =========================================================================================
432
433 if %__BuildCrossArchNative% EQU 1 (
434     REM Scope environment changes start {
435     setlocal
436
437     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
438
439     REM Set the environment for the cross-arch native build
440     set __VCBuildArch=x86_amd64
441     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
442
443     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
444     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
445     @if defined _echo @echo on
446
447     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
448     if defined __SkipConfigure goto SkipConfigureCrossBuild
449
450     pushd "%__CrossCompIntermediatesDir%"
451     set __CMakeBinDir=%__CrossComponentBinDir%
452     set "__CMakeBinDir=!__CMakeBinDir:\=/!"
453     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"
454     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
455     @if defined _echo @echo on
456     popd
457
458 :SkipConfigureCrossBuild
459     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
460         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
461         exit /b 1
462     )
463
464     if defined __ConfigureOnly goto SkipCrossCompBuild
465
466     set __BuildLogRootName=Cross
467     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
468     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
469     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
470     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
471     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
472     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
473     set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
474
475     call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
476       /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
477       /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
478       /p:UsePartialNGENOptimization=false /maxcpucount^
479       %__CrossCompIntermediatesDir%\install.vcxproj^
480       !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
481
482     if not !errorlevel! == 0 (
483         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
484         echo     !__BuildLog!
485         echo     !__BuildWrn!
486         echo     !__BuildErr!
487         exit /b 1
488     )
489
490 :SkipCrossCompBuild
491     REM } Scope environment changes end
492     endlocal
493 )
494
495 REM =========================================================================================
496 REM ===
497 REM === Build the CLR VM
498 REM ===
499 REM =========================================================================================
500
501 if %__BuildNative% EQU 1 (
502     REM Scope environment changes start {
503     setlocal
504
505     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
506
507     REM Set the environment for the native build
508     set __VCBuildArch=x86_amd64
509     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
510     if /i "%__BuildArch%" == "arm" (
511         set __VCBuildArch=x86_arm
512         REM Make CMake pick the highest installed version in the 10.0.* range
513         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
514         set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
515     )
516     if /i "%__BuildArch%" == "arm64" (
517         set __VCBuildArch=x86_arm64
518
519         REM Make CMake pick the highest installed version in the 10.0.* range
520         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
521         set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
522     )
523
524     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
525     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
526     @if defined _echo @echo on
527
528     if not defined VSINSTALLDIR (
529         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
530         exit /b 1
531     )
532     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
533
534     if defined __SkipConfigure goto SkipConfigure
535
536     echo %__MsgPrefix%Regenerating the Visual Studio solution
537
538     echo Cross Arch Defines !___CrossBuildDefine!
539
540     pushd "%__IntermediatesDir%"
541     set __ExtraCmakeArgs=!___SDKVersion! !___CrossBuildDefine! "-DCLR_CMAKE_TARGET_OS=%__BuildOS%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%"
542     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
543     @if defined _echo @echo on
544     popd
545
546 :SkipConfigure
547     if not exist "%__IntermediatesDir%\install.vcxproj" (
548         echo %__MsgPrefix%Error: failed to generate native component build project!
549         exit /b 1
550     )
551
552     if defined __ConfigureOnly goto SkipNativeBuild
553
554     set __BuildLogRootName=CoreCLR
555     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
556     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
557     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
558     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
559     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
560     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
561     set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
562
563     call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
564       /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
565       /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
566       /p:UsePartialNGENOptimization=false /maxcpucount %__IntermediatesDir%\install.vcxproj^
567       !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
568
569     if not !errorlevel! == 0 (
570         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
571         echo     !__BuildLog!
572         echo     !__BuildWrn!
573         echo     !__BuildErr!
574         exit /b 1
575     )
576
577 :SkipNativeBuild
578     REM } Scope environment changes end
579     endlocal
580 )
581
582 REM =========================================================================================
583 REM ===
584 REM === CoreLib and NuGet package build section.
585 REM ===
586 REM =========================================================================================
587
588 if %__BuildCoreLib% EQU 1 (
589     REM Scope environment changes start {
590     setlocal
591
592     if %__IbcOnly% EQU 0 (
593         echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
594         rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
595         set Platform=
596
597         set __ExtraBuildArgs=
598
599         if "%__BuildSOS%" == "0" (
600             set __ExtraBuildArgs=!__ExtraBuildArgs! /p:SkipSOS=true
601         )
602
603         if "%__BuildManagedTools%" == "1" (
604             set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
605         )
606
607         if "%__SkipNugetPackage%" == "1" (
608             set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=false
609         ) else (
610             set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=true
611         )
612
613         set __BuildLogRootName=System.Private.CoreLib
614         set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
615         set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
616         set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
617         set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
618         set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
619         set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
620         set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
621
622         call %__ProjectDir%\dotnet.cmd restore /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
623           /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
624           /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
625           /p:UsePartialNGENOptimization=false /maxcpucount /p:IncludeRestoreOnlyProjects=true /p:ArcadeBuild=true^
626           %__ProjectDir%\src\build.proj^
627           !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
628         if not !errorlevel! == 0 (
629             echo %__MsgPrefix%Error: Managed Product assemblies restore failed. Refer to the build log files for details:
630             echo     !__BuildLog!
631             echo     !__BuildWrn!
632             echo     !__BuildErr!
633             exit /b 1
634         )
635
636         call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
637           /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
638           /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
639           /p:UsePartialNGENOptimization=false /maxcpucount /p:DotNetUseShippingVersions=true /p:ArcadeBuild=true^
640           %__ProjectDir%\src\build.proj^
641           !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
642         if not !errorlevel! == 0 (
643             echo %__MsgPrefix%Error: Managed Product assemblies build failed. Refer to the build log files for details:
644             echo     !__BuildLog!
645             echo     !__BuildWrn!
646             echo     !__BuildErr!
647             exit /b 1
648         )
649     )
650     if %__IbcOptimize% EQU 1 (
651         echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
652         set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
653         for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
654             set __IbcMergeVersion=%%s
655         )
656   
657         set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\tools\netcoreapp2.0\ibcmerge.dll
658         if exist !IbcMergePath! (
659             echo %__MsgPrefix%Optimizing using IBC training data
660             set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\System.Private.CoreLib.dll\
661             set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
662             set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
663
664             if exist "!InputAssemblyFile!" (
665                 set RawOptimizationDataFilePattern=!OptimizationDataDir!*.ibc
666                 set RawOptimizationDataFile=
667                 for %%x in (!RawOptimizationDataFilePattern!) do @(
668                   if [!RawOptimizationDataFile!] == [] (
669                     set RawOptimizationDataFile="%%x"
670                   ) else (
671                     set RawOptimizationDataFile=!RawOptimizationDataFile! "%%x"
672                   )
673                 )
674
675                 set IBCMergeCommand=%__ProjectDir%\dotnet.cmd --roll-forward-on-no-candidate-fx 2 "!IbcMergePath!"
676
677                 REM Merge the optimization data into the source DLL
678                 set NEXTCMD=!IBCMergeCommand! -q -f -delete -mo "!InputAssemblyFile!" !RawOptimizationDataFile!
679                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
680                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
681                 if NOT !errorlevel! == 0 (
682                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
683                     REM Put it in the same log, helpful for Jenkins
684                     type %__CrossGenCoreLibLog%
685                     goto CrossgenFailure
686                 )
687
688                 REM Verify that the optimization data has been merged
689                 set NEXTCMD=!IBCMergeCommand! -mi "!InputAssemblyFile!"
690                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
691                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
692                 if NOT !errorlevel! == 0 (
693                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
694                     REM Put it in the same log, helpful for Jenkins
695                     type %__CrossGenCoreLibLog%
696                     goto CrossgenFailure
697                 )
698
699                 REM Save the module as *.pgo to match the convention expected
700                 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
701             )
702
703             if exist "!TargetOptimizationDataFile!" (
704                 REM Customize IBCMerge's arguments depending on input props
705                 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
706
707                 REM Apply optimization data to the compiled assembly
708                 set NEXTCMD=!IBCMergeCommand! !IBCMergeArguments!
709                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
710                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
711                 if NOT !errorlevel! == 0 (
712                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
713                     REM Put it in the same log, helpful for Jenkins
714                     type %__CrossGenCoreLibLog%
715                     goto CrossgenFailure
716                 )
717                 
718                 REM Verify that the optimization data has been applied
719                 set NEXTCMD=!IBCMergeCommand! -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
720                 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
721                 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
722                 if NOT !errorlevel! == 0 (
723                     echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
724                     REM Put it in the same log, helpful for Jenkins
725                     type %__CrossGenCoreLibLog%
726                     goto CrossgenFailure
727                 )
728             ) else (
729                 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
730                 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
731                 REM Put it in the same log, helpful for Jenkins
732                 type %__CrossGenCoreLibLog%
733                 goto CrossgenFailure
734             )
735         ) else (
736           echo Could not find IBCMerge at !IbcMergePath!. Have you restored src/.nuget/optdata/ibcmerge.csproj?
737           goto CrossgenFailure
738         )
739     )
740
741     REM } Scope environment changes end
742     endlocal
743 )
744
745 REM =========================================================================================
746 REM ===
747 REM === Build native System.Private.CoreLib.
748 REM ===
749 REM =========================================================================================
750
751 REM Scope environment changes start {
752 setlocal
753
754 REM Need diasymreader.dll on your path for /CreatePdb
755 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
756
757 if %__BuildNativeCoreLib% EQU 1 (
758     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
759     if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
760
761     REM Need VS native tools environment for the **target** arch when running instrumented binaries
762     if %__PgoInstrument% EQU 1 (
763         set __VCExecArch=%__BuildArch%
764         if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
765         echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
766         call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
767         @if defined _echo @echo on
768         if NOT !errorlevel! == 0 (
769             echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
770             goto CrossgenFailure
771         )
772
773         REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
774         set __PgoRtPath=
775         for /f "tokens=*" %%f in ('where pgort*.dll') do (
776             if not defined __PgoRtPath set "__PgoRtPath=%%~f"
777         )
778         echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
779         copy /y "!__PgoRtPath!" "%__BinDir%" || (
780             echo %__MsgPrefix%Error: copy failed
781             goto CrossgenFailure
782         )
783         REM End HACK
784     )
785
786     if defined __CrossgenAltJit (
787         REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
788         REM so we don't need to save or unset these afterwards.
789         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
790         echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
791         set COMPlus_AltJit=*
792         set COMPlus_AltJitNgen=*
793         set COMPlus_AltJitName=%__CrossgenAltJit%
794         set COMPlus_AltJitAssertOnNYI=1
795         set COMPlus_NoGuiOnAssert=1
796         set COMPlus_ContinueOnAssert=0
797     )
798
799     set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%\IL" /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
800     echo %__MsgPrefix%!NEXTCMD!
801     echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
802     !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
803     if NOT !errorlevel! == 0 (
804         echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
805         REM Put it in the same log, helpful for Jenkins
806         type %__CrossGenCoreLibLog%
807         goto CrossgenFailure
808     )
809
810     set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
811     echo %__MsgPrefix%!NEXTCMD!
812     echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
813     !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
814     if NOT !errorlevel! == 0 (
815         echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
816         REM Put it in the same log, helpful for Jenkins
817         type %__CrossGenCoreLibLog%
818         goto CrossgenFailure
819     )
820 )
821
822 REM } Scope environment changes end
823 endlocal
824
825 REM =========================================================================================
826 REM ===
827 REM === Build packages
828 REM ===
829 REM =========================================================================================
830
831 if %__BuildPackages% EQU 1 (
832     REM Scope environment changes start {
833     setlocal
834
835     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
836
837     set __BuildLogRootName=Nuget
838     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
839     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
840     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
841     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
842     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
843     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
844     set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
845
846     REM The conditions as to what to build are captured in the builds file.
847     call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
848       /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
849       /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
850       /p:UsePartialNGENOptimization=false /maxcpucount^
851       %__SourceDir%\.nuget\packages.builds^
852       !__Logging! /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
853
854     if not !errorlevel! == 0 (
855         echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
856         echo     !__BuildLog!
857         echo     !__BuildWrn!
858         echo     !__BuildErr!
859         exit /b 1
860     )
861
862     REM } Scope environment changes end
863     endlocal
864 )
865
866 REM =========================================================================================
867 REM ===
868 REM === Test build section
869 REM ===
870 REM =========================================================================================
871
872 if %__BuildTests% EQU 1 (
873     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
874
875     set  __PriorityArg=
876     if defined __Priority (
877         set __PriorityArg=-priority=%__Priority%
878     )
879     set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% !__PriorityArg! %__UnprocessedBuildArgs%
880     echo %__MsgPrefix%!NEXTCMD!
881     !NEXTCMD!
882
883     if not !errorlevel! == 0 (
884         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
885         exit /b 1
886     )
887 ) else if %__GenerateLayout% EQU 1 (
888     echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
889
890     set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly msbuildargs %__UnprocessedBuildArgs%
891     echo %__MsgPrefix%!NEXTCMD!
892     !NEXTCMD!
893
894     if not !errorlevel! == 0 (
895         REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
896         exit /b 1
897     )
898 )
899
900 REM =========================================================================================
901 REM ===
902 REM === All builds complete!
903 REM ===
904 REM =========================================================================================
905
906 echo %__MsgPrefix%Build succeeded.  Finished at %TIME%
907 echo %__MsgPrefix%Product binaries are available at !__BinDir!
908 exit /b 0
909
910 REM =========================================================================================
911 REM ===
912 REM === Handle the "all" case.
913 REM ===
914 REM =========================================================================================
915
916 :BuildAll
917
918 set __BuildArchList=
919
920 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
921 if %__TotalSpecifiedBuildArch% EQU 0 (
922     REM Nothing specified means we want to build all architectures.
923     set __BuildArchList=x64 x86 arm arm64
924 )
925
926 REM Otherwise, add all the specified architectures to the list.
927
928 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
929 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
930 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
931 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
932
933 set __BuildTypeList=
934
935 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
936 if %__TotalSpecifiedBuildType% EQU 0 (
937     REM Nothing specified means we want to build all build types.
938     set __BuildTypeList=Debug Checked Release
939 )
940
941 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
942 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
943 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
944
945 REM Create a temporary file to collect build results. We always build all flavors specified, and
946 REM report a summary of the results at the end.
947
948 set __AllBuildSuccess=true
949 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
950 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
951
952 for %%i in (%__BuildArchList%) do (
953     for %%j in (%__BuildTypeList%) do (
954         call :BuildOne %%i %%j
955     )
956 )
957
958 if %__AllBuildSuccess%==true (
959     echo %__MsgPrefix%All builds succeeded!
960     exit /b 0
961 ) else (
962     echo %__MsgPrefix%Builds failed:
963     type %__BuildResultFile%
964     del /f /q %__BuildResultFile%
965     exit /b 1
966 )
967
968 REM This code is unreachable, but leaving it nonetheless, just in case things change.
969 exit /b 99
970
971 :BuildOne
972 set __BuildArch=%1
973 set __BuildType=%2
974 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
975 echo %__MsgPrefix%Invoking: %__NextCmd%
976 %__NextCmd%
977 if not !errorlevel! == 0 (
978     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
979     set __AllBuildSuccess=false
980 )
981 exit /b 0
982
983 REM =========================================================================================
984 REM ===
985 REM === Helper routines
986 REM ===
987 REM =========================================================================================
988
989 :CrossgenFailure
990 exit /b 1
991
992 :Usage
993 echo.
994 echo Build the CoreCLR repo.
995 echo.
996 echo Usage:
997 echo     build.cmd [option1] [option2]
998 echo or:
999 echo     build.cmd all [option1] [option2]
1000 echo.
1001 echo All arguments are optional. The options are:
1002 echo.
1003 echo.-? -h -help --help: view this message.
1004 echo -all: Builds all configurations and platforms.
1005 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
1006 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
1007 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
1008 echo     or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
1009 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
1010 echo     respectively^).
1011 echo     add nativemscorlib to go further and build the native image for designated mscorlib.
1012 echo -nopgooptimize: do not use profile guided optimizations.
1013 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
1014 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
1015 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
1016 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
1017 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
1018 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
1019 echo -skipconfigure: skip CMake ^(default: CMake is run^)
1020 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
1021 echo -skipnative: skip building native components ^(default: native components are built^).
1022 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
1023 echo -skiptests: skip building tests ^(default: tests are built^).
1024 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
1025 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1026 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1027 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1028 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1029 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1030 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1031 echo portable : build for portable RID.
1032 echo.
1033 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1034 echo one or more build architectures or types is specified, then only those build architectures
1035 echo and types are built.
1036 echo.
1037 echo For example:
1038 echo     build -all
1039 echo        -- builds all architectures, and all build types per architecture
1040 echo     build -all -x86
1041 echo        -- builds all build types for x86
1042 echo     build -all -x64 -x86 -Checked -Release
1043 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
1044 exit /b 1
1045
1046 :NoDIA
1047 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1048 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1049 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1050 of the previous version to "%VSINSTALLDIR%" and then build.
1051 REM DIA SDK not included in Express editions
1052 echo Visual Studio Express does not include the DIA SDK. ^
1053 You need Visual Studio 2017 or 2019 (Community is free).
1054 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
1055 exit /b 1