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