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
80 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
82 set __PassThroughArgs=
84 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
87 set __UnprocessedBuildArgs=
93 set __BuildCrossArchNative=0
96 set __BuildNativeCoreLib=1
97 set __BuildManagedTools=1
98 set __RestoreOptData=1
99 set __GenerateLayout=0
100 set __CrossgenAltJit=
102 set __SkipNugetPackage=0
103 set __PgoOptDataVersion=
104 set __IbcOptDataVersion=
105 set __IbcMergeVersion=
107 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
109 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
110 @REM and allow the "-priority=1" syntax.
114 if "%1" == "" goto ArgsDone
116 if /i "%1" == "/?" goto Usage
117 if /i "%1" == "-?" goto Usage
118 if /i "%1" == "/h" goto Usage
119 if /i "%1" == "-h" goto Usage
120 if /i "%1" == "/help" goto Usage
121 if /i "%1" == "-help" goto Usage
122 if /i "%1" == "--help" goto Usage
124 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
125 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
126 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 REM TODO these are deprecated remove them eventually
135 REM don't add more, use the - syntax instead
136 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
148 REM Explicitly block -Rebuild.
149 if /i "%1" == "Rebuild" (
150 echo "ERROR: 'Rebuild' is not supported. Please remove it."
153 if /i "%1" == "-Rebuild" (
154 echo "ERROR: 'Rebuild' is not supported. Please remove it."
159 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
160 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
161 if [!__PassThroughArgs!]==[] (
162 set __PassThroughArgs=%1
164 set __PassThroughArgs=%__PassThroughArgs% %1
167 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)
168 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)
169 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)
170 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)
171 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)
172 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)
173 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)
174 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 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)
182 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
184 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
185 if /i "%1" == "-ibcoptimize" (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 if /i "%1" == "-ibconly" (set __IbcOptimize=1&set __PartialNgen=1&set __IbcOnly=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
187 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
190 REM TODO these are deprecated remove them eventually
191 REM don't add more, use the - syntax instead
192 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)
193 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)
194 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)
195 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)
196 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)
197 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)
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" == "generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 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)
207 if /i "%1" == "pgoinstrument" (set __PgoInstrument=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" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if [!processedArgs!]==[] (
213 set __UnprocessedBuildArgs=%__args%
215 set __UnprocessedBuildArgs=%__args%
216 for %%t in (!processedArgs!) do (
217 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
223 @REM Special handling for -priority=N argument.
224 if defined __Priority (
225 if defined __PassThroughArgs (
226 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
228 set __PassThroughArgs=-priority=%__Priority%
230 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
233 if defined __BuildAll goto BuildAll
235 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
236 if %__TotalSpecifiedBuildArch% GTR 1 (
237 echo Error: more than one build architecture specified, but "all" not specified.
241 if %__BuildArchX64%==1 set __BuildArch=x64
242 if %__BuildArchX86%==1 set __BuildArch=x86
243 if %__BuildArchArm%==1 (
247 if %__BuildArchArm64%==1 (
248 set __BuildArch=arm64
252 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
253 if %__TotalSpecifiedBuildType% GTR 1 (
254 echo Error: more than one build type specified, but "all" not specified.
258 if %__BuildTypeDebug%==1 set __BuildType=Debug
259 if %__BuildTypeChecked%==1 set __BuildType=Checked
260 if %__BuildTypeRelease%==1 set __BuildType=Release
262 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
264 if %__EnforcePgo%==1 (
265 if %__BuildArchArm%==1 (
266 echo NOTICE: enforcepgo does nothing on arm architecture
268 if %__BuildArchArm64%==1 (
269 echo NOTICE: enforcepgo does nothing on arm64 architecture
273 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
275 if %__BuildNative% EQU 1 (
276 if /i "%__BuildArch%"=="arm64" (
277 set __BuildCrossArchNative=1
279 if /i "%__BuildArch%"=="arm" (
280 set __BuildCrossArchNative=1
284 REM Set the remaining variables based upon the determined build configuration
286 if %__PgoOptimize%==0 set __RestoreOptData=0
287 if /i %__BuildType% NEQ Release set __RestoreOptData=0
289 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
290 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
292 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
293 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
294 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
295 set "__PackagesBinDir=%__BinDir%\.nuget"
296 set "__CrossComponentBinDir=%__BinDir%"
297 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
300 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
301 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
302 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
304 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
305 set "__CMakeBinDir=%__BinDir%"
306 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
308 if not exist "%__BinDir%" md "%__BinDir%"
309 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
310 if not exist "%__LogsDir%" md "%__LogsDir%"
312 REM It is convenient to have your Nuget search path include the location where the build
313 REM will place packages. However nuget used during the build will fail if that directory
314 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
315 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
317 echo %__MsgPrefix%Commencing CoreCLR product build
319 REM Set the remaining variables based upon the determined build configuration
321 echo %__MsgPrefix%Checking prerequisites
323 REM Eval the output from probe-win1.ps1
324 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
326 REM NumberOfCores is an WMI property providing number of physical cores on machine
327 REM processor(s). It is used to set optimal level of CL parallelism during native build step
328 if not defined NumberOfCores (
329 REM Determine number of physical processor cores available on machine
330 for /f "tokens=*" %%I in (
331 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
334 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
336 REM =========================================================================================
338 REM === Start the build steps
340 REM =========================================================================================
342 @if defined _echo @echo on
344 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
346 REM =========================================================================================
348 REM === Restore optimization profile data
350 REM =========================================================================================
352 if %__RestoreOptData% EQU 1 (
353 echo %__MsgPrefix%Restoring the OptimizationData Package
354 call %__ProjectDir%\run.cmd build -optdata %__RunArgs% %__UnprocessedBuildArgs%
355 if not !errorlevel! == 0 (
356 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
361 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
362 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
363 if not exist "%DotNetCli%" (
364 echo %__MsgPrefix%Error: "%DotNetCli%" not found
367 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
368 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
369 set __PgoOptDataVersion=%%s
371 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
372 set __IbcOptDataVersion=%%s
375 REM =========================================================================================
377 REM === Generate source files for eventing
379 REM =========================================================================================
381 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
382 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
384 REM Find python and set it to the variable PYTHON
385 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
386 set /p PYTHON=<%TEMP%\pythonlocation.txt
388 if NOT DEFINED PYTHON (
389 echo %__MsgPrefix%Error: Could not find a python installation
393 if %__BuildNative% EQU 1 (
395 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
396 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
397 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
399 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
400 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
402 echo %__MsgPrefix%Laying out ETW event logging interface
403 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
406 if %__BuildCoreLib% EQU 1 (
408 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
409 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
412 if %__BuildCrossArchNative% EQU 1 (
414 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
415 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
417 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
418 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
419 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
421 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
422 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
424 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
425 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
427 echo %__MsgPrefix%Laying out ETW event logging interface
428 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
431 REM =========================================================================================
433 REM === Build the CLR VM
435 REM =========================================================================================
437 if %__BuildNative% EQU 1 (
438 REM Scope environment changes start {
441 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
443 REM Set the environment for the native build
444 set __VCBuildArch=x86_amd64
445 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
446 if /i "%__BuildArch%" == "arm" (
447 set __VCBuildArch=x86_arm
449 REM Make CMake pick the highest installed version in the 10.0.* range
450 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
452 if /i "%__BuildArch%" == "arm64" (
453 set __VCBuildArch=x86_arm64
455 REM Make CMake pick the highest installed version in the 10.0.* range
456 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
459 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
460 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
461 @if defined _echo @echo on
463 if not defined VSINSTALLDIR (
464 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
467 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
469 if defined __SkipConfigure goto SkipConfigure
471 echo %__MsgPrefix%Regenerating the Visual Studio solution
473 pushd "%__IntermediatesDir%"
474 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%"
475 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
476 @if defined _echo @echo on
480 if not exist "%__IntermediatesDir%\install.vcxproj" (
481 echo %__MsgPrefix%Error: failed to generate native component build project!
485 if defined __ConfigureOnly goto SkipNativeBuild
487 set __BuildLogRootName=CoreCLR
488 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
489 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
490 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
491 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
492 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
493 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
494 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
496 call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
498 if not !errorlevel! == 0 (
499 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
507 REM } Scope environment changes end
511 REM =========================================================================================
513 REM === Build Cross-Architecture Native Components (if applicable)
515 REM =========================================================================================
517 if %__BuildCrossArchNative% EQU 1 (
518 REM Scope environment changes start {
521 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
523 REM Set the environment for the cross-arch native build
524 set __VCBuildArch=x86_amd64
525 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
527 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
528 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
529 @if defined _echo @echo on
531 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
532 if defined __SkipConfigure goto SkipConfigureCrossBuild
534 pushd "%__CrossCompIntermediatesDir%"
535 set __CMakeBinDir=%__CrossComponentBinDir%
536 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
537 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"
538 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
539 @if defined _echo @echo on
542 :SkipConfigureCrossBuild
543 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
544 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
548 if defined __ConfigureOnly goto SkipCrossCompBuild
550 set __BuildLogRootName=Cross
551 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
552 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
553 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
554 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
555 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
556 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
557 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
559 call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__CrossArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
561 if not !errorlevel! == 0 (
562 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
570 REM } Scope environment changes end
574 REM =========================================================================================
576 REM === CoreLib and NuGet package build section.
578 REM =========================================================================================
580 if %__BuildCoreLib% EQU 1 (
581 REM Scope environment changes start {
584 if %__IbcOnly% EQU 0 (
585 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
586 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
589 set __ExtraBuildArgs=
591 if "%__BuildSOS%" == "0" (
592 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
595 if "%__BuildManagedTools%" == "1" (
596 set __ExtraBuildArgs=!__ExtraBuildArgs! -BuildManagedTools=true
599 if "%__SkipNugetPackage%" == "1" (
600 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=false
602 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=true
605 set __BuildLogRootName=System.Private.CoreLib
606 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
607 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
608 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
609 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
610 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
611 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
612 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
614 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj !__Logging! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
616 if not !errorlevel! == 0 (
617 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
624 if %__IbcOptimize% EQU 1 (
625 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
626 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
627 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
628 set __IbcMergeVersion=%%s
631 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
632 if exist !IbcMergePath! (
633 echo %__MsgPrefix%Optimizing using IBC training data
634 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\
635 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
636 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
638 if exist "!InputAssemblyFile!" (
639 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
641 REM Merge the optimization data into the source DLL
642 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
643 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
644 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
645 if NOT !errorlevel! == 0 (
646 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
647 REM Put it in the same log, helpful for Jenkins
648 type %__CrossGenCoreLibLog%
652 REM Verify that the optimization data has been merged
653 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
654 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
655 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
656 if NOT !errorlevel! == 0 (
657 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
658 REM Put it in the same log, helpful for Jenkins
659 type %__CrossGenCoreLibLog%
663 REM Save the module as *.pgo to match the convention expected
664 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
667 if exist "!TargetOptimizationDataFile!" (
668 REM Customize IBCMerge's arguments depending on input props
669 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
671 REM Apply optimization data to the compiled assembly
672 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
673 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
674 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
675 if NOT !errorlevel! == 0 (
676 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
677 REM Put it in the same log, helpful for Jenkins
678 type %__CrossGenCoreLibLog%
682 REM Verify that the optimization data has been applied
683 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
684 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
685 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
686 if NOT !errorlevel! == 0 (
687 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
688 REM Put it in the same log, helpful for Jenkins
689 type %__CrossGenCoreLibLog%
693 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
694 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
695 REM Put it in the same log, helpful for Jenkins
696 type %__CrossGenCoreLibLog%
702 REM } Scope environment changes end
706 REM =========================================================================================
708 REM === Build native System.Private.CoreLib.
710 REM =========================================================================================
712 REM Scope environment changes start {
715 REM Need diasymreader.dll on your path for /CreatePdb
716 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
718 if %__BuildNativeCoreLib% EQU 1 (
719 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
720 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
722 REM Need VS native tools environment for the **target** arch when running instrumented binaries
723 if %__PgoInstrument% EQU 1 (
724 set __VCExecArch=%__BuildArch%
725 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
726 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
727 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
728 @if defined _echo @echo on
729 if NOT !errorlevel! == 0 (
730 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
734 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
736 for /f "tokens=*" %%f in ('where pgort*.dll') do (
737 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
739 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
740 copy /y "!__PgoRtPath!" "%__BinDir%" || (
741 echo %__MsgPrefix%Error: copy failed
747 if defined __CrossgenAltJit (
748 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
749 REM so we don't need to save or unset these afterwards.
750 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
751 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
753 set COMPlus_AltJitNgen=*
754 set COMPlus_AltJitName=%__CrossgenAltJit%
755 set COMPlus_AltJitAssertOnNYI=1
756 set COMPlus_NoGuiOnAssert=1
757 set COMPlus_ContinueOnAssert=0
760 if defined __PartialNgen (
761 set COMPlus_PartialNgen=1
764 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
765 echo %__MsgPrefix%!NEXTCMD!
766 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
767 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
768 if NOT !errorlevel! == 0 (
769 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
770 REM Put it in the same log, helpful for Jenkins
771 type %__CrossGenCoreLibLog%
775 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
776 echo %__MsgPrefix%!NEXTCMD!
777 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
778 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
779 if NOT !errorlevel! == 0 (
780 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
781 REM Put it in the same log, helpful for Jenkins
782 type %__CrossGenCoreLibLog%
787 REM } Scope environment changes end
790 REM =========================================================================================
792 REM === Build packages
794 REM =========================================================================================
796 if %__BuildPackages% EQU 1 (
797 REM Scope environment changes start {
800 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
802 set __BuildLogRootName=Nuget
803 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
804 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
805 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
806 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
807 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
808 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
809 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
811 REM The conditions as to what to build are captured in the builds file.
812 call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds !__Logging! -platform=%__BuildArch% %__RunArgs% %__UnprocessedBuildArgs%
814 if not !errorlevel! == 0 (
815 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
822 REM } Scope environment changes end
826 REM =========================================================================================
828 REM === Test build section
830 REM =========================================================================================
832 if %__BuildTests% EQU 1 (
833 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
835 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
836 echo %__MsgPrefix%!NEXTCMD!
839 if not !errorlevel! == 0 (
840 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
843 ) else if %__GenerateLayout% EQU 1 (
844 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
846 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
847 echo %__MsgPrefix%!NEXTCMD!
850 if not !errorlevel! == 0 (
851 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
856 REM =========================================================================================
858 REM === All builds complete!
860 REM =========================================================================================
862 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
863 echo %__MsgPrefix%Product binaries are available at !__BinDir!
866 REM =========================================================================================
868 REM === Handle the "all" case.
870 REM =========================================================================================
876 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
877 if %__TotalSpecifiedBuildArch% EQU 0 (
878 REM Nothing specified means we want to build all architectures.
879 set __BuildArchList=x64 x86 arm arm64
882 REM Otherwise, add all the specified architectures to the list.
884 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
885 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
886 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
887 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
891 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
892 if %__TotalSpecifiedBuildType% EQU 0 (
893 REM Nothing specified means we want to build all build types.
894 set __BuildTypeList=Debug Checked Release
897 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
898 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
899 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
901 REM Create a temporary file to collect build results. We always build all flavors specified, and
902 REM report a summary of the results at the end.
904 set __AllBuildSuccess=true
905 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
906 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
908 for %%i in (%__BuildArchList%) do (
909 for %%j in (%__BuildTypeList%) do (
910 call :BuildOne %%i %%j
914 if %__AllBuildSuccess%==true (
915 echo %__MsgPrefix%All builds succeeded!
918 echo %__MsgPrefix%Builds failed:
919 type %__BuildResultFile%
920 del /f /q %__BuildResultFile%
924 REM This code is unreachable, but leaving it nonetheless, just in case things change.
930 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
931 echo %__MsgPrefix%Invoking: %__NextCmd%
933 if not !errorlevel! == 0 (
934 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
935 set __AllBuildSuccess=false
939 REM =========================================================================================
941 REM === Helper routines
943 REM =========================================================================================
950 echo Build the CoreCLR repo.
953 echo build.cmd [option1] [option2]
955 echo build.cmd all [option1] [option2]
957 echo All arguments are optional. The options are:
959 echo.-? -h -help --help: view this message.
960 echo -all: Builds all configurations and platforms.
961 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
962 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
963 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
964 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
965 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
967 echo add nativemscorlib to go further and build the native image for designated mscorlib.
968 echo -nopgooptimize: do not use profile guided optimizations.
969 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
970 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
971 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
972 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
973 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
974 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
975 echo -skipconfigure: skip CMake ^(default: CMake is run^)
976 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
977 echo -skipnative: skip building native components ^(default: native components are built^).
978 echo -skiptests: skip building tests ^(default: tests are built^).
979 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
980 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
981 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
982 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
983 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
984 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
985 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
986 echo portable : build for portable RID.
988 echo If "all" is specified, then all build architectures and types are built. If, in addition,
989 echo one or more build architectures or types is specified, then only those build architectures
990 echo and types are built.
994 echo -- builds all architectures, and all build types per architecture
996 echo -- builds all build types for x86
997 echo build -all -x64 -x86 -Checked -Release
998 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1002 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1003 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1004 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1005 of the previous version to "%VSINSTALLDIR%" and then build.
1006 REM DIA SDK not included in Express editions
1007 echo Visual Studio Express does not include the DIA SDK. ^
1008 You need Visual Studio 2015 or 2017 (Community is free).
1009 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites