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%
10 set __ThisScriptFull="%~f0"
11 set __ThisScriptDir="%~dp0"
13 call "%__ThisScriptDir%"\setup_vs_tools.cmd
14 if NOT '%ERRORLEVEL%' == '0' exit /b 1
16 if defined VS150COMNTOOLS (
17 set "__VSToolsRoot=%VS150COMNTOOLS%"
18 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
19 set __VSVersion=vs2017
21 set "__VSToolsRoot=%VS140COMNTOOLS%"
22 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
23 set __VSVersion=vs2015
26 :: Work around Jenkins CI + msbuild problem: Jenkins sometimes creates very large environment
27 :: variables, and msbuild can't handle environment blocks with such large variables. So clear
28 :: out the variables that might be too large.
31 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
32 :: __BuildArch -- default: x64
33 :: __BuildType -- default: Debug
34 :: __BuildOS -- default: Windows_NT
35 :: __ProjectDir -- default: directory of the dir.props file
36 :: __SourceDir -- default: %__ProjectDir%\src\
37 :: __PackagesDir -- default: %__ProjectDir%\packages\
38 :: __RootBinDir -- default: %__ProjectDir%\bin\
39 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
41 :: __PackagesBinDir -- default: %__BinDir%\.nuget
42 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
44 :: Thus, these variables are not simply internal to this script!
46 :: Set the default arguments for build
49 set __BuildOS=Windows_NT
51 :: Set the various build properties here so that CMake and MSBuild can pick them up
52 set "__ProjectDir=%~dp0"
53 :: remove trailing slash
54 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
55 set "__ProjectFilesDir=%__ProjectDir%"
56 set "__SourceDir=%__ProjectDir%\src"
57 set "__PackagesDir=%DotNetRestorePackagesPath%"
58 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\packages"
59 set "__RootBinDir=%__ProjectDir%\bin"
60 set "__LogsDir=%__RootBinDir%\Logs"
67 set __BuildArchArm64=0
69 set __BuildTypeDebug=0
70 set __BuildTypeChecked=0
71 set __BuildTypeRelease=0
79 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
81 set __PassThroughArgs=
83 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
86 set __UnprocessedBuildArgs=
92 set __BuildCrossArchNative=0
95 set __BuildNativeCoreLib=1
96 set __BuildManagedTools=1
97 set __RestoreOptData=1
98 set __GenerateLayout=0
101 set __SkipNugetPackage=0
102 set __PgoOptDataVersion=
103 set __IbcOptDataVersion=
104 set __IbcMergeVersion=
106 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
108 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
109 @REM and allow the "-priority=1" syntax.
113 if "%1" == "" goto ArgsDone
115 if /i "%1" == "/?" goto Usage
116 if /i "%1" == "-?" goto Usage
117 if /i "%1" == "/h" goto Usage
118 if /i "%1" == "-h" goto Usage
119 if /i "%1" == "/help" goto Usage
120 if /i "%1" == "-help" goto Usage
121 if /i "%1" == "--help" goto Usage
123 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
124 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
125 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
126 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 REM TODO these are deprecated remove them eventually
134 REM don't add more, use the - syntax instead
135 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
147 REM Explicitly block -Rebuild.
148 if /i "%1" == "Rebuild" (
149 echo "ERROR: 'Rebuild' is not supported. Please remove it."
152 if /i "%1" == "-Rebuild" (
153 echo "ERROR: 'Rebuild' is not supported. Please remove it."
158 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
159 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
160 if [!__PassThroughArgs!]==[] (
161 set __PassThroughArgs=%1
163 set __PassThroughArgs=%__PassThroughArgs% %1
166 if /i "%1" == "-freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
167 if /i "%1" == "-linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
168 if /i "%1" == "-netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
169 if /i "%1" == "-osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
170 if /i "%1" == "-windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
171 if /i "%1" == "-nativemscorlib" (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 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)
173 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 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)
180 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-ibcoptimize" (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
184 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
185 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
187 REM TODO these are deprecated remove them eventually
188 REM don't add more, use the - syntax instead
189 if /i "%1" == "freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
192 if /i "%1" == "osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
193 if /i "%1" == "windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
194 if /i "%1" == "nativemscorlib" (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
195 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)
196 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
197 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
198 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "usenmakemakefiles" (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&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" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if [!processedArgs!]==[] (
210 set __UnprocessedBuildArgs=%__args%
212 set __UnprocessedBuildArgs=%__args%
213 for %%t in (!processedArgs!) do (
214 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
220 @REM Special handling for -priority=N argument.
221 if defined __Priority (
222 if defined __PassThroughArgs (
223 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
225 set __PassThroughArgs=-priority=%__Priority%
227 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
230 if defined __BuildAll goto BuildAll
232 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
233 if %__TotalSpecifiedBuildArch% GTR 1 (
234 echo Error: more than one build architecture specified, but "all" not specified.
238 if %__BuildArchX64%==1 set __BuildArch=x64
239 if %__BuildArchX86%==1 set __BuildArch=x86
240 if %__BuildArchArm%==1 (
244 if %__BuildArchArm64%==1 (
245 set __BuildArch=arm64
249 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
250 if %__TotalSpecifiedBuildType% GTR 1 (
251 echo Error: more than one build type specified, but "all" not specified.
255 if %__BuildTypeDebug%==1 set __BuildType=Debug
256 if %__BuildTypeChecked%==1 set __BuildType=Checked
257 if %__BuildTypeRelease%==1 set __BuildType=Release
259 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
261 if %__EnforcePgo%==1 (
262 if %__BuildArchArm%==1 (
263 echo NOTICE: enforcepgo does nothing on arm architecture
265 if %__BuildArchArm64%==1 (
266 echo NOTICE: enforcepgo does nothing on arm64 architecture
270 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
272 if %__BuildNative% EQU 1 (
273 if /i "%__BuildArch%"=="arm64" (
274 set __BuildCrossArchNative=1
276 if /i "%__BuildArch%"=="arm" (
277 set __BuildCrossArchNative=1
281 REM Set the remaining variables based upon the determined build configuration
283 if %__PgoOptimize%==0 set __RestoreOptData=0
284 if /i %__BuildType% NEQ Release set __RestoreOptData=0
286 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
287 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
289 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
290 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
291 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
292 set "__PackagesBinDir=%__BinDir%\.nuget"
293 set "__CrossComponentBinDir=%__BinDir%"
294 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
297 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
298 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
299 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
301 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
302 set "__CMakeBinDir=%__BinDir%"
303 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
305 if not exist "%__BinDir%" md "%__BinDir%"
306 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
307 if not exist "%__LogsDir%" md "%__LogsDir%"
309 REM It is convenient to have your Nuget search path include the location where the build
310 REM will place packages. However nuget used during the build will fail if that directory
311 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
312 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
314 echo %__MsgPrefix%Commencing CoreCLR product build
316 REM Set the remaining variables based upon the determined build configuration
318 echo %__MsgPrefix%Checking prerequisites
320 REM Eval the output from probe-win1.ps1
321 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
323 REM NumberOfCores is an WMI property providing number of physical cores on machine
324 REM processor(s). It is used to set optimal level of CL parallelism during native build step
325 if not defined NumberOfCores (
326 REM Determine number of physical processor cores available on machine
327 for /f "tokens=*" %%I in (
328 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
331 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
333 REM =========================================================================================
335 REM === Start the build steps
337 REM =========================================================================================
339 @if defined _echo @echo on
341 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
343 REM =========================================================================================
345 REM === Restore optimization profile data
347 REM =========================================================================================
349 if %__RestoreOptData% EQU 1 (
350 echo %__MsgPrefix%Restoring the OptimizationData Package
351 call %__ProjectDir%\run.cmd build -optdata %__RunArgs% %__UnprocessedBuildArgs%
352 if not !errorlevel! == 0 (
353 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
358 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
359 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
360 if not exist "%DotNetCli%" (
361 echo %__MsgPrefix%Error: "%DotNetCli%" not found
364 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
365 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
366 set __PgoOptDataVersion=%%s
368 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
369 set __IbcOptDataVersion=%%s
372 REM =========================================================================================
374 REM === Generate source files for eventing
376 REM =========================================================================================
378 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
379 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
381 REM Find python and set it to the variable PYTHON
382 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
383 set /p PYTHON=<%TEMP%\pythonlocation.txt
385 if NOT DEFINED PYTHON (
386 echo %__MsgPrefix%Error: Could not find a python installation
390 if %__BuildNative% EQU 1 (
392 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
393 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
394 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
396 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
397 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
399 echo %__MsgPrefix%Laying out ETW event logging interface
400 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
403 if %__BuildCoreLib% EQU 1 (
405 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
406 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
409 if %__BuildCrossArchNative% EQU 1 (
411 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
412 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
414 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch 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 !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || 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 !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
421 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
422 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
424 echo %__MsgPrefix%Laying out ETW event logging interface
425 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
428 REM =========================================================================================
430 REM === Build the CLR VM
432 REM =========================================================================================
434 if %__BuildNative% EQU 1 (
435 REM Scope environment changes start {
438 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
440 REM Set the environment for the native build
441 set __VCBuildArch=x86_amd64
442 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
443 if /i "%__BuildArch%" == "arm" (
444 set __VCBuildArch=x86_arm
446 REM Make CMake pick the highest installed version in the 10.0.* range
447 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
449 if /i "%__BuildArch%" == "arm64" (
450 set __VCBuildArch=x86_arm64
452 REM Make CMake pick the highest installed version in the 10.0.* range
453 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
456 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
457 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
458 @if defined _echo @echo on
460 if not defined VSINSTALLDIR (
461 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
464 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
466 if defined __SkipConfigure goto SkipConfigure
468 echo %__MsgPrefix%Regenerating the Visual Studio solution
470 pushd "%__IntermediatesDir%"
471 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%"
472 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
473 @if defined _echo @echo on
477 if not exist "%__IntermediatesDir%\install.vcxproj" (
478 echo %__MsgPrefix%Error: failed to generate native component build project!
482 if defined __ConfigureOnly goto SkipNativeBuild
484 set __BuildLogRootName=CoreCLR
485 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
486 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
487 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
488 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
489 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
490 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
491 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
493 call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
495 if not !errorlevel! == 0 (
496 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
504 REM } Scope environment changes end
508 REM =========================================================================================
510 REM === Build Cross-Architecture Native Components (if applicable)
512 REM =========================================================================================
514 if %__BuildCrossArchNative% EQU 1 (
515 REM Scope environment changes start {
518 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
520 REM Set the environment for the cross-arch native build
521 set __VCBuildArch=x86_amd64
522 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
524 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
525 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
526 @if defined _echo @echo on
528 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
529 if defined __SkipConfigure goto SkipConfigureCrossBuild
531 pushd "%__CrossCompIntermediatesDir%"
532 set __CMakeBinDir=%__CrossComponentBinDir%
533 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
534 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"
535 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
536 @if defined _echo @echo on
539 :SkipConfigureCrossBuild
540 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
541 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
545 if defined __ConfigureOnly goto SkipCrossCompBuild
547 set __BuildLogRootName=Cross
548 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
549 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
550 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
551 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
552 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
553 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
554 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
556 call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__CrossArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
558 if not !errorlevel! == 0 (
559 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
567 REM } Scope environment changes end
571 REM =========================================================================================
573 REM === CoreLib and NuGet package build section.
575 REM =========================================================================================
577 if %__BuildCoreLib% EQU 1 (
578 REM Scope environment changes start {
581 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
582 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
585 set __ExtraBuildArgs=
587 if "%__BuildSOS%" == "0" (
588 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
591 if "%__BuildManagedTools%" == "1" (
592 set __ExtraBuildArgs=!__ExtraBuildArgs! -BuildManagedTools=true
595 if "%__SkipNugetPackage%" == "1" (
596 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=false
598 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=true
601 set __BuildLogRootName=System.Private.CoreLib
602 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
603 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
604 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
605 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
606 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
607 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
608 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
610 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj !__Logging! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
612 if not !errorlevel! == 0 (
613 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
620 REM } Scope environment changes end
624 REM =========================================================================================
626 REM === Build native System.Private.CoreLib.
628 REM =========================================================================================
630 REM Scope environment changes start {
633 REM Need diasymreader.dll on your path for /CreatePdb
634 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
636 if %__BuildNativeCoreLib% EQU 1 (
637 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
638 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
640 REM Need VS native tools environment for the **target** arch when running instrumented binaries
641 if %__PgoInstrument% EQU 1 (
642 set __VCExecArch=%__BuildArch%
643 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
644 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
645 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
646 @if defined _echo @echo on
647 if NOT !errorlevel! == 0 (
648 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
652 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
654 for /f "tokens=*" %%f in ('where pgort*.dll') do (
655 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
657 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
658 copy /y "!__PgoRtPath!" "%__BinDir%" || (
659 echo %__MsgPrefix%Error: copy failed
665 if defined __CrossgenAltJit (
666 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
667 REM so we don't need to save or unset these afterwards.
668 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
669 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
671 set COMPlus_AltJitNgen=*
672 set COMPlus_AltJitName=%__CrossgenAltJit%
673 set COMPlus_AltJitAssertOnNYI=1
674 set COMPlus_NoGuiOnAssert=1
675 set COMPlus_ContinueOnAssert=0
678 if %__IbcOptimize% EQU 1 (
679 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
680 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
681 set __IbcMergeVersion=%%s
684 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
685 if exist !IbcMergePath! (
686 echo %__MsgPrefix%Optimizing using IBC training data
687 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\
688 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
689 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
691 if exist "!InputAssemblyFile!" (
692 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
694 REM Merge the optimization data into the source DLL
695 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
696 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
697 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
698 if NOT !errorlevel! == 0 (
699 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
700 REM Put it in the same log, helpful for Jenkins
701 type %__CrossGenCoreLibLog%
705 REM Verify that the optimization data has been merged
706 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
707 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
708 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
709 if NOT !errorlevel! == 0 (
710 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
711 REM Put it in the same log, helpful for Jenkins
712 type %__CrossGenCoreLibLog%
716 REM Save the module as *.pgo to match the convention expected
717 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
720 if exist "!TargetOptimizationDataFile!" (
721 REM Customize IBCMerge's arguments depending on input props
722 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
724 REM Apply optimization data to the compiled assembly
725 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
726 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
727 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
728 if NOT !errorlevel! == 0 (
729 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
730 REM Put it in the same log, helpful for Jenkins
731 type %__CrossGenCoreLibLog%
735 REM Verify that the optimization data has been applied
736 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
737 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
738 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
739 if NOT !errorlevel! == 0 (
740 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
741 REM Put it in the same log, helpful for Jenkins
742 type %__CrossGenCoreLibLog%
746 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
747 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
748 REM Put it in the same log, helpful for Jenkins
749 type %__CrossGenCoreLibLog%
755 if defined __PartialNgen (
756 set COMPlus_PartialNgen=1
759 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
760 echo %__MsgPrefix%!NEXTCMD!
761 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
762 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
763 if NOT !errorlevel! == 0 (
764 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
765 REM Put it in the same log, helpful for Jenkins
766 type %__CrossGenCoreLibLog%
770 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
771 echo %__MsgPrefix%!NEXTCMD!
772 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
773 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
774 if NOT !errorlevel! == 0 (
775 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
776 REM Put it in the same log, helpful for Jenkins
777 type %__CrossGenCoreLibLog%
782 REM } Scope environment changes end
785 REM =========================================================================================
787 REM === Build packages
789 REM =========================================================================================
791 if %__BuildPackages% EQU 1 (
792 REM Scope environment changes start {
795 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
797 set __BuildLogRootName=Nuget
798 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
799 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
800 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
801 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
802 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
803 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
804 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
806 REM The conditions as to what to build are captured in the builds file.
807 call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds !__Logging! -platform=%__BuildArch% %__RunArgs% %__UnprocessedBuildArgs%
809 if not !errorlevel! == 0 (
810 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
817 REM } Scope environment changes end
821 REM =========================================================================================
823 REM === Test build section
825 REM =========================================================================================
827 if %__BuildTests% EQU 1 (
828 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
830 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
831 echo %__MsgPrefix%!NEXTCMD!
834 if not !errorlevel! == 0 (
835 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
838 ) else if %__GenerateLayout% EQU 1 (
839 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
841 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
842 echo %__MsgPrefix%!NEXTCMD!
845 if not !errorlevel! == 0 (
846 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
851 REM =========================================================================================
853 REM === All builds complete!
855 REM =========================================================================================
857 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
858 echo %__MsgPrefix%Product binaries are available at !__BinDir!
861 REM =========================================================================================
863 REM === Handle the "all" case.
865 REM =========================================================================================
871 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
872 if %__TotalSpecifiedBuildArch% EQU 0 (
873 REM Nothing specified means we want to build all architectures.
874 set __BuildArchList=x64 x86 arm arm64
877 REM Otherwise, add all the specified architectures to the list.
879 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
880 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
881 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
882 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
886 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
887 if %__TotalSpecifiedBuildType% EQU 0 (
888 REM Nothing specified means we want to build all build types.
889 set __BuildTypeList=Debug Checked Release
892 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
893 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
894 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
896 REM Create a temporary file to collect build results. We always build all flavors specified, and
897 REM report a summary of the results at the end.
899 set __AllBuildSuccess=true
900 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
901 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
903 for %%i in (%__BuildArchList%) do (
904 for %%j in (%__BuildTypeList%) do (
905 call :BuildOne %%i %%j
909 if %__AllBuildSuccess%==true (
910 echo %__MsgPrefix%All builds succeeded!
913 echo %__MsgPrefix%Builds failed:
914 type %__BuildResultFile%
915 del /f /q %__BuildResultFile%
919 REM This code is unreachable, but leaving it nonetheless, just in case things change.
925 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
926 echo %__MsgPrefix%Invoking: %__NextCmd%
928 if not !errorlevel! == 0 (
929 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
930 set __AllBuildSuccess=false
934 REM =========================================================================================
936 REM === Helper routines
938 REM =========================================================================================
945 echo Build the CoreCLR repo.
948 echo build.cmd [option1] [option2]
950 echo build.cmd all [option1] [option2]
952 echo All arguments are optional. The options are:
954 echo.-? -h -help --help: view this message.
955 echo -all: Builds all configurations and platforms.
956 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
957 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
958 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
959 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
960 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
962 echo add nativemscorlib to go further and build the native image for designated mscorlib.
963 echo -nopgooptimize: do not use profile guided optimizations.
964 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
965 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
966 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
967 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
968 echo -skipconfigure: skip CMake ^(default: CMake is run^)
969 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
970 echo -skipnative: skip building native components ^(default: native components are built^).
971 echo -skiptests: skip building tests ^(default: tests are built^).
972 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
973 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
974 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
975 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
976 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
977 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
978 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
979 echo portable : build for portable RID.
981 echo If "all" is specified, then all build architectures and types are built. If, in addition,
982 echo one or more build architectures or types is specified, then only those build architectures
983 echo and types are built.
987 echo -- builds all architectures, and all build types per architecture
989 echo -- builds all build types for x86
990 echo build -all -x64 -x86 -Checked -Release
991 echo -- builds x64 and x86 architectures, Checked and Release build types for each
995 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
996 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
997 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
998 of the previous version to "%VSINSTALLDIR%" and then build.
999 REM DIA SDK not included in Express editions
1000 echo Visual Studio Express does not include the DIA SDK. ^
1001 You need Visual Studio 2015 or 2017 (Community is free).
1002 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites