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