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
324 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
325 if %__CMakeNeeded%==1 (
326 REM Eval the output from set-cmake-path.ps1
327 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
328 REM echo Using CMake from %CMakePath%
331 REM NumberOfCores is an WMI property providing number of physical cores on machine
332 REM processor(s). It is used to set optimal level of CL parallelism during native build step
333 if not defined NumberOfCores (
334 REM Determine number of physical processor cores available on machine
335 for /f "tokens=*" %%I in (
336 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
339 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
341 REM =========================================================================================
343 REM === Start the build steps
345 REM =========================================================================================
347 @if defined _echo @echo on
349 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
351 REM =========================================================================================
353 REM === Restore optimization profile data
355 REM =========================================================================================
357 if %__RestoreOptData% EQU 1 (
358 echo %__MsgPrefix%Restoring the OptimizationData Package
359 call %__ProjectDir%\run.cmd build -optdata %__RunArgs% %__UnprocessedBuildArgs%
360 if not !errorlevel! == 0 (
361 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
366 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
367 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
368 if not exist "%DotNetCli%" (
369 echo %__MsgPrefix%Error: "%DotNetCli%" not found
372 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
373 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
374 set __PgoOptDataVersion=%%s
376 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
377 set __IbcOptDataVersion=%%s
380 REM =========================================================================================
382 REM === Generate source files for eventing
384 REM =========================================================================================
386 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
387 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
389 REM Find python and set it to the variable PYTHON
390 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
391 set /p PYTHON=<%TEMP%\pythonlocation.txt
393 if NOT DEFINED PYTHON (
394 echo %__MsgPrefix%Error: Could not find a python installation
398 if %__BuildNative% EQU 1 (
400 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
401 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
402 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
404 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
405 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
407 echo %__MsgPrefix%Laying out ETW event logging interface
408 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
411 if %__BuildCoreLib% EQU 1 (
413 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
414 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
417 if %__BuildCrossArchNative% EQU 1 (
419 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
420 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
422 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
423 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
424 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
426 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
427 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
429 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
430 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
432 echo %__MsgPrefix%Laying out ETW event logging interface
433 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
436 REM =========================================================================================
438 REM === Build the CLR VM
440 REM =========================================================================================
442 if %__BuildNative% EQU 1 (
443 REM Scope environment changes start {
446 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
448 REM Set the environment for the native build
449 set __VCBuildArch=x86_amd64
450 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
451 if /i "%__BuildArch%" == "arm" (
452 set __VCBuildArch=x86_arm
454 REM Make CMake pick the highest installed version in the 10.0.* range
455 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
457 if /i "%__BuildArch%" == "arm64" (
458 set __VCBuildArch=x86_arm64
460 REM Make CMake pick the highest installed version in the 10.0.* range
461 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
464 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
465 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
466 @if defined _echo @echo on
468 if not defined VSINSTALLDIR (
469 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
472 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
474 if defined __SkipConfigure goto SkipConfigure
476 echo %__MsgPrefix%Regenerating the Visual Studio solution
478 pushd "%__IntermediatesDir%"
479 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOS%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%"
480 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
481 @if defined _echo @echo on
485 if not exist "%__IntermediatesDir%\install.vcxproj" (
486 echo %__MsgPrefix%Error: failed to generate native component build project!
490 if defined __ConfigureOnly goto SkipNativeBuild
492 set __BuildLogRootName=CoreCLR
493 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
494 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
495 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
496 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
497 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
498 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
499 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
501 call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
503 if not !errorlevel! == 0 (
504 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
512 REM } Scope environment changes end
516 REM =========================================================================================
518 REM === Build Cross-Architecture Native Components (if applicable)
520 REM =========================================================================================
522 if %__BuildCrossArchNative% EQU 1 (
523 REM Scope environment changes start {
526 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
528 REM Set the environment for the cross-arch native build
529 set __VCBuildArch=x86_amd64
530 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
532 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
533 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
534 @if defined _echo @echo on
536 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
537 if defined __SkipConfigure goto SkipConfigureCrossBuild
539 pushd "%__CrossCompIntermediatesDir%"
540 set __CMakeBinDir=%__CrossComponentBinDir%
541 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
542 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"
543 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
544 @if defined _echo @echo on
547 :SkipConfigureCrossBuild
548 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
549 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
553 if defined __ConfigureOnly goto SkipCrossCompBuild
555 set __BuildLogRootName=Cross
556 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
557 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
558 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
559 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
560 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
561 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
562 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
564 call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__CrossArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
566 if not !errorlevel! == 0 (
567 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
575 REM } Scope environment changes end
579 REM =========================================================================================
581 REM === CoreLib and NuGet package build section.
583 REM =========================================================================================
585 if %__BuildCoreLib% EQU 1 (
586 REM Scope environment changes start {
589 if %__IbcOnly% EQU 0 (
590 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
591 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
594 set __ExtraBuildArgs=
596 if "%__BuildSOS%" == "0" (
597 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
600 if "%__BuildManagedTools%" == "1" (
601 set __ExtraBuildArgs=!__ExtraBuildArgs! -BuildManagedTools=true
604 if "%__SkipNugetPackage%" == "1" (
605 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=false
607 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=true
610 set __BuildLogRootName=System.Private.CoreLib
611 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
612 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
613 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
614 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
615 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
616 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
617 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
619 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj !__Logging! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
621 if not !errorlevel! == 0 (
622 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
629 if %__IbcOptimize% EQU 1 (
630 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
631 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
632 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
633 set __IbcMergeVersion=%%s
636 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
637 if exist !IbcMergePath! (
638 echo %__MsgPrefix%Optimizing using IBC training data
639 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\
640 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
641 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
643 if exist "!InputAssemblyFile!" (
644 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
646 REM Merge the optimization data into the source DLL
647 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
648 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
649 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
650 if NOT !errorlevel! == 0 (
651 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
652 REM Put it in the same log, helpful for Jenkins
653 type %__CrossGenCoreLibLog%
657 REM Verify that the optimization data has been merged
658 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
659 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
660 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
661 if NOT !errorlevel! == 0 (
662 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
663 REM Put it in the same log, helpful for Jenkins
664 type %__CrossGenCoreLibLog%
668 REM Save the module as *.pgo to match the convention expected
669 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
672 if exist "!TargetOptimizationDataFile!" (
673 REM Customize IBCMerge's arguments depending on input props
674 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
676 REM Apply optimization data to the compiled assembly
677 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
678 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
679 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
680 if NOT !errorlevel! == 0 (
681 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
682 REM Put it in the same log, helpful for Jenkins
683 type %__CrossGenCoreLibLog%
687 REM Verify that the optimization data has been applied
688 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
689 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
690 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
691 if NOT !errorlevel! == 0 (
692 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
693 REM Put it in the same log, helpful for Jenkins
694 type %__CrossGenCoreLibLog%
698 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
699 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
700 REM Put it in the same log, helpful for Jenkins
701 type %__CrossGenCoreLibLog%
707 REM } Scope environment changes end
711 REM =========================================================================================
713 REM === Build native System.Private.CoreLib.
715 REM =========================================================================================
717 REM Scope environment changes start {
720 REM Need diasymreader.dll on your path for /CreatePdb
721 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
723 if %__BuildNativeCoreLib% EQU 1 (
724 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
725 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
727 REM Need VS native tools environment for the **target** arch when running instrumented binaries
728 if %__PgoInstrument% EQU 1 (
729 set __VCExecArch=%__BuildArch%
730 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
731 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
732 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
733 @if defined _echo @echo on
734 if NOT !errorlevel! == 0 (
735 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
739 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
741 for /f "tokens=*" %%f in ('where pgort*.dll') do (
742 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
744 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
745 copy /y "!__PgoRtPath!" "%__BinDir%" || (
746 echo %__MsgPrefix%Error: copy failed
752 if defined __CrossgenAltJit (
753 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
754 REM so we don't need to save or unset these afterwards.
755 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
756 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
758 set COMPlus_AltJitNgen=*
759 set COMPlus_AltJitName=%__CrossgenAltJit%
760 set COMPlus_AltJitAssertOnNYI=1
761 set COMPlus_NoGuiOnAssert=1
762 set COMPlus_ContinueOnAssert=0
765 if defined __PartialNgen (
766 set COMPlus_PartialNgen=1
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