1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
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: "
8 echo %__MsgPrefix%Starting Build at %TIME%
9 set __ThisScriptFull="%~f0"
10 set __ThisScriptDir="%~dp0"
12 :: Default to highest Visual Studio version available
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.
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.
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
28 if defined VisualStudioVersion (
29 if not defined __VSVersion echo %__MsgPrefix%Detected Visual Studio %VisualStudioVersion% developer command ^prompt environment
33 echo %__MsgPrefix%Searching ^for Visual Studio 2017 or 2015 installation
34 set _VSWHERE="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
36 for /f "usebackq tokens=*" %%i in (`%_VSWHERE% -latest -prerelease -property installationPath`) do set _VSCOMNTOOLS=%%i\Common7\Tools
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.
45 call "%_VSCOMNTOOLS%\VsDevCmd.bat"
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' (
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.
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"
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
66 if defined VS150COMNTOOLS (
67 set "__VSToolsRoot=%VS150COMNTOOLS%"
68 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
69 set __VSVersion=vs2017
71 set "__VSToolsRoot=%VS140COMNTOOLS%"
72 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
73 set __VSVersion=vs2015
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%\
86 :: __PackagesBinDir -- default: %__BinDir%\.nuget
87 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
89 :: Thus, these variables are not simply internal to this script!
91 :: Set the default arguments for build
94 set __BuildOS=Windows_NT
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="
114 set __BuildArchArm64=0
116 set __BuildTypeDebug=0
117 set __BuildTypeChecked=0
118 set __BuildTypeRelease=0
120 set __PgoInstrument=0
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=
129 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
132 set __UnprocessedBuildArgs=
139 set __BuildPackages=1
140 set __BuildNativeCoreLib=1
141 set __RestoreOptData=1
142 set __CrossgenAltJit=
144 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
146 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
147 @REM and allow the "-priority=1" syntax.
151 if "%1" == "" goto ArgsDone
153 if /i "%1" == "-?" goto Usage
154 if /i "%1" == "-h" goto Usage
155 if /i "%1" == "-help" goto Usage
156 if /i "%1" == "--help" goto Usage
159 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
160 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
161 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
162 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
163 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
165 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
166 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
167 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
169 REM TODO these are deprecated remove them eventually
170 REM don't add more, use the - syntax instead
171 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
183 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
184 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
185 if [!__PassThroughArgs!]==[] (
186 set __PassThroughArgs=%1
188 set __PassThroughArgs=%__PassThroughArgs% %1
191 if /i "%1" == "-freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
192 if /i "%1" == "-linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
193 if /i "%1" == "-netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
194 if /i "%1" == "-osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
195 if /i "%1" == "-windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
196 if /i "%1" == "-nativemscorlib" (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
197 if /i "%1" == "-configureonly" (set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
198 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "-usenmakemakefiles" (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
210 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
212 REM TODO these are deprecated remove them eventually
213 REM don't add more, use the - syntax instead
214 if /i "%1" == "freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
215 if /i "%1" == "linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
216 if /i "%1" == "netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
217 if /i "%1" == "osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
218 if /i "%1" == "windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
219 if /i "%1" == "nativemscorlib" (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
220 if /i "%1" == "configureonly" (set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
221 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
222 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
223 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
224 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
225 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
226 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
227 if /i "%1" == "usenmakemakefiles" (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
228 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
229 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
230 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
231 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
232 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
234 if [!processedArgs!]==[] (
235 set __UnprocessedBuildArgs=%__args%
237 set __UnprocessedBuildArgs=%__args%
238 for %%t in (!processedArgs!) do (
239 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
245 @REM Special handling for -priority=N argument.
246 if defined __Priority (
247 if defined __PassThroughArgs (
248 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
250 set __PassThroughArgs=-priority=%__Priority%
252 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
255 if %__PgoOptimize%==0 set __RestoreOptData=0
257 if defined __BuildAll goto BuildAll
259 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
260 if %__TotalSpecifiedBuildArch% GTR 1 (
261 echo Error: more than one build architecture specified, but "all" not specified.
265 if %__BuildArchX64%==1 set __BuildArch=x64
266 if %__BuildArchX86%==1 set __BuildArch=x86
267 if %__BuildArchArm%==1 (
271 if %__BuildArchArm64%==1 (
272 set __BuildArch=arm64
276 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
277 if %__TotalSpecifiedBuildType% GTR 1 (
278 echo Error: more than one build type specified, but "all" not specified.
282 if %__BuildTypeDebug%==1 set __BuildType=Debug
283 if %__BuildTypeChecked%==1 set __BuildType=Checked
284 if %__BuildTypeRelease%==1 set __BuildType=Release
286 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
288 if %__EnforcePgo%==1 (
289 if %__BuildArchArm%==1 (
290 echo NOTICE: enforcepgo does nothing on arm architecture
292 if %__BuildArchArm64%==1 (
293 echo NOTICE: enforcepgo does nothing on arm64 architecture
297 REM Determine if this is a cross-arch build
299 if /i "%__BuildArch%"=="arm64" (
300 set __DoCrossArchBuild=1
303 if /i "%__BuildArch%"=="arm" (
304 set __DoCrossArchBuild=1
307 :: Set the remaining variables based upon the determined build configuration
308 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
309 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
310 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
311 set "__PackagesBinDir=%__BinDir%\.nuget"
312 set "__TestRootDir=%__RootBinDir%\tests"
313 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
314 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
315 set "__CrossComponentBinDir=%__BinDir%"
316 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
319 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
320 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
321 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
323 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
324 set "__CMakeBinDir=%__BinDir%"
325 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
327 if not exist "%__BinDir%" md "%__BinDir%"
328 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
329 if not exist "%__LogsDir%" md "%__LogsDir%"
331 REM It is convenient to have your Nuget search path include the location where the build
332 REM will place packages. However nuget used during the build will fail if that directory
333 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
334 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
336 echo %__MsgPrefix%Commencing CoreCLR Repo build
338 :: Set the remaining variables based upon the determined build configuration
340 echo %__MsgPrefix%Checking prerequisites
341 :: Eval the output from probe-win1.ps1
342 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
344 REM NumberOfCores is an WMI property providing number of physical cores on machine
345 REM processor(s). It is used to set optimal level of CL parallelism during native build step
346 if not defined NumberOfCores (
347 REM Determine number of physical processor cores available on machine
348 for /f "tokens=*" %%I in (
349 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
352 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
354 REM =========================================================================================
356 REM === Start the build steps
358 REM =========================================================================================
360 @if defined _echo @echo on
362 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
364 REM =========================================================================================
366 REM === Restore optimization profile data
368 REM =========================================================================================
370 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
371 echo %__MsgPrefix%Restoring the OptimizationData Package
372 @call %__ProjectDir%\run.cmd sync -optdata
373 if not !errorlevel! == 0 (
374 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
379 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
380 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
381 if not exist "%DotNetCli%" (
382 echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
385 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
386 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
387 set __PgoOptDataVersion=%%s
389 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
390 set __IbcOptDataVersion=%%s
393 REM =========================================================================================
395 REM === Generate source files for eventing
397 REM =========================================================================================
399 REM Find python and set it to the variable PYTHON
400 echo import sys; print sys.executable | (python2.7 || python2 || py -2 || python) > %TEMP%\pythonlocation.txt 2> NUL
401 set /p PYTHON=<%TEMP%\pythonlocation.txt
402 if NOT DEFINED PYTHON (
403 echo %__MsgPrefix%Error: Could not find a python 2.7 installation
407 if /i "%__DoCrossArchBuild%"=="1" (
408 set __IntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
409 set __IntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
411 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
412 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
415 echo Laying out dynamically generated files consumed by the build system
416 echo Laying out dynamically generated Event test files and etmdummy stub functions
417 %PYTHON% -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
419 echo Laying out dynamically generated EventPipe Implementation
420 %PYTHON% -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
422 echo Laying out ETW event logging interface
423 %PYTHON% -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
425 REM =========================================================================================
427 REM === Build the CLR VM
429 REM =========================================================================================
431 if %__BuildNative% EQU 1 (
432 REM Scope environment changes start {
435 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
437 set __NativePlatformArgs=-platform=%__BuildArch%
438 if not "%__ToolsetDir%" == "" ( set __NativePlatformArgs=-useEnv )
440 if not "%__ToolsetDir%" == "" (
441 rem arm64 builds currently use private toolset which has not been released yet
442 REM TODO, remove once the toolset is open.
447 :: Set the environment for the native build
448 set __VCBuildArch=x86_amd64
449 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
450 if /i "%__BuildArch%" == "arm" (
451 set __VCBuildArch=x86_arm
453 REM Make CMake pick the highest installed version in the 10.0.* range
454 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
456 if /i "%__BuildArch%" == "arm64" (
457 set __VCBuildArch=x86_arm64
459 REM Make CMake pick the highest installed version in the 10.0.* range
460 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
463 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
464 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
465 @if defined _echo @echo on
467 if not defined VSINSTALLDIR (
468 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
471 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
474 if defined __SkipConfigure goto SkipConfigure
476 echo %__MsgPrefix%Regenerating the Visual Studio solution
478 pushd "%__IntermediatesDir%"
479 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%"
480 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
481 @if defined _echo @echo on
485 if defined __ConfigureOnly goto SkipNativeBuild
487 if not exist "%__IntermediatesDir%\install.vcxproj" (
488 echo %__MsgPrefix%Error: failed to generate native component build project!
492 set __BuildLogRootName=CoreCLR
493 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
494 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
495 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
496 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
497 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
498 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
500 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %__NativePlatformArgs% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
502 if not !errorlevel! == 0 (
503 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
511 REM } Scope environment changes end
515 REM =========================================================================================
517 REM === Build Cross-Architecture Native Components (if applicable)
519 REM =========================================================================================
521 if /i "%__DoCrossArchBuild%"=="1" (
522 REM Scope environment changes start {
525 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
527 :: Set the environment for the native build
528 set __VCBuildArch=x86_amd64
529 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
531 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
532 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
533 @if defined _echo @echo on
535 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
536 if defined __SkipConfigure goto SkipConfigureCrossBuild
538 pushd "%__CrossCompIntermediatesDir%"
539 set __CMakeBinDir=%__CrossComponentBinDir%
540 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
541 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"
542 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
543 @if defined _echo @echo on
546 :SkipConfigureCrossBuild
547 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
548 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
552 if defined __ConfigureOnly goto SkipCrossCompBuild
554 set __BuildLogRootName=Cross
555 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
556 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
557 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
558 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
559 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
560 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
562 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
564 if not !errorlevel! == 0 (
565 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
573 REM } Scope environment changes end
577 REM =========================================================================================
579 REM === CoreLib and NuGet package build section.
581 REM =========================================================================================
583 if %__BuildCoreLib% EQU 1 (
584 REM Scope environment changes start {
587 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
588 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
591 set __ExtraBuildArgs=
592 if not defined __IbcTuning (
593 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
594 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
597 if "%__BuildSOS%" == "0" (
598 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
601 if /i "%__BuildArch%" == "arm64" (
602 set __nugetBuildArgs=-buildNugetPackage=false
603 ) else if "%__SkipNugetPackage%" == "1" (
604 set __nugetBuildArgs=-buildNugetPackage=false
606 set __nugetBuildArgs=-buildNugetPackage=true
609 set __BuildLogRootName=System.Private.CoreLib
610 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
611 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
612 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
613 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
614 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
615 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
617 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
619 if not !errorlevel! == 0 (
620 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
627 REM } Scope environment changes end
631 REM Scope environment changes start {
634 REM Need diasymreader.dll on your path for /CreatePdb
635 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
637 if %__BuildNativeCoreLib% EQU 1 (
638 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
639 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
641 REM Need VS native tools environment for the **target** arch when running instrumented binaries
642 if %__PgoInstrument% EQU 1 (
643 set __VCExecArch=%__BuildArch%
644 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
645 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
646 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
647 @if defined _echo @echo on
648 if NOT !errorlevel! == 0 (
649 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
653 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
655 for /f "tokens=*" %%f in ('where pgort*.dll') do (
656 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
658 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
659 copy /y "!__PgoRtPath!" "%__BinDir%" || (
660 echo %__MsgPrefix%Error: copy failed
666 if defined __CrossgenAltJit (
667 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
668 REM so we don't need to save or unset these afterwards.
669 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
670 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
672 set COMPlus_AltJitNgen=*
673 set COMPlus_AltJitName=%__CrossgenAltJit%
674 set COMPlus_AltJitAssertOnNYI=1
675 set COMPlus_NoGuiOnAssert=1
676 set COMPlus_ContinueOnAssert=0
679 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
680 echo %__MsgPrefix%!NEXTCMD!
681 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
682 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
683 if NOT !errorlevel! == 0 (
684 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
685 :: Put it in the same log, helpful for Jenkins
686 type %__CrossGenCoreLibLog%
690 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
691 echo %__MsgPrefix%!NEXTCMD!
692 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
693 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
694 if NOT !errorlevel! == 0 (
695 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
696 :: Put it in the same log, helpful for Jenkins
697 type %__CrossGenCoreLibLog%
702 REM } Scope environment changes end
706 if %__BuildPackages% EQU 1 (
707 REM Scope environment changes start {
710 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
712 set __BuildLogRootName=Nuget
713 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
714 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
715 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
716 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
717 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
718 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
720 REM The conditions as to what to build are captured in the builds file.
721 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
723 if not !errorlevel! == 0 (
724 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
731 REM } Scope environment changes end
735 REM =========================================================================================
737 REM === Test build section
739 REM =========================================================================================
741 if %__BuildTests% EQU 1 (
742 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
744 REM Construct the arguments to pass to the test build script.
746 rem arm64 builds currently use private toolset which has not been released yet
747 REM TODO, remove once the toolset is open.
748 if not "%__ToolsetDir%" == "" call :PrivateToolSet
750 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
751 echo %__MsgPrefix%!NEXTCMD!
754 if not !errorlevel! == 0 (
755 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
760 REM =========================================================================================
762 REM === All builds complete!
764 REM =========================================================================================
766 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
767 echo %__MsgPrefix%Product binaries are available at !__BinDir!
768 if %__BuildTests% EQU 1 (
769 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
773 REM =========================================================================================
775 REM === Handle the "all" case.
777 REM =========================================================================================
783 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
784 if %__TotalSpecifiedBuildArch% EQU 0 (
785 REM Nothing specified means we want to build all architectures.
786 set __BuildArchList=x64 x86 arm arm64
789 REM Otherwise, add all the specified architectures to the list.
791 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
792 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
793 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
794 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
798 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
799 if %__TotalSpecifiedBuildType% EQU 0 (
800 REM Nothing specified means we want to build all build types.
801 set __BuildTypeList=Debug Checked Release
804 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
805 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
806 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
808 REM Create a temporary file to collect build results. We always build all flavors specified, and
809 REM report a summary of the results at the end.
811 set __AllBuildSuccess=true
812 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
813 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
815 for %%i in (%__BuildArchList%) do (
816 for %%j in (%__BuildTypeList%) do (
817 call :BuildOne %%i %%j
821 if %__AllBuildSuccess%==true (
822 echo %__MsgPrefix%All builds succeeded!
825 echo %__MsgPrefix%Builds failed:
826 type %__BuildResultFile%
827 del /f /q %__BuildResultFile%
831 REM This code is unreachable, but leaving it nonetheless, just in case things change.
837 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
838 echo %__MsgPrefix%Invoking: %__NextCmd%
840 if not !errorlevel! == 0 (
841 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
842 set __AllBuildSuccess=false
846 REM =========================================================================================
848 REM === Helper routines
850 REM =========================================================================================
857 echo Build the CoreCLR repo.
860 echo build.cmd [option1] [option2]
862 echo build.cmd all [option1] [option2] -- ...
864 echo All arguments are optional. The options are:
866 echo.-? -h -help --help: view this message.
867 echo -all: Builds all configurations and platforms.
868 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
869 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
870 echo -- ... : all arguments following this tag will be passed directly to msbuild.
871 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
872 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
873 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
875 echo add nativemscorlib to go further and build the native image for designated mscorlib.
876 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
877 echo -nopgooptimize: do not use profile guided optimizations.
878 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
879 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
880 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
881 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
882 echo -skipconfigure: skip CMake ^(default: CMake is run^)
883 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
884 echo -skipnative: skip building native components ^(default: native components are built^).
885 echo -skiptests: skip building tests ^(default: tests are built^).
886 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
887 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
888 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
889 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
890 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
891 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
892 echo -Rebuild: passes /t:rebuild to the build projects.
893 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
894 echo portable : build for portable RID.
896 echo If "all" is specified, then all build architectures and types are built. If, in addition,
897 echo one or more build architectures or types is specified, then only those build architectures
898 echo and types are built.
902 echo -- builds all architectures, and all build types per architecture
904 echo -- builds all build types for x86
905 echo build -all -x64 -x86 -Checked -Release
906 echo -- builds x64 and x86 architectures, Checked and Release build types for each
910 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
911 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
912 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
913 of the previous version to "%VSINSTALLDIR%" and then build.
914 :: DIA SDK not included in Express editions
915 echo Visual Studio Express does not include the DIA SDK. ^
916 You need Visual Studio 2015 or 2017 (Community is free).
917 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
922 echo %__MsgPrefix%Setting up the usage of __ToolsetDir:%__ToolsetDir%
924 if /i "%__ToolsetDir%" == "" (
925 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
929 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
930 call "%__ToolsetDir%"\buildenv_arm64.cmd
934 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
935 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
937 %__ToolsetDir%\VC_sdk\inc;^
938 %__ToolsetDir%\sdpublic\sdk\inc;^
939 %__ToolsetDir%\sdpublic\shared\inc;^
940 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
941 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
942 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
943 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
944 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
945 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
946 %__ToolsetDir%\diasdk\include