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 VS160COMNTOOLS (
17 set "__VSToolsRoot=%VS160COMNTOOLS%"
18 set "__VCToolsRoot=%VS160COMNTOOLS%\..\..\VC\Auxiliary\Build"
19 set __VSVersion=vs2019
20 ) else if defined VS150COMNTOOLS (
21 set "__VSToolsRoot=%VS150COMNTOOLS%"
22 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
23 set __VSVersion=vs2017
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
43 :: Thus, these variables are not simply internal to this script!
45 :: Set the default arguments for build
48 set __BuildOS=Windows_NT
50 :: Set the various build properties here so that CMake and MSBuild can pick them up
51 set "__ProjectDir=%~dp0"
52 :: remove trailing slash
53 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
54 set "__ProjectFilesDir=%__ProjectDir%"
55 set "__SourceDir=%__ProjectDir%\src"
56 set "__PackagesDir=%DotNetRestorePackagesPath%"
57 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\.packages"
58 set "__RootBinDir=%__ProjectDir%\bin"
59 set "__LogsDir=%__RootBinDir%\Logs"
60 set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"
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=
88 set __CommonMSBuildArgs=
93 set __BuildCrossArchNative=0
94 set __SkipCrossArchNative=0
97 set __BuildNativeCoreLib=1
98 set __BuildManagedTools=1
99 set __RestoreOptData=1
100 set __GenerateLayout=0
101 set __CrossgenAltJit=
102 set __SkipRestoreArg=/p:RestoreDuringBuild=true
103 set __OfficialBuildIdArg=
105 set __PgoOptDataVersion=
106 set __IbcOptDataVersion=
107 set __IbcMergeVersion=
109 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
111 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
112 @REM and allow the "-priority=1" syntax.
116 if "%1" == "" goto ArgsDone
118 if /i "%1" == "/?" goto Usage
119 if /i "%1" == "-?" goto Usage
120 if /i "%1" == "/h" goto Usage
121 if /i "%1" == "-h" goto Usage
122 if /i "%1" == "/help" goto Usage
123 if /i "%1" == "-help" goto Usage
124 if /i "%1" == "--help" goto Usage
126 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 REM TODO these are deprecated remove them eventually
137 REM don't add more, use the - syntax instead
138 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
150 REM Explicitly block -Rebuild.
151 if /i "%1" == "Rebuild" (
152 echo "ERROR: 'Rebuild' is not supported. Please remove it."
155 if /i "%1" == "-Rebuild" (
156 echo "ERROR: 'Rebuild' is not supported. Please remove it."
161 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
162 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
163 if [!__PassThroughArgs!]==[] (
164 set __PassThroughArgs=%1
166 set __PassThroughArgs=%__PassThroughArgs% %1
169 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
170 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
171 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 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)
175 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)
176 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
184 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)
185 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
187 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "-ibcoptimize" (set __IbcOptimize=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
189 if /i "%1" == "-ibconly" (set __IbcOptimize=1&set __IbcOnly=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
192 REM TODO remove these once they are no longer used in buildpipeline
193 if /i "%1" == "-skiprestore" (set __SkipRestoreArg=/p:RestoreDuringBuild=false&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
194 if /i "%1" == "-OfficialBuildId" (set __OfficialBuildIdArg=/p:OfficialBuildId=%2&set processedArgs=!processedArgs! %1=%2&shift&shift&goto Arg_Loop)
196 REM TODO these are deprecated remove them eventually
197 REM don't add more, use the - syntax instead
198 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 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 processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 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)
204 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)
205 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 if /i "%1" == "skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
211 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if /i "%1" == "generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
213 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)
214 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
215 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
216 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
217 if /i "%1" == "ibcoptimize" (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
218 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
219 if /i "%1" == "crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
220 REM TODO remove this once it's no longer used in buildpipeline
221 if /i "%1" == "--" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
223 if [!processedArgs!]==[] (
224 set __UnprocessedBuildArgs=%__args%
226 set __UnprocessedBuildArgs=%__args%
227 for %%t in (!processedArgs!) do (
228 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
234 @REM Special handling for -priority=N argument.
235 if defined __Priority (
236 if defined __PassThroughArgs (
237 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
239 set __PassThroughArgs=-priority=%__Priority%
243 if defined __BuildAll goto BuildAll
245 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
246 if %__TotalSpecifiedBuildArch% GTR 1 (
247 echo Error: more than one build architecture specified, but "all" not specified.
251 if %__BuildArchX64%==1 set __BuildArch=x64
252 if %__BuildArchX86%==1 set __BuildArch=x86
253 if %__BuildArchArm%==1 (
257 if %__BuildArchArm64%==1 (
258 set __BuildArch=arm64
262 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
263 if %__TotalSpecifiedBuildType% GTR 1 (
264 echo Error: more than one build type specified, but "all" not specified.
268 if %__BuildTypeDebug%==1 set __BuildType=Debug
269 if %__BuildTypeChecked%==1 set __BuildType=Checked
270 if %__BuildTypeRelease%==1 set __BuildType=Release
272 set __CommonMSBuildArgs=/p:__BuildOS=%__BuildOS% /p:__BuildType=%__BuildType% /p:__BuildArch=%__BuildArch% !__SkipRestoreArg! !__OfficialBuildIdArg!
274 if %__EnforcePgo%==1 (
275 if %__BuildArchArm%==1 (
276 echo NOTICE: enforcepgo does nothing on arm architecture
278 if %__BuildArchArm64%==1 (
279 echo NOTICE: enforcepgo does nothing on arm64 architecture
283 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
285 if %__SkipCrossArchNative% EQU 0 (
286 if %__BuildNative% EQU 1 (
287 if /i "%__BuildArch%"=="arm64" (
288 set __BuildCrossArchNative=1
290 if /i "%__BuildArch%"=="arm" (
291 set __BuildCrossArchNative=1
296 REM Set the remaining variables based upon the determined build configuration
298 if %__PgoOptimize%==0 set __RestoreOptData=0
299 if /i %__BuildType% NEQ Release set __RestoreOptData=0
301 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
302 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
303 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
304 set "__PackagesBinDir=%__BinDir%\.nuget"
305 set "__CrossComponentBinDir=%__BinDir%"
306 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
309 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
310 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
311 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
313 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
314 set "__CMakeBinDir=%__BinDir%"
315 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
317 if not exist "%__BinDir%" md "%__BinDir%"
318 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
319 if not exist "%__LogsDir%" md "%__LogsDir%"
320 if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"
322 REM Set up the directory for MSBuild debug logs.
323 set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%
325 REM It is convenient to have your Nuget search path include the location where the build
326 REM will place packages. However nuget used during the build will fail if that directory
327 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
328 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
330 echo %__MsgPrefix%Commencing CoreCLR product build
332 REM Set the remaining variables based upon the determined build configuration
334 echo %__MsgPrefix%Checking prerequisites
337 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
338 if %__CMakeNeeded%==1 (
339 REM Eval the output from set-cmake-path.ps1
340 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
341 REM echo Using CMake from %CMakePath%
344 REM NumberOfCores is an WMI property providing number of physical cores on machine
345 REM processor(s). It is used to set optimal level of CL parallelism during native build step
346 if not defined NumberOfCores (
347 REM Determine number of physical processor cores available on machine
348 set TotalNumberOfCores=0
349 for /f "tokens=*" %%I in (
350 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
351 ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
352 set NumberOfCores=!TotalNumberOfCores!
354 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
356 REM =========================================================================================
358 REM === Start the build steps
360 REM =========================================================================================
362 @if defined _echo @echo on
364 powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\msbuild.ps1"^
365 %__ProjectDir%\eng\empty.csproj /p:NativeVersionFile="%__RootBinDir%\obj\_version.h"^
366 /p:ArcadeBuild=true /t:GenerateNativeVersionFile /restore^
367 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
368 if not !errorlevel! == 0 (
369 echo %__MsgPrefix%Error: Failed to generate version headers.
373 REM =========================================================================================
375 REM === Restore optimization profile data
377 REM =========================================================================================
379 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
380 if %__RestoreOptData% EQU 1 (
381 echo %__MsgPrefix%Restoring the OptimizationData Package
382 call %__ProjectDir%\dotnet.cmd restore /nologo /verbosity:minimal^
383 /nodeReuse:false /maxcpucount^
384 %OptDataProjectFilePath%^
385 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
386 if not !errorlevel! == 0 (
387 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
392 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
393 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
394 set __PgoOptDataVersion=%%s
396 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
397 set __IbcOptDataVersion=%%s
400 REM =========================================================================================
402 REM === Generate source files for eventing
404 REM =========================================================================================
406 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
407 set __IntermediatesEventingDir=%__IntermediatesDir%\Eventing
409 REM Find python and set it to the variable PYTHON
410 set _C=-c "import sys; sys.stdout.write(sys.executable)"
411 (py -3 %_C% || py -2 %_C% || python3 %_C% || python2 %_C% || python %_C%) > %TEMP%\pythonlocation.txt 2> NUL
413 set /p PYTHON=<%TEMP%\pythonlocation.txt
415 if NOT DEFINED PYTHON (
416 echo %__MsgPrefix%Error: Could not find a python installation
420 if %__BuildCoreLib% EQU 1 (
421 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
422 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
425 REM =========================================================================================
427 REM === Build Cross-Architecture Native Components (if applicable)
429 REM =========================================================================================
431 if %__BuildCrossArchNative% EQU 1 (
432 REM Scope environment changes start {
435 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
437 REM Set the environment for the cross-arch native build
438 set __VCBuildArch=x86_amd64
439 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
441 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
442 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
443 @if defined _echo @echo on
445 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
446 if defined __SkipConfigure goto SkipConfigureCrossBuild
448 pushd "%__CrossCompIntermediatesDir%"
449 set __CMakeBinDir=%__CrossComponentBinDir%
450 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
451 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"
452 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
453 @if defined _echo @echo on
456 :SkipConfigureCrossBuild
457 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
458 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
462 if defined __ConfigureOnly goto SkipCrossCompBuild
464 set __BuildLogRootName=Cross
465 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
466 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
467 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
468 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
469 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
470 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
471 set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
473 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
474 /p:PortableBuild=true /maxcpucount^
475 %__CrossCompIntermediatesDir%\install.vcxproj^
476 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
478 if not !errorlevel! == 0 (
479 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
487 REM } Scope environment changes end
491 REM =========================================================================================
493 REM === Build the CLR VM
495 REM =========================================================================================
497 if %__BuildNative% EQU 1 (
498 REM Scope environment changes start {
501 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
503 REM Set the environment for the native build
504 set __VCBuildArch=x86_amd64
505 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
506 if /i "%__BuildArch%" == "arm" (
507 set __VCBuildArch=x86_arm
508 REM Make CMake pick the highest installed version in the 10.0.* range
509 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
510 set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
512 if /i "%__BuildArch%" == "arm64" (
513 set __VCBuildArch=x86_arm64
515 REM Make CMake pick the highest installed version in the 10.0.* range
516 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
517 set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
520 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
521 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
522 @if defined _echo @echo on
524 if not defined VSINSTALLDIR (
525 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
528 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
530 if defined __SkipConfigure goto SkipConfigure
532 echo %__MsgPrefix%Regenerating the Visual Studio solution
534 echo Cross Arch Defines !___CrossBuildDefine!
536 pushd "%__IntermediatesDir%"
537 set __ExtraCmakeArgs=!___SDKVersion! !___CrossBuildDefine! "-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%"
538 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
539 @if defined _echo @echo on
543 if not exist "%__IntermediatesDir%\install.vcxproj" (
544 echo %__MsgPrefix%Error: failed to generate native component build project!
548 if defined __ConfigureOnly goto SkipNativeBuild
550 set __BuildLogRootName=CoreCLR
551 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
552 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
553 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
554 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
555 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
556 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
557 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
559 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
560 /p:PortableBuild=true /maxcpucount %__IntermediatesDir%\install.vcxproj^
561 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
563 if not !errorlevel! == 0 (
564 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
572 REM } Scope environment changes end
576 REM =========================================================================================
578 REM === CoreLib and NuGet package build section.
580 REM =========================================================================================
582 if %__BuildCoreLib% EQU 1 (
583 REM Scope environment changes start {
586 if %__IbcOnly% EQU 0 (
587 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
588 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
591 set __ExtraBuildArgs=
593 if "%__BuildSOS%" == "0" (
594 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:SkipSOS=true
597 if "%__BuildManagedTools%" == "1" (
598 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
601 set __BuildLogRootName=System.Private.CoreLib
602 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
603 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
604 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
605 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
606 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
607 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
608 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
610 call %__ProjectDir%\dotnet.cmd restore /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
611 /p:PortableBuild=true /maxcpucount /p:IncludeRestoreOnlyProjects=true /p:ArcadeBuild=true^
612 %__ProjectDir%\src\build.proj^
613 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
614 if not !errorlevel! == 0 (
615 echo %__MsgPrefix%Error: Managed Product assemblies restore failed. Refer to the build log files for details:
622 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
623 /p:PortableBuild=true /maxcpucount /p:ArcadeBuild=true^
624 %__ProjectDir%\src\build.proj^
625 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
626 if not !errorlevel! == 0 (
627 echo %__MsgPrefix%Error: Managed Product assemblies build failed. Refer to the build log files for details:
634 if %__IbcOptimize% EQU 1 (
635 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
636 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
637 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
638 set __IbcMergeVersion=%%s
641 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\tools\netcoreapp2.0\ibcmerge.dll
642 if exist !IbcMergePath! (
643 echo %__MsgPrefix%Optimizing using IBC training data
644 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\System.Private.CoreLib.dll\
645 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
646 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
648 if exist "!InputAssemblyFile!" (
649 set RawOptimizationDataFilePattern=!OptimizationDataDir!*.ibc
650 set RawOptimizationDataFile=
651 for %%x in (!RawOptimizationDataFilePattern!) do @(
652 if [!RawOptimizationDataFile!] == [] (
653 set RawOptimizationDataFile="%%x"
655 set RawOptimizationDataFile=!RawOptimizationDataFile! "%%x"
659 set IBCMergeCommand=%__ProjectDir%\dotnet.cmd --roll-forward-on-no-candidate-fx 2 "!IbcMergePath!"
661 REM Merge the optimization data into the source DLL
662 set NEXTCMD=!IBCMergeCommand! -q -f -delete -mo "!InputAssemblyFile!" !RawOptimizationDataFile!
663 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
664 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
665 if NOT !errorlevel! == 0 (
666 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
667 REM Put it in the same log, helpful for Jenkins
668 type %__CrossGenCoreLibLog%
672 REM Verify that the optimization data has been merged
673 set NEXTCMD=!IBCMergeCommand! -mi "!InputAssemblyFile!"
674 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
675 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
676 if NOT !errorlevel! == 0 (
677 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
678 REM Put it in the same log, helpful for Jenkins
679 type %__CrossGenCoreLibLog%
683 REM Save the module as *.pgo to match the convention expected
684 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
687 if exist "!TargetOptimizationDataFile!" (
688 REM Customize IBCMerge's arguments depending on input props
689 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
691 REM Apply optimization data to the compiled assembly
692 set NEXTCMD=!IBCMergeCommand! !IBCMergeArguments!
693 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
694 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
695 if NOT !errorlevel! == 0 (
696 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
697 REM Put it in the same log, helpful for Jenkins
698 type %__CrossGenCoreLibLog%
702 REM Verify that the optimization data has been applied
703 set NEXTCMD=!IBCMergeCommand! -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
704 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
705 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
706 if NOT !errorlevel! == 0 (
707 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
708 REM Put it in the same log, helpful for Jenkins
709 type %__CrossGenCoreLibLog%
713 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
714 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
715 REM Put it in the same log, helpful for Jenkins
716 type %__CrossGenCoreLibLog%
720 echo Could not find IBCMerge at !IbcMergePath!. Have you restored src/.nuget/optdata/ibcmerge.csproj?
725 REM } Scope environment changes end
729 REM =========================================================================================
731 REM === Build native System.Private.CoreLib.
733 REM =========================================================================================
735 REM Scope environment changes start {
738 REM Need diasymreader.dll on your path for /CreatePdb
739 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
741 if %__BuildNativeCoreLib% EQU 1 (
742 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
743 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
745 REM Need VS native tools environment for the **target** arch when running instrumented binaries
746 if %__PgoInstrument% EQU 1 (
747 set __VCExecArch=%__BuildArch%
748 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
749 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
750 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
751 @if defined _echo @echo on
752 if NOT !errorlevel! == 0 (
753 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
757 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
759 for /f "tokens=*" %%f in ('where pgort*.dll') do (
760 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
762 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
763 copy /y "!__PgoRtPath!" "%__BinDir%" || (
764 echo %__MsgPrefix%Error: copy failed
770 if defined __CrossgenAltJit (
771 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
772 REM so we don't need to save or unset these afterwards.
773 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
774 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
776 set COMPlus_AltJitNgen=*
777 set COMPlus_AltJitName=%__CrossgenAltJit%
778 set COMPlus_AltJitAssertOnNYI=1
779 set COMPlus_NoGuiOnAssert=1
780 set COMPlus_ContinueOnAssert=0
783 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%\IL" /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
784 echo %__MsgPrefix%!NEXTCMD!
785 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
786 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
787 if NOT !errorlevel! == 0 (
788 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
789 REM Put it in the same log, helpful for Jenkins
790 type %__CrossGenCoreLibLog%
794 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
795 echo %__MsgPrefix%!NEXTCMD!
796 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
797 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
798 if NOT !errorlevel! == 0 (
799 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
800 REM Put it in the same log, helpful for Jenkins
801 type %__CrossGenCoreLibLog%
806 REM } Scope environment changes end
809 REM =========================================================================================
811 REM === Build packages
813 REM =========================================================================================
815 if %__BuildPackages% EQU 1 (
816 REM Scope environment changes start {
819 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
821 set __BuildLog="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.binlog"
823 REM The conditions as to what to build are captured in the builds file.
824 REM Package build uses the Arcade system and scripts, relying on it to restore required toolsets as part of build
825 powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\build.ps1"^
826 -r -b -projects %__SourceDir%\.nuget\packages.builds^
827 -verbosity minimal /nodeReuse:false /bl:!__BuildLog!^
828 /p:PortableBuild=true /p:ArcadeBuild=true^
829 /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
830 if not !errorlevel! == 0 (
831 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log file for details:
836 REM } Scope environment changes end
840 REM =========================================================================================
842 REM === Test build section
844 REM =========================================================================================
846 if %__BuildTests% EQU 1 (
847 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
850 if defined __Priority (
851 set __PriorityArg=-priority=%__Priority%
853 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% !__PriorityArg! %__UnprocessedBuildArgs%
854 echo %__MsgPrefix%!NEXTCMD!
857 if not !errorlevel! == 0 (
858 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
861 ) else if %__GenerateLayout% EQU 1 (
862 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
864 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly msbuildargs %__UnprocessedBuildArgs%
865 echo %__MsgPrefix%!NEXTCMD!
868 if not !errorlevel! == 0 (
869 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
874 REM =========================================================================================
876 REM === All builds complete!
878 REM =========================================================================================
880 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
881 echo %__MsgPrefix%Product binaries are available at !__BinDir!
884 REM =========================================================================================
886 REM === Handle the "all" case.
888 REM =========================================================================================
894 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
895 if %__TotalSpecifiedBuildArch% EQU 0 (
896 REM Nothing specified means we want to build all architectures.
897 set __BuildArchList=x64 x86 arm arm64
900 REM Otherwise, add all the specified architectures to the list.
902 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
903 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
904 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
905 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
909 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
910 if %__TotalSpecifiedBuildType% EQU 0 (
911 REM Nothing specified means we want to build all build types.
912 set __BuildTypeList=Debug Checked Release
915 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
916 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
917 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
919 REM Create a temporary file to collect build results. We always build all flavors specified, and
920 REM report a summary of the results at the end.
922 set __AllBuildSuccess=true
923 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
924 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
926 for %%i in (%__BuildArchList%) do (
927 for %%j in (%__BuildTypeList%) do (
928 call :BuildOne %%i %%j
932 if %__AllBuildSuccess%==true (
933 echo %__MsgPrefix%All builds succeeded!
936 echo %__MsgPrefix%Builds failed:
937 type %__BuildResultFile%
938 del /f /q %__BuildResultFile%
942 REM This code is unreachable, but leaving it nonetheless, just in case things change.
948 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
949 echo %__MsgPrefix%Invoking: %__NextCmd%
951 if not !errorlevel! == 0 (
952 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
953 set __AllBuildSuccess=false
957 REM =========================================================================================
959 REM === Helper routines
961 REM =========================================================================================
968 echo Build the CoreCLR repo.
971 echo build.cmd [option1] [option2]
973 echo build.cmd all [option1] [option2]
975 echo All arguments are optional. The options are:
977 echo.-? -h -help --help: view this message.
978 echo -all: Builds all configurations and platforms.
979 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
980 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
981 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
982 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
983 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
985 echo add nativemscorlib to go further and build the native image for designated mscorlib.
986 echo -nopgooptimize: do not use profile guided optimizations.
987 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
988 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
989 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
990 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
991 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
992 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
993 echo -skipconfigure: skip CMake ^(default: CMake is run^)
994 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
995 echo -skipnative: skip building native components ^(default: native components are built^).
996 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
997 echo -skiptests: skip building tests ^(default: tests are built^).
998 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
999 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1000 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1001 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1002 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1003 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1004 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1005 echo portable : build for portable RID.
1007 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1008 echo one or more build architectures or types is specified, then only those build architectures
1009 echo and types are built.
1013 echo -- builds all architectures, and all build types per architecture
1014 echo build -all -x86
1015 echo -- builds all build types for x86
1016 echo build -all -x64 -x86 -Checked -Release
1017 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1021 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1022 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1023 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1024 of the previous version to "%VSINSTALLDIR%" and then build.
1025 REM DIA SDK not included in Express editions
1026 echo Visual Studio Express does not include the DIA SDK. ^
1027 You need Visual Studio 2017 or 2019 (Community is free).
1028 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites