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