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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 if /i "%1" == "-ibconly" (set __IbcOptimize=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" == "ibcoptimize" (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
211 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if /i "%1" == "crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
214 if [!processedArgs!]==[] (
215 set __UnprocessedBuildArgs=%__args%
217 set __UnprocessedBuildArgs=%__args%
218 for %%t in (!processedArgs!) do (
219 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
225 @REM Special handling for -priority=N argument.
226 if defined __Priority (
227 if defined __PassThroughArgs (
228 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
230 set __PassThroughArgs=-priority=%__Priority%
232 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
235 if defined __BuildAll goto BuildAll
237 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
238 if %__TotalSpecifiedBuildArch% GTR 1 (
239 echo Error: more than one build architecture specified, but "all" not specified.
243 if %__BuildArchX64%==1 set __BuildArch=x64
244 if %__BuildArchX86%==1 set __BuildArch=x86
245 if %__BuildArchArm%==1 (
249 if %__BuildArchArm64%==1 (
250 set __BuildArch=arm64
254 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
255 if %__TotalSpecifiedBuildType% GTR 1 (
256 echo Error: more than one build type specified, but "all" not specified.
260 if %__BuildTypeDebug%==1 set __BuildType=Debug
261 if %__BuildTypeChecked%==1 set __BuildType=Checked
262 if %__BuildTypeRelease%==1 set __BuildType=Release
264 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
266 if %__EnforcePgo%==1 (
267 if %__BuildArchArm%==1 (
268 echo NOTICE: enforcepgo does nothing on arm architecture
270 if %__BuildArchArm64%==1 (
271 echo NOTICE: enforcepgo does nothing on arm64 architecture
275 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
277 if %__BuildNative% EQU 1 (
278 if /i "%__BuildArch%"=="arm64" (
279 set __BuildCrossArchNative=1
281 if /i "%__BuildArch%"=="arm" (
282 set __BuildCrossArchNative=1
286 REM Set the remaining variables based upon the determined build configuration
288 if %__PgoOptimize%==0 set __RestoreOptData=0
289 if /i %__BuildType% NEQ Release set __RestoreOptData=0
291 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
292 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
294 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
295 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
296 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
297 set "__PackagesBinDir=%__BinDir%\.nuget"
298 set "__CrossComponentBinDir=%__BinDir%"
299 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
302 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
303 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
304 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
306 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
307 set "__CMakeBinDir=%__BinDir%"
308 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
310 if not exist "%__BinDir%" md "%__BinDir%"
311 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
312 if not exist "%__LogsDir%" md "%__LogsDir%"
314 REM It is convenient to have your Nuget search path include the location where the build
315 REM will place packages. However nuget used during the build will fail if that directory
316 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
317 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
319 echo %__MsgPrefix%Commencing CoreCLR product build
321 REM Set the remaining variables based upon the determined build configuration
323 echo %__MsgPrefix%Checking prerequisites
326 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
327 if %__CMakeNeeded%==1 (
328 REM Eval the output from set-cmake-path.ps1
329 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
330 REM echo Using CMake from %CMakePath%
333 REM NumberOfCores is an WMI property providing number of physical cores on machine
334 REM processor(s). It is used to set optimal level of CL parallelism during native build step
335 if not defined NumberOfCores (
336 REM Determine number of physical processor cores available on machine
337 set TotalNumberOfCores=0
338 for /f "tokens=*" %%I in (
339 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
340 ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
341 set NumberOfCores=!TotalNumberOfCores!
343 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
345 REM =========================================================================================
347 REM === Start the build steps
349 REM =========================================================================================
351 @if defined _echo @echo on
353 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
355 REM =========================================================================================
357 REM === Restore optimization profile data
359 REM =========================================================================================
361 if %__RestoreOptData% EQU 1 (
362 echo %__MsgPrefix%Restoring the OptimizationData Package
363 call %__ProjectDir%\run.cmd build -optdata %__RunArgs% %__UnprocessedBuildArgs%
364 if not !errorlevel! == 0 (
365 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
370 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
371 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
372 if not exist "%DotNetCli%" (
373 echo %__MsgPrefix%Error: "%DotNetCli%" not found
376 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
377 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
378 set __PgoOptDataVersion=%%s
380 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
381 set __IbcOptDataVersion=%%s
384 REM =========================================================================================
386 REM === Generate source files for eventing
388 REM =========================================================================================
390 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
391 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
393 REM Find python and set it to the variable PYTHON
394 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
395 set /p PYTHON=<%TEMP%\pythonlocation.txt
397 if NOT DEFINED PYTHON (
398 echo %__MsgPrefix%Error: Could not find a python installation
402 if %__BuildNative% EQU 1 (
404 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
405 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
406 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
408 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
409 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
411 echo %__MsgPrefix%Laying out ETW event logging interface
412 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
415 if %__BuildCoreLib% EQU 1 (
417 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
418 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
421 if %__BuildCrossArchNative% EQU 1 (
423 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
424 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
426 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
427 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
428 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
430 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
431 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
433 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
434 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
436 echo %__MsgPrefix%Laying out ETW event logging interface
437 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
440 REM =========================================================================================
442 REM === Build the CLR VM
444 REM =========================================================================================
446 if %__BuildNative% EQU 1 (
447 REM Scope environment changes start {
450 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
452 REM Set the environment for the native build
453 set __VCBuildArch=x86_amd64
454 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
455 if /i "%__BuildArch%" == "arm" (
456 set __VCBuildArch=x86_arm
458 REM Make CMake pick the highest installed version in the 10.0.* range
459 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
461 if /i "%__BuildArch%" == "arm64" (
462 set __VCBuildArch=x86_arm64
464 REM Make CMake pick the highest installed version in the 10.0.* range
465 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
468 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
469 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
470 @if defined _echo @echo on
472 if not defined VSINSTALLDIR (
473 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
476 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
478 if defined __SkipConfigure goto SkipConfigure
480 echo %__MsgPrefix%Regenerating the Visual Studio solution
482 pushd "%__IntermediatesDir%"
483 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%"
484 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
485 @if defined _echo @echo on
489 if not exist "%__IntermediatesDir%\install.vcxproj" (
490 echo %__MsgPrefix%Error: failed to generate native component build project!
494 if defined __ConfigureOnly goto SkipNativeBuild
496 set __BuildLogRootName=CoreCLR
497 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
498 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
499 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
500 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
501 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
502 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
503 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
505 call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
507 if not !errorlevel! == 0 (
508 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
516 REM } Scope environment changes end
520 REM =========================================================================================
522 REM === Build Cross-Architecture Native Components (if applicable)
524 REM =========================================================================================
526 if %__BuildCrossArchNative% EQU 1 (
527 REM Scope environment changes start {
530 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
532 REM Set the environment for the cross-arch native build
533 set __VCBuildArch=x86_amd64
534 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
536 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
537 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
538 @if defined _echo @echo on
540 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
541 if defined __SkipConfigure goto SkipConfigureCrossBuild
543 pushd "%__CrossCompIntermediatesDir%"
544 set __CMakeBinDir=%__CrossComponentBinDir%
545 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
546 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"
547 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
548 @if defined _echo @echo on
551 :SkipConfigureCrossBuild
552 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
553 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
557 if defined __ConfigureOnly goto SkipCrossCompBuild
559 set __BuildLogRootName=Cross
560 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
561 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
562 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
563 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
564 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
565 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
566 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
568 call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__CrossArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
570 if not !errorlevel! == 0 (
571 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
579 REM } Scope environment changes end
583 REM =========================================================================================
585 REM === CoreLib and NuGet package build section.
587 REM =========================================================================================
589 if %__BuildCoreLib% EQU 1 (
590 REM Scope environment changes start {
593 if %__IbcOnly% EQU 0 (
594 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
595 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
598 set __ExtraBuildArgs=
600 if "%__BuildSOS%" == "0" (
601 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
604 if "%__BuildManagedTools%" == "1" (
605 set __ExtraBuildArgs=!__ExtraBuildArgs! -BuildManagedTools=true
608 if "%__SkipNugetPackage%" == "1" (
609 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=false
611 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=true
614 set __BuildLogRootName=System.Private.CoreLib
615 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
616 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
617 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
618 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
619 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
620 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
621 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
623 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj !__Logging! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
625 if not !errorlevel! == 0 (
626 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
633 if %__IbcOptimize% EQU 1 (
634 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
635 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
636 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
637 set __IbcMergeVersion=%%s
640 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
641 if exist !IbcMergePath! (
642 echo %__MsgPrefix%Optimizing using IBC training data
643 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\
644 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
645 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
647 if exist "!InputAssemblyFile!" (
648 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
650 REM Merge the optimization data into the source DLL
651 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
652 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
653 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
654 if NOT !errorlevel! == 0 (
655 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
656 REM Put it in the same log, helpful for Jenkins
657 type %__CrossGenCoreLibLog%
661 REM Verify that the optimization data has been merged
662 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
663 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
664 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
665 if NOT !errorlevel! == 0 (
666 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
667 REM Put it in the same log, helpful for Jenkins
668 type %__CrossGenCoreLibLog%
672 REM Save the module as *.pgo to match the convention expected
673 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
676 if exist "!TargetOptimizationDataFile!" (
677 REM Customize IBCMerge's arguments depending on input props
678 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
680 REM Apply optimization data to the compiled assembly
681 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
682 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
683 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
684 if NOT !errorlevel! == 0 (
685 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
686 REM Put it in the same log, helpful for Jenkins
687 type %__CrossGenCoreLibLog%
691 REM Verify that the optimization data has been applied
692 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
693 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
694 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
695 if NOT !errorlevel! == 0 (
696 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
697 REM Put it in the same log, helpful for Jenkins
698 type %__CrossGenCoreLibLog%
702 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
703 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
704 REM Put it in the same log, helpful for Jenkins
705 type %__CrossGenCoreLibLog%
711 REM } Scope environment changes end
715 REM =========================================================================================
717 REM === Build native System.Private.CoreLib.
719 REM =========================================================================================
721 REM Scope environment changes start {
724 REM Need diasymreader.dll on your path for /CreatePdb
725 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
727 if %__BuildNativeCoreLib% EQU 1 (
728 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
729 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
731 REM Need VS native tools environment for the **target** arch when running instrumented binaries
732 if %__PgoInstrument% EQU 1 (
733 set __VCExecArch=%__BuildArch%
734 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
735 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
736 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
737 @if defined _echo @echo on
738 if NOT !errorlevel! == 0 (
739 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
743 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
745 for /f "tokens=*" %%f in ('where pgort*.dll') do (
746 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
748 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
749 copy /y "!__PgoRtPath!" "%__BinDir%" || (
750 echo %__MsgPrefix%Error: copy failed
756 if defined __CrossgenAltJit (
757 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
758 REM so we don't need to save or unset these afterwards.
759 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
760 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
762 set COMPlus_AltJitNgen=*
763 set COMPlus_AltJitName=%__CrossgenAltJit%
764 set COMPlus_AltJitAssertOnNYI=1
765 set COMPlus_NoGuiOnAssert=1
766 set COMPlus_ContinueOnAssert=0
769 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
770 echo %__MsgPrefix%!NEXTCMD!
771 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
772 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
773 if NOT !errorlevel! == 0 (
774 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
775 REM Put it in the same log, helpful for Jenkins
776 type %__CrossGenCoreLibLog%
780 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
781 echo %__MsgPrefix%!NEXTCMD!
782 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
783 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
784 if NOT !errorlevel! == 0 (
785 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
786 REM Put it in the same log, helpful for Jenkins
787 type %__CrossGenCoreLibLog%
792 REM } Scope environment changes end
795 REM =========================================================================================
797 REM === Build packages
799 REM =========================================================================================
801 if %__BuildPackages% EQU 1 (
802 REM Scope environment changes start {
805 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
807 set __BuildLogRootName=Nuget
808 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
809 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
810 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
811 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
812 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
813 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
814 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
816 REM The conditions as to what to build are captured in the builds file.
817 call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds !__Logging! -platform=%__BuildArch% %__RunArgs% %__UnprocessedBuildArgs%
819 if not !errorlevel! == 0 (
820 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
827 REM } Scope environment changes end
831 REM =========================================================================================
833 REM === Test build section
835 REM =========================================================================================
837 if %__BuildTests% EQU 1 (
838 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
840 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
841 echo %__MsgPrefix%!NEXTCMD!
844 if not !errorlevel! == 0 (
845 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
848 ) else if %__GenerateLayout% EQU 1 (
849 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
851 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
852 echo %__MsgPrefix%!NEXTCMD!
855 if not !errorlevel! == 0 (
856 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
861 REM =========================================================================================
863 REM === All builds complete!
865 REM =========================================================================================
867 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
868 echo %__MsgPrefix%Product binaries are available at !__BinDir!
871 REM =========================================================================================
873 REM === Handle the "all" case.
875 REM =========================================================================================
881 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
882 if %__TotalSpecifiedBuildArch% EQU 0 (
883 REM Nothing specified means we want to build all architectures.
884 set __BuildArchList=x64 x86 arm arm64
887 REM Otherwise, add all the specified architectures to the list.
889 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
890 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
891 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
892 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
896 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
897 if %__TotalSpecifiedBuildType% EQU 0 (
898 REM Nothing specified means we want to build all build types.
899 set __BuildTypeList=Debug Checked Release
902 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
903 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
904 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
906 REM Create a temporary file to collect build results. We always build all flavors specified, and
907 REM report a summary of the results at the end.
909 set __AllBuildSuccess=true
910 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
911 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
913 for %%i in (%__BuildArchList%) do (
914 for %%j in (%__BuildTypeList%) do (
915 call :BuildOne %%i %%j
919 if %__AllBuildSuccess%==true (
920 echo %__MsgPrefix%All builds succeeded!
923 echo %__MsgPrefix%Builds failed:
924 type %__BuildResultFile%
925 del /f /q %__BuildResultFile%
929 REM This code is unreachable, but leaving it nonetheless, just in case things change.
935 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
936 echo %__MsgPrefix%Invoking: %__NextCmd%
938 if not !errorlevel! == 0 (
939 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
940 set __AllBuildSuccess=false
944 REM =========================================================================================
946 REM === Helper routines
948 REM =========================================================================================
955 echo Build the CoreCLR repo.
958 echo build.cmd [option1] [option2]
960 echo build.cmd all [option1] [option2]
962 echo All arguments are optional. The options are:
964 echo.-? -h -help --help: view this message.
965 echo -all: Builds all configurations and platforms.
966 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
967 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
968 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
969 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
970 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
972 echo add nativemscorlib to go further and build the native image for designated mscorlib.
973 echo -nopgooptimize: do not use profile guided optimizations.
974 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
975 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
976 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
977 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
978 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
979 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
980 echo -skipconfigure: skip CMake ^(default: CMake is run^)
981 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
982 echo -skipnative: skip building native components ^(default: native components are built^).
983 echo -skiptests: skip building tests ^(default: tests are built^).
984 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
985 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
986 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
987 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
988 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
989 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
990 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
991 echo portable : build for portable RID.
993 echo If "all" is specified, then all build architectures and types are built. If, in addition,
994 echo one or more build architectures or types is specified, then only those build architectures
995 echo and types are built.
999 echo -- builds all architectures, and all build types per architecture
1000 echo build -all -x86
1001 echo -- builds all build types for x86
1002 echo build -all -x64 -x86 -Checked -Release
1003 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1007 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1008 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1009 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1010 of the previous version to "%VSINSTALLDIR%" and then build.
1011 REM DIA SDK not included in Express editions
1012 echo Visual Studio Express does not include the DIA SDK. ^
1013 You need Visual Studio 2015 or 2017 (Community is free).
1014 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites