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 set TotalNumberOfCores=0
336 for /f "tokens=*" %%I in (
337 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
338 ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
339 set NumberOfCores=!TotalNumberOfCores!
341 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
343 REM =========================================================================================
345 REM === Start the build steps
347 REM =========================================================================================
349 @if defined _echo @echo on
351 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
353 REM =========================================================================================
355 REM === Restore optimization profile data
357 REM =========================================================================================
359 if %__RestoreOptData% EQU 1 (
360 echo %__MsgPrefix%Restoring the OptimizationData Package
361 call %__ProjectDir%\run.cmd build -optdata %__RunArgs% %__UnprocessedBuildArgs%
362 if not !errorlevel! == 0 (
363 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
368 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
369 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
370 if not exist "%DotNetCli%" (
371 echo %__MsgPrefix%Error: "%DotNetCli%" not found
374 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
375 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
376 set __PgoOptDataVersion=%%s
378 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
379 set __IbcOptDataVersion=%%s
382 REM =========================================================================================
384 REM === Generate source files for eventing
386 REM =========================================================================================
388 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
389 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
391 REM Find python and set it to the variable PYTHON
392 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
393 set /p PYTHON=<%TEMP%\pythonlocation.txt
395 if NOT DEFINED PYTHON (
396 echo %__MsgPrefix%Error: Could not find a python installation
400 if %__BuildNative% EQU 1 (
402 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
403 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
404 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
406 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
407 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
409 echo %__MsgPrefix%Laying out ETW event logging interface
410 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
413 if %__BuildCoreLib% EQU 1 (
415 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
416 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
419 if %__BuildCrossArchNative% EQU 1 (
421 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
422 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
424 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
425 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
426 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
428 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
429 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
431 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
432 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
434 echo %__MsgPrefix%Laying out ETW event logging interface
435 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
438 REM =========================================================================================
440 REM === Build the CLR VM
442 REM =========================================================================================
444 if %__BuildNative% EQU 1 (
445 REM Scope environment changes start {
448 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
450 REM Set the environment for the native build
451 set __VCBuildArch=x86_amd64
452 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
453 if /i "%__BuildArch%" == "arm" (
454 set __VCBuildArch=x86_arm
456 REM Make CMake pick the highest installed version in the 10.0.* range
457 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
459 if /i "%__BuildArch%" == "arm64" (
460 set __VCBuildArch=x86_arm64
462 REM Make CMake pick the highest installed version in the 10.0.* range
463 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
466 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
467 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
468 @if defined _echo @echo on
470 if not defined VSINSTALLDIR (
471 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
474 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
476 if defined __SkipConfigure goto SkipConfigure
478 echo %__MsgPrefix%Regenerating the Visual Studio solution
480 pushd "%__IntermediatesDir%"
481 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%"
482 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
483 @if defined _echo @echo on
487 if not exist "%__IntermediatesDir%\install.vcxproj" (
488 echo %__MsgPrefix%Error: failed to generate native component build project!
492 if defined __ConfigureOnly goto SkipNativeBuild
494 set __BuildLogRootName=CoreCLR
495 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
496 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
497 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
498 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
499 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
500 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
501 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
503 call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
505 if not !errorlevel! == 0 (
506 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
514 REM } Scope environment changes end
518 REM =========================================================================================
520 REM === Build Cross-Architecture Native Components (if applicable)
522 REM =========================================================================================
524 if %__BuildCrossArchNative% EQU 1 (
525 REM Scope environment changes start {
528 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
530 REM Set the environment for the cross-arch native build
531 set __VCBuildArch=x86_amd64
532 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
534 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
535 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
536 @if defined _echo @echo on
538 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
539 if defined __SkipConfigure goto SkipConfigureCrossBuild
541 pushd "%__CrossCompIntermediatesDir%"
542 set __CMakeBinDir=%__CrossComponentBinDir%
543 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
544 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"
545 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
546 @if defined _echo @echo on
549 :SkipConfigureCrossBuild
550 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
551 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
555 if defined __ConfigureOnly goto SkipCrossCompBuild
557 set __BuildLogRootName=Cross
558 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
559 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
560 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
561 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
562 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
563 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
564 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
566 call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj !__Logging! -configuration=%__BuildType% -platform=%__CrossArch% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
568 if not !errorlevel! == 0 (
569 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
577 REM } Scope environment changes end
581 REM =========================================================================================
583 REM === CoreLib and NuGet package build section.
585 REM =========================================================================================
587 if %__BuildCoreLib% EQU 1 (
588 REM Scope environment changes start {
591 if %__IbcOnly% EQU 0 (
592 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
593 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
596 set __ExtraBuildArgs=
598 if "%__BuildSOS%" == "0" (
599 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
602 if "%__BuildManagedTools%" == "1" (
603 set __ExtraBuildArgs=!__ExtraBuildArgs! -BuildManagedTools=true
606 if "%__SkipNugetPackage%" == "1" (
607 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=false
609 set __ExtraBuildArgs=!__ExtraBuildArgs! -buildNugetPackage=true
612 set __BuildLogRootName=System.Private.CoreLib
613 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
614 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
615 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
616 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
617 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
618 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
619 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
621 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj !__Logging! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
623 if not !errorlevel! == 0 (
624 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
631 if %__IbcOptimize% EQU 1 (
632 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
633 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
634 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
635 set __IbcMergeVersion=%%s
638 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
639 if exist !IbcMergePath! (
640 echo %__MsgPrefix%Optimizing using IBC training data
641 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\
642 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
643 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
645 if exist "!InputAssemblyFile!" (
646 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
648 REM Merge the optimization data into the source DLL
649 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
650 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
651 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
652 if NOT !errorlevel! == 0 (
653 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
654 REM Put it in the same log, helpful for Jenkins
655 type %__CrossGenCoreLibLog%
659 REM Verify that the optimization data has been merged
660 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
661 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
662 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
663 if NOT !errorlevel! == 0 (
664 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
665 REM Put it in the same log, helpful for Jenkins
666 type %__CrossGenCoreLibLog%
670 REM Save the module as *.pgo to match the convention expected
671 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
674 if exist "!TargetOptimizationDataFile!" (
675 REM Customize IBCMerge's arguments depending on input props
676 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
678 REM Apply optimization data to the compiled assembly
679 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
680 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
681 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
682 if NOT !errorlevel! == 0 (
683 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
684 REM Put it in the same log, helpful for Jenkins
685 type %__CrossGenCoreLibLog%
689 REM Verify that the optimization data has been applied
690 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
691 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
692 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
693 if NOT !errorlevel! == 0 (
694 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
695 REM Put it in the same log, helpful for Jenkins
696 type %__CrossGenCoreLibLog%
700 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
701 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
702 REM Put it in the same log, helpful for Jenkins
703 type %__CrossGenCoreLibLog%
709 REM } Scope environment changes end
713 REM =========================================================================================
715 REM === Build native System.Private.CoreLib.
717 REM =========================================================================================
719 REM Scope environment changes start {
722 REM Need diasymreader.dll on your path for /CreatePdb
723 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
725 if %__BuildNativeCoreLib% EQU 1 (
726 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
727 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
729 REM Need VS native tools environment for the **target** arch when running instrumented binaries
730 if %__PgoInstrument% EQU 1 (
731 set __VCExecArch=%__BuildArch%
732 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
733 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
734 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
735 @if defined _echo @echo on
736 if NOT !errorlevel! == 0 (
737 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
741 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
743 for /f "tokens=*" %%f in ('where pgort*.dll') do (
744 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
746 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
747 copy /y "!__PgoRtPath!" "%__BinDir%" || (
748 echo %__MsgPrefix%Error: copy failed
754 if defined __CrossgenAltJit (
755 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
756 REM so we don't need to save or unset these afterwards.
757 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
758 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
760 set COMPlus_AltJitNgen=*
761 set COMPlus_AltJitName=%__CrossgenAltJit%
762 set COMPlus_AltJitAssertOnNYI=1
763 set COMPlus_NoGuiOnAssert=1
764 set COMPlus_ContinueOnAssert=0
767 if defined __PartialNgen (
768 set COMPlus_PartialNgen=1
771 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
772 echo %__MsgPrefix%!NEXTCMD!
773 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
774 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
775 if NOT !errorlevel! == 0 (
776 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
777 REM Put it in the same log, helpful for Jenkins
778 type %__CrossGenCoreLibLog%
782 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
783 echo %__MsgPrefix%!NEXTCMD!
784 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
785 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
786 if NOT !errorlevel! == 0 (
787 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
788 REM Put it in the same log, helpful for Jenkins
789 type %__CrossGenCoreLibLog%
794 REM } Scope environment changes end
797 REM =========================================================================================
799 REM === Build packages
801 REM =========================================================================================
803 if %__BuildPackages% EQU 1 (
804 REM Scope environment changes start {
807 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
809 set __BuildLogRootName=Nuget
810 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
811 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
812 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
813 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
814 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
815 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
816 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
818 REM The conditions as to what to build are captured in the builds file.
819 call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds !__Logging! -platform=%__BuildArch% %__RunArgs% %__UnprocessedBuildArgs%
821 if not !errorlevel! == 0 (
822 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
829 REM } Scope environment changes end
833 REM =========================================================================================
835 REM === Test build section
837 REM =========================================================================================
839 if %__BuildTests% EQU 1 (
840 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
842 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
843 echo %__MsgPrefix%!NEXTCMD!
846 if not !errorlevel! == 0 (
847 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
850 ) else if %__GenerateLayout% EQU 1 (
851 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
853 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
854 echo %__MsgPrefix%!NEXTCMD!
857 if not !errorlevel! == 0 (
858 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
863 REM =========================================================================================
865 REM === All builds complete!
867 REM =========================================================================================
869 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
870 echo %__MsgPrefix%Product binaries are available at !__BinDir!
873 REM =========================================================================================
875 REM === Handle the "all" case.
877 REM =========================================================================================
883 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
884 if %__TotalSpecifiedBuildArch% EQU 0 (
885 REM Nothing specified means we want to build all architectures.
886 set __BuildArchList=x64 x86 arm arm64
889 REM Otherwise, add all the specified architectures to the list.
891 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
892 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
893 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
894 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
898 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
899 if %__TotalSpecifiedBuildType% EQU 0 (
900 REM Nothing specified means we want to build all build types.
901 set __BuildTypeList=Debug Checked Release
904 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
905 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
906 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
908 REM Create a temporary file to collect build results. We always build all flavors specified, and
909 REM report a summary of the results at the end.
911 set __AllBuildSuccess=true
912 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
913 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
915 for %%i in (%__BuildArchList%) do (
916 for %%j in (%__BuildTypeList%) do (
917 call :BuildOne %%i %%j
921 if %__AllBuildSuccess%==true (
922 echo %__MsgPrefix%All builds succeeded!
925 echo %__MsgPrefix%Builds failed:
926 type %__BuildResultFile%
927 del /f /q %__BuildResultFile%
931 REM This code is unreachable, but leaving it nonetheless, just in case things change.
937 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
938 echo %__MsgPrefix%Invoking: %__NextCmd%
940 if not !errorlevel! == 0 (
941 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
942 set __AllBuildSuccess=false
946 REM =========================================================================================
948 REM === Helper routines
950 REM =========================================================================================
957 echo Build the CoreCLR repo.
960 echo build.cmd [option1] [option2]
962 echo build.cmd all [option1] [option2]
964 echo All arguments are optional. The options are:
966 echo.-? -h -help --help: view this message.
967 echo -all: Builds all configurations and platforms.
968 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
969 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
970 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
971 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
972 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
974 echo add nativemscorlib to go further and build the native image for designated mscorlib.
975 echo -nopgooptimize: do not use profile guided optimizations.
976 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
977 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
978 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
979 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
980 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
981 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
982 echo -skipconfigure: skip CMake ^(default: CMake is run^)
983 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
984 echo -skipnative: skip building native components ^(default: native components are built^).
985 echo -skiptests: skip building tests ^(default: tests are built^).
986 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
987 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
988 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
989 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
990 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
991 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
992 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
993 echo portable : build for portable RID.
995 echo If "all" is specified, then all build architectures and types are built. If, in addition,
996 echo one or more build architectures or types is specified, then only those build architectures
997 echo and types are built.
1001 echo -- builds all architectures, and all build types per architecture
1002 echo build -all -x86
1003 echo -- builds all build types for x86
1004 echo build -all -x64 -x86 -Checked -Release
1005 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1009 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1010 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1011 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1012 of the previous version to "%VSINSTALLDIR%" and then build.
1013 REM DIA SDK not included in Express editions
1014 echo Visual Studio Express does not include the DIA SDK. ^
1015 You need Visual Studio 2015 or 2017 (Community is free).
1016 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites