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