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