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 __GenerateLayout=0
143 set __CrossgenAltJit=
145 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
147 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
148 @REM and allow the "-priority=1" syntax.
152 if "%1" == "" goto ArgsDone
154 if /i "%1" == "-?" goto Usage
155 if /i "%1" == "-h" goto Usage
156 if /i "%1" == "-help" goto Usage
157 if /i "%1" == "--help" goto Usage
160 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
161 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
162 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
163 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
164 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
166 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
167 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
168 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
170 REM TODO these are deprecated remove them eventually
171 REM don't add more, use the - syntax instead
172 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
184 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
185 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
186 if [!__PassThroughArgs!]==[] (
187 set __PassThroughArgs=%1
189 set __PassThroughArgs=%__PassThroughArgs% %1
192 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)
193 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)
194 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)
195 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)
196 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)
197 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)
198 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)
199 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 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)
206 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
211 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
213 REM TODO these are deprecated remove them eventually
214 REM don't add more, use the - syntax instead
215 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)
216 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)
217 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)
218 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)
219 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)
220 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)
221 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)
222 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
223 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
224 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
225 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
226 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
227 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
228 if /i "%1" == "generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
229 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)
230 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
231 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
232 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
233 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
234 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
236 if [!processedArgs!]==[] (
237 set __UnprocessedBuildArgs=%__args%
239 set __UnprocessedBuildArgs=%__args%
240 for %%t in (!processedArgs!) do (
241 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
247 @REM Special handling for -priority=N argument.
248 if defined __Priority (
249 if defined __PassThroughArgs (
250 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
252 set __PassThroughArgs=-priority=%__Priority%
254 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
257 if %__PgoOptimize%==0 set __RestoreOptData=0
259 if defined __BuildAll goto BuildAll
261 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
262 if %__TotalSpecifiedBuildArch% GTR 1 (
263 echo Error: more than one build architecture specified, but "all" not specified.
267 if %__BuildArchX64%==1 set __BuildArch=x64
268 if %__BuildArchX86%==1 set __BuildArch=x86
269 if %__BuildArchArm%==1 (
273 if %__BuildArchArm64%==1 (
274 set __BuildArch=arm64
278 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
279 if %__TotalSpecifiedBuildType% GTR 1 (
280 echo Error: more than one build type specified, but "all" not specified.
284 if %__BuildTypeDebug%==1 set __BuildType=Debug
285 if %__BuildTypeChecked%==1 set __BuildType=Checked
286 if %__BuildTypeRelease%==1 set __BuildType=Release
288 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
290 if %__EnforcePgo%==1 (
291 if %__BuildArchArm%==1 (
292 echo NOTICE: enforcepgo does nothing on arm architecture
294 if %__BuildArchArm64%==1 (
295 echo NOTICE: enforcepgo does nothing on arm64 architecture
299 REM Determine if this is a cross-arch build
301 if /i "%__BuildArch%"=="arm64" (
302 set __DoCrossArchBuild=1
305 if /i "%__BuildArch%"=="arm" (
306 set __DoCrossArchBuild=1
309 :: Set the remaining variables based upon the determined build configuration
310 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
311 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
312 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
313 set "__PackagesBinDir=%__BinDir%\.nuget"
314 set "__TestRootDir=%__RootBinDir%\tests"
315 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
316 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
317 set "__CrossComponentBinDir=%__BinDir%"
318 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
321 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
322 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
323 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
325 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
326 set "__CMakeBinDir=%__BinDir%"
327 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
329 if not exist "%__BinDir%" md "%__BinDir%"
330 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
331 if not exist "%__LogsDir%" md "%__LogsDir%"
333 REM It is convenient to have your Nuget search path include the location where the build
334 REM will place packages. However nuget used during the build will fail if that directory
335 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
336 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
338 echo %__MsgPrefix%Commencing CoreCLR Repo build
340 :: Set the remaining variables based upon the determined build configuration
342 echo %__MsgPrefix%Checking prerequisites
343 :: Eval the output from probe-win1.ps1
344 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
346 REM NumberOfCores is an WMI property providing number of physical cores on machine
347 REM processor(s). It is used to set optimal level of CL parallelism during native build step
348 if not defined NumberOfCores (
349 REM Determine number of physical processor cores available on machine
350 for /f "tokens=*" %%I in (
351 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
354 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
356 REM =========================================================================================
358 REM === Start the build steps
360 REM =========================================================================================
362 @if defined _echo @echo on
364 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
366 REM =========================================================================================
368 REM === Restore optimization profile data
370 REM =========================================================================================
372 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
373 echo %__MsgPrefix%Restoring the OptimizationData Package
374 @call %__ProjectDir%\run.cmd sync -optdata
375 if not !errorlevel! == 0 (
376 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
381 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
382 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
383 if not exist "%DotNetCli%" (
384 echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
387 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
388 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
389 set __PgoOptDataVersion=%%s
391 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
392 set __IbcOptDataVersion=%%s
395 REM =========================================================================================
397 REM === Generate source files for eventing
399 REM =========================================================================================
401 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
402 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
404 REM Find python and set it to the variable PYTHON
405 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
406 set /p PYTHON=<%TEMP%\pythonlocation.txt
408 if /i "%__BuildNative%"=="1" (
409 if NOT DEFINED PYTHON (
410 echo %__MsgPrefix%Error: Could not find a python installation
414 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
415 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
416 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
418 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
419 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
421 echo %__MsgPrefix%Laying out ETW event logging interface
422 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
425 if /i "%__DoCrossArchBuild%"=="1" (
426 if NOT DEFINED PYTHON (
427 echo %__MsgPrefix%Error: Could not find a python installation
431 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
432 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
434 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
435 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
436 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
438 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
439 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
441 echo %__MsgPrefix%Laying out ETW event logging interface
442 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
445 REM =========================================================================================
447 REM === Build the CLR VM
449 REM =========================================================================================
451 if %__BuildNative% EQU 1 (
452 REM Scope environment changes start {
455 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
457 set __NativePlatformArgs=-platform=%__BuildArch%
458 if not "%__ToolsetDir%" == "" ( set __NativePlatformArgs=-useEnv )
460 if not "%__ToolsetDir%" == "" (
461 rem arm64 builds currently use private toolset which has not been released yet
462 REM TODO, remove once the toolset is open.
467 :: Set the environment for the native build
468 set __VCBuildArch=x86_amd64
469 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
470 if /i "%__BuildArch%" == "arm" (
471 set __VCBuildArch=x86_arm
473 REM Make CMake pick the highest installed version in the 10.0.* range
474 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
476 if /i "%__BuildArch%" == "arm64" (
477 set __VCBuildArch=x86_arm64
479 REM Make CMake pick the highest installed version in the 10.0.* range
480 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
483 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
484 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
485 @if defined _echo @echo on
487 if not defined VSINSTALLDIR (
488 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
491 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
494 if defined __SkipConfigure goto SkipConfigure
496 echo %__MsgPrefix%Regenerating the Visual Studio solution
498 pushd "%__IntermediatesDir%"
499 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%"
500 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
501 @if defined _echo @echo on
505 if defined __ConfigureOnly goto SkipNativeBuild
507 if not exist "%__IntermediatesDir%\install.vcxproj" (
508 echo %__MsgPrefix%Error: failed to generate native component build project!
512 set __BuildLogRootName=CoreCLR
513 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
514 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
515 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
516 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
517 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
518 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
520 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %__NativePlatformArgs% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
522 if not !errorlevel! == 0 (
523 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
531 REM } Scope environment changes end
535 REM =========================================================================================
537 REM === Build Cross-Architecture Native Components (if applicable)
539 REM =========================================================================================
541 if /i "%__DoCrossArchBuild%"=="1" (
542 REM Scope environment changes start {
545 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
547 :: Set the environment for the native build
548 set __VCBuildArch=x86_amd64
549 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
551 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
552 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
553 @if defined _echo @echo on
555 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
556 if defined __SkipConfigure goto SkipConfigureCrossBuild
558 pushd "%__CrossCompIntermediatesDir%"
559 set __CMakeBinDir=%__CrossComponentBinDir%
560 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
561 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"
562 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
563 @if defined _echo @echo on
566 :SkipConfigureCrossBuild
567 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
568 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
572 if defined __ConfigureOnly goto SkipCrossCompBuild
574 set __BuildLogRootName=Cross
575 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
576 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
577 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
578 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
579 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
580 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
582 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
584 if not !errorlevel! == 0 (
585 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
593 REM } Scope environment changes end
597 REM =========================================================================================
599 REM === CoreLib and NuGet package build section.
601 REM =========================================================================================
603 if %__BuildCoreLib% EQU 1 (
604 REM Scope environment changes start {
607 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
608 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
611 set __ExtraBuildArgs=
612 if not defined __IbcTuning (
613 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
614 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
617 if "%__BuildSOS%" == "0" (
618 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
621 if /i "%__BuildArch%" == "arm64" (
622 set __nugetBuildArgs=-buildNugetPackage=false
623 ) else if "%__SkipNugetPackage%" == "1" (
624 set __nugetBuildArgs=-buildNugetPackage=false
626 set __nugetBuildArgs=-buildNugetPackage=true
629 set __BuildLogRootName=System.Private.CoreLib
630 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
631 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
632 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
633 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
634 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
635 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
637 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
639 if not !errorlevel! == 0 (
640 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
647 REM } Scope environment changes end
651 REM Scope environment changes start {
654 REM Need diasymreader.dll on your path for /CreatePdb
655 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
657 if %__BuildNativeCoreLib% EQU 1 (
658 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
659 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
661 REM Need VS native tools environment for the **target** arch when running instrumented binaries
662 if %__PgoInstrument% EQU 1 (
663 set __VCExecArch=%__BuildArch%
664 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
665 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
666 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
667 @if defined _echo @echo on
668 if NOT !errorlevel! == 0 (
669 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
673 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
675 for /f "tokens=*" %%f in ('where pgort*.dll') do (
676 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
678 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
679 copy /y "!__PgoRtPath!" "%__BinDir%" || (
680 echo %__MsgPrefix%Error: copy failed
686 if defined __CrossgenAltJit (
687 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
688 REM so we don't need to save or unset these afterwards.
689 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
690 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
692 set COMPlus_AltJitNgen=*
693 set COMPlus_AltJitName=%__CrossgenAltJit%
694 set COMPlus_AltJitAssertOnNYI=1
695 set COMPlus_NoGuiOnAssert=1
696 set COMPlus_ContinueOnAssert=0
699 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
700 echo %__MsgPrefix%!NEXTCMD!
701 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
702 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
703 if NOT !errorlevel! == 0 (
704 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
705 :: Put it in the same log, helpful for Jenkins
706 type %__CrossGenCoreLibLog%
710 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
711 echo %__MsgPrefix%!NEXTCMD!
712 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
713 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
714 if NOT !errorlevel! == 0 (
715 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
716 :: Put it in the same log, helpful for Jenkins
717 type %__CrossGenCoreLibLog%
722 REM } Scope environment changes end
726 if %__BuildPackages% EQU 1 (
727 REM Scope environment changes start {
730 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
732 set __BuildLogRootName=Nuget
733 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
734 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
735 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
736 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
737 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
738 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
740 REM The conditions as to what to build are captured in the builds file.
741 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
743 if not !errorlevel! == 0 (
744 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
751 REM } Scope environment changes end
755 REM =========================================================================================
757 REM === Test build section
759 REM =========================================================================================
761 if %__BuildTests% EQU 1 (
762 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
764 REM Construct the arguments to pass to the test build script.
766 rem arm64 builds currently use private toolset which has not been released yet
767 REM TODO, remove once the toolset is open.
768 if not "%__ToolsetDir%" == "" call :PrivateToolSet
770 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
771 echo %__MsgPrefix%!NEXTCMD!
774 if not !errorlevel! == 0 (
775 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
778 ) else if %__GenerateLayout% EQU 1 (
779 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
781 REM Construct the arguments to pass to the runtest build script.
783 rem arm64 builds currently use private toolset which has not been released yet
784 REM TODO, remove once the toolset is open.
785 if not "%__ToolsetDir%" == "" call :PrivateToolSet
787 set NEXTCMD=call %__ProjectDir%\test\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
788 echo %__MsgPrefix%!NEXTCMD!
791 if not !errorlevel! == 0 (
792 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
797 REM =========================================================================================
799 REM === All builds complete!
801 REM =========================================================================================
803 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
804 echo %__MsgPrefix%Product binaries are available at !__BinDir!
805 if %__BuildTests% EQU 1 (
806 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
810 REM =========================================================================================
812 REM === Handle the "all" case.
814 REM =========================================================================================
820 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
821 if %__TotalSpecifiedBuildArch% EQU 0 (
822 REM Nothing specified means we want to build all architectures.
823 set __BuildArchList=x64 x86 arm arm64
826 REM Otherwise, add all the specified architectures to the list.
828 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
829 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
830 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
831 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
835 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
836 if %__TotalSpecifiedBuildType% EQU 0 (
837 REM Nothing specified means we want to build all build types.
838 set __BuildTypeList=Debug Checked Release
841 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
842 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
843 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
845 REM Create a temporary file to collect build results. We always build all flavors specified, and
846 REM report a summary of the results at the end.
848 set __AllBuildSuccess=true
849 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
850 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
852 for %%i in (%__BuildArchList%) do (
853 for %%j in (%__BuildTypeList%) do (
854 call :BuildOne %%i %%j
858 if %__AllBuildSuccess%==true (
859 echo %__MsgPrefix%All builds succeeded!
862 echo %__MsgPrefix%Builds failed:
863 type %__BuildResultFile%
864 del /f /q %__BuildResultFile%
868 REM This code is unreachable, but leaving it nonetheless, just in case things change.
874 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
875 echo %__MsgPrefix%Invoking: %__NextCmd%
877 if not !errorlevel! == 0 (
878 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
879 set __AllBuildSuccess=false
883 REM =========================================================================================
885 REM === Helper routines
887 REM =========================================================================================
894 echo Build the CoreCLR repo.
897 echo build.cmd [option1] [option2]
899 echo build.cmd all [option1] [option2] -- ...
901 echo All arguments are optional. The options are:
903 echo.-? -h -help --help: view this message.
904 echo -all: Builds all configurations and platforms.
905 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
906 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
907 echo -- ... : all arguments following this tag will be passed directly to msbuild.
908 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
909 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
910 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
912 echo add nativemscorlib to go further and build the native image for designated mscorlib.
913 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
914 echo -nopgooptimize: do not use profile guided optimizations.
915 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
916 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
917 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
918 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
919 echo -skipconfigure: skip CMake ^(default: CMake is run^)
920 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
921 echo -skipnative: skip building native components ^(default: native components are built^).
922 echo -skiptests: skip building tests ^(default: tests are built^).
923 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
924 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
925 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
926 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
927 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
928 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
929 echo -Rebuild: passes /t:rebuild to the build projects.
930 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
931 echo portable : build for portable RID.
933 echo If "all" is specified, then all build architectures and types are built. If, in addition,
934 echo one or more build architectures or types is specified, then only those build architectures
935 echo and types are built.
939 echo -- builds all architectures, and all build types per architecture
941 echo -- builds all build types for x86
942 echo build -all -x64 -x86 -Checked -Release
943 echo -- builds x64 and x86 architectures, Checked and Release build types for each
947 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
948 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
949 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
950 of the previous version to "%VSINSTALLDIR%" and then build.
951 :: DIA SDK not included in Express editions
952 echo Visual Studio Express does not include the DIA SDK. ^
953 You need Visual Studio 2015 or 2017 (Community is free).
954 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
959 echo %__MsgPrefix%Setting up the usage of __ToolsetDir:%__ToolsetDir%
961 if /i "%__ToolsetDir%" == "" (
962 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
966 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
967 call "%__ToolsetDir%"\buildenv_arm64.cmd
971 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
972 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
974 %__ToolsetDir%\VC_sdk\inc;^
975 %__ToolsetDir%\sdpublic\sdk\inc;^
976 %__ToolsetDir%\sdpublic\shared\inc;^
977 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
978 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
979 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
980 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
981 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
982 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
983 %__ToolsetDir%\diasdk\include