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=
92 set __BuildCrossArchNative=0
93 set __SkipCrossArchNative=0
96 set __BuildNativeCoreLib=1
97 set __BuildManagedTools=1
98 set __RestoreOptData=1
99 set __GenerateLayout=0
100 set __CrossgenAltJit=
101 set __SkipRestoreArg=/p:RestoreDuringBuild=true
102 set __OfficialBuildIdArg=
104 set __PgoOptDataVersion=
105 set __IbcOptDataVersion=
106 set __IbcMergeVersion=
108 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
110 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
111 @REM and allow the "-priority=1" syntax.
115 if "%1" == "" goto ArgsDone
117 if /i "%1" == "/?" goto Usage
118 if /i "%1" == "-?" goto Usage
119 if /i "%1" == "/h" goto Usage
120 if /i "%1" == "-h" goto Usage
121 if /i "%1" == "/help" goto Usage
122 if /i "%1" == "-help" goto Usage
123 if /i "%1" == "--help" goto Usage
125 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
126 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 REM TODO these are deprecated remove them eventually
136 REM don't add more, use the - syntax instead
137 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
149 REM Explicitly block -Rebuild.
150 if /i "%1" == "Rebuild" (
151 echo "ERROR: 'Rebuild' is not supported. Please remove it."
154 if /i "%1" == "-Rebuild" (
155 echo "ERROR: 'Rebuild' is not supported. Please remove it."
160 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
161 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
162 if [!__PassThroughArgs!]==[] (
163 set __PassThroughArgs=%1
165 set __PassThroughArgs=%__PassThroughArgs% %1
168 if /i "%1" == "-freebsdmscorlib" (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)
169 if /i "%1" == "-linuxmscorlib" (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)
170 if /i "%1" == "-netbsdmscorlib" (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)
171 if /i "%1" == "-osxmscorlib" (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)
172 if /i "%1" == "-windowsmscorlib" (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)
173 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)
174 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)
175 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-skipmanagedtools" (set __BuildManagedTools=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 __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 __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 __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 __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 __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 set PgoDataPackageVersionOutputFile="%__IntermediatesDir%\optdataversion.txt"
393 set IbcDataPackageVersionOutputFile="%__IntermediatesDir%\ibcoptdataversion.txt"
395 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
396 call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo %__CommonMSBuildArgs% /p:PgoDataPackageVersionOutputFile="!PgoDataPackageVersionOutputFile!"
398 if not !errorlevel! == 0 (
399 echo "Failed to get PGO data package version."
402 if not exist "!PgoDataPackageVersionOutputFile!" (
403 echo "Failed to get PGO data package version."
407 set /p __PgoOptDataVersion=<"!PgoDataPackageVersionOutputFile!"
409 call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo %__CommonMSBuildArgs% /p:IbcDataPackageVersionOutputFile="!IbcDataPackageVersionOutputFile!"
411 if not !errorlevel! == 0 (
412 echo "Failed to get IBC data package version."
416 if not exist "!IbcDataPackageVersionOutputFile!" (
417 echo "Failed to get IBC data package version."
421 set /p __IbcOptDataVersion=<"!IbcDataPackageVersionOutputFile!"
423 REM =========================================================================================
425 REM === Generate source files for eventing
427 REM =========================================================================================
429 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
430 set __IntermediatesEventingDir=%__IntermediatesDir%\Eventing
432 REM Find python and set it to the variable PYTHON
433 set _C=-c "import sys; sys.stdout.write(sys.executable)"
434 (py -3 %_C% || py -2 %_C% || python3 %_C% || python2 %_C% || python %_C%) > %TEMP%\pythonlocation.txt 2> NUL
436 set /p PYTHON=<%TEMP%\pythonlocation.txt
438 if NOT DEFINED PYTHON (
439 echo %__MsgPrefix%Error: Could not find a python installation
443 if %__BuildCoreLib% EQU 1 (
444 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
445 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
448 REM =========================================================================================
450 REM === Build Cross-Architecture Native Components (if applicable)
452 REM =========================================================================================
454 if %__BuildCrossArchNative% EQU 1 (
455 REM Scope environment changes start {
458 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
460 REM Set the environment for the cross-arch native build
461 set __VCBuildArch=x86_amd64
462 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
464 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
465 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
466 @if defined _echo @echo on
468 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
469 if defined __SkipConfigure goto SkipConfigureCrossBuild
471 pushd "%__CrossCompIntermediatesDir%"
472 set __CMakeBinDir=%__CrossComponentBinDir%
473 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
474 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"
475 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
476 @if defined _echo @echo on
479 :SkipConfigureCrossBuild
480 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
481 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
485 if defined __ConfigureOnly goto SkipCrossCompBuild
487 set __BuildLogRootName=Cross
488 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
489 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
490 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
491 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
492 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
493 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
494 set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
496 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
497 /p:PortableBuild=true /maxcpucount^
498 %__CrossCompIntermediatesDir%\install.vcxproj^
499 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
501 if not !errorlevel! == 0 (
502 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
510 REM } Scope environment changes end
514 REM =========================================================================================
516 REM === Build the CLR VM
518 REM =========================================================================================
520 if %__BuildNative% EQU 1 (
521 REM Scope environment changes start {
524 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
526 REM Set the environment for the native build
527 set __VCBuildArch=x86_amd64
528 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
529 if /i "%__BuildArch%" == "arm" (
530 set __VCBuildArch=x86_arm
531 REM Make CMake pick the highest installed version in the 10.0.* range
532 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
533 set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
535 if /i "%__BuildArch%" == "arm64" (
536 set __VCBuildArch=x86_arm64
538 REM Make CMake pick the highest installed version in the 10.0.* range
539 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
540 set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
543 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
544 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
545 @if defined _echo @echo on
547 if not defined VSINSTALLDIR (
548 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
551 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
553 if defined __SkipConfigure goto SkipConfigure
555 echo %__MsgPrefix%Regenerating the Visual Studio solution
557 echo Cross Arch Defines !___CrossBuildDefine!
559 pushd "%__IntermediatesDir%"
560 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%"
561 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
562 @if defined _echo @echo on
566 if not exist "%__IntermediatesDir%\install.vcxproj" (
567 echo %__MsgPrefix%Error: failed to generate native component build project!
571 if defined __ConfigureOnly goto SkipNativeBuild
573 set __BuildLogRootName=CoreCLR
574 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
575 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
576 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
577 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
578 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
579 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
580 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
582 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
583 /p:PortableBuild=true /maxcpucount %__IntermediatesDir%\install.vcxproj^
584 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
586 if not !errorlevel! == 0 (
587 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
595 REM } Scope environment changes end
599 REM =========================================================================================
601 REM === CoreLib and NuGet package build section.
603 REM =========================================================================================
605 if %__BuildCoreLib% EQU 1 (
606 REM Scope environment changes start {
609 if %__IbcOnly% EQU 0 (
610 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
611 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
614 set __ExtraBuildArgs=
616 if "%__BuildManagedTools%" == "1" (
617 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
620 set __BuildLogRootName=System.Private.CoreLib
621 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
622 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
623 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
624 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
625 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
626 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
627 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
629 call %__ProjectDir%\dotnet.cmd restore /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
630 /p:PortableBuild=true /maxcpucount /p:IncludeRestoreOnlyProjects=true /p:ArcadeBuild=true^
631 %__ProjectDir%\src\build.proj^
632 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
633 if not !errorlevel! == 0 (
634 echo %__MsgPrefix%Error: Managed Product assemblies restore failed. Refer to the build log files for details:
641 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
642 /p:PortableBuild=true /maxcpucount /p:ArcadeBuild=true^
643 %__ProjectDir%\src\build.proj^
644 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
645 if not !errorlevel! == 0 (
646 echo %__MsgPrefix%Error: Managed Product assemblies build failed. Refer to the build log files for details:
653 if %__IbcOptimize% EQU 1 (
654 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
655 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
656 set IbcMergePackageVersionOutputFile="%__IntermediatesDir%\ibcmergeversion.txt"
657 call "%__ProjectDir%\dotnet.cmd" msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo %__CommonMSBuildArgs% /p:IbcMergePackageVersionOutputFile="!IbcMergePackageVersionOutputFile!"
659 if not !errorlevel! == 0 (
660 echo "Failed to determine IBC Merge version."
663 if not exist "!IbcMergePackageVersionOutputFile!" (
664 echo "Failed to determine IBC Merge version."
668 set /p __IbcMergeVersion=<"!IbcMergePackageVersionOutputFile!"
670 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\tools\netcoreapp2.0\ibcmerge.dll
671 if exist !IbcMergePath! (
672 echo %__MsgPrefix%Optimizing using IBC training data
673 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\System.Private.CoreLib.dll\
674 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
675 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
677 if exist "!InputAssemblyFile!" (
678 set RawOptimizationDataFilePattern=!OptimizationDataDir!*.ibc
679 set RawOptimizationDataFile=
680 for %%x in (!RawOptimizationDataFilePattern!) do @(
681 if [!RawOptimizationDataFile!] == [] (
682 set RawOptimizationDataFile="%%x"
684 set RawOptimizationDataFile=!RawOptimizationDataFile! "%%x"
688 set IBCMergeCommand=%__ProjectDir%\dotnet.cmd --roll-forward-on-no-candidate-fx 2 "!IbcMergePath!"
690 REM Merge the optimization data into the source DLL
691 set NEXTCMD=!IBCMergeCommand! -q -f -delete -mo "!InputAssemblyFile!" !RawOptimizationDataFile!
692 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
693 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
694 if NOT !errorlevel! == 0 (
695 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
696 REM Put it in the same log, helpful for Jenkins
697 type %__CrossGenCoreLibLog%
701 REM Verify that the optimization data has been merged
702 set NEXTCMD=!IBCMergeCommand! -mi "!InputAssemblyFile!"
703 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
704 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
705 if NOT !errorlevel! == 0 (
706 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
707 REM Put it in the same log, helpful for Jenkins
708 type %__CrossGenCoreLibLog%
712 REM Save the module as *.pgo to match the convention expected
713 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
716 if exist "!TargetOptimizationDataFile!" (
717 REM Customize IBCMerge's arguments depending on input props
718 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
720 REM Apply optimization data to the compiled assembly
721 set NEXTCMD=!IBCMergeCommand! !IBCMergeArguments!
722 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
723 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
724 if NOT !errorlevel! == 0 (
725 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
726 REM Put it in the same log, helpful for Jenkins
727 type %__CrossGenCoreLibLog%
731 REM Verify that the optimization data has been applied
732 set NEXTCMD=!IBCMergeCommand! -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
733 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
734 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
735 if NOT !errorlevel! == 0 (
736 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
737 REM Put it in the same log, helpful for Jenkins
738 type %__CrossGenCoreLibLog%
742 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
743 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
744 REM Put it in the same log, helpful for Jenkins
745 type %__CrossGenCoreLibLog%
749 echo Could not find IBCMerge at !IbcMergePath!. Have you restored src/.nuget/optdata/ibcmerge.csproj?
754 REM } Scope environment changes end
758 REM =========================================================================================
760 REM === Build native System.Private.CoreLib.
762 REM =========================================================================================
764 REM Scope environment changes start {
767 REM Need diasymreader.dll on your path for /CreatePdb
768 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
770 if %__BuildNativeCoreLib% EQU 1 (
771 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
772 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
774 REM Need VS native tools environment for the **target** arch when running instrumented binaries
775 if %__PgoInstrument% EQU 1 (
776 set __VCExecArch=%__BuildArch%
777 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
778 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
779 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
780 @if defined _echo @echo on
781 if NOT !errorlevel! == 0 (
782 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
786 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
788 for /f "tokens=*" %%f in ('where pgort*.dll') do (
789 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
791 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
792 copy /y "!__PgoRtPath!" "%__BinDir%" || (
793 echo %__MsgPrefix%Error: copy failed
799 if defined __CrossgenAltJit (
800 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
801 REM so we don't need to save or unset these afterwards.
802 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
803 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
805 set COMPlus_AltJitNgen=*
806 set COMPlus_AltJitName=%__CrossgenAltJit%
807 set COMPlus_AltJitAssertOnNYI=1
808 set COMPlus_NoGuiOnAssert=1
809 set COMPlus_ContinueOnAssert=0
812 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%\IL" /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
813 echo %__MsgPrefix%!NEXTCMD!
814 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
815 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
816 if NOT !errorlevel! == 0 (
817 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
818 REM Put it in the same log, helpful for Jenkins
819 type %__CrossGenCoreLibLog%
823 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
824 echo %__MsgPrefix%!NEXTCMD!
825 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
826 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
827 if NOT !errorlevel! == 0 (
828 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
829 REM Put it in the same log, helpful for Jenkins
830 type %__CrossGenCoreLibLog%
835 REM } Scope environment changes end
838 REM =========================================================================================
840 REM === Build packages
842 REM =========================================================================================
844 if %__BuildPackages% EQU 1 (
845 REM Scope environment changes start {
848 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
850 set __BuildLog="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.binlog"
852 REM The conditions as to what to build are captured in the builds file.
853 REM Package build uses the Arcade system and scripts, relying on it to restore required toolsets as part of build
854 powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\build.ps1"^
855 -r -b -projects %__SourceDir%\.nuget\packages.builds^
856 -verbosity minimal /nodeReuse:false /bl:!__BuildLog!^
857 /p:PortableBuild=true /p:ArcadeBuild=true^
858 /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
859 if not !errorlevel! == 0 (
860 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log file for details:
865 REM } Scope environment changes end
869 REM =========================================================================================
871 REM === Test build section
873 REM =========================================================================================
875 if %__BuildTests% EQU 1 (
876 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
879 if defined __Priority (
880 set __PriorityArg=-priority=%__Priority%
882 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% !__PriorityArg! %__UnprocessedBuildArgs%
883 echo %__MsgPrefix%!NEXTCMD!
886 if not !errorlevel! == 0 (
887 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
890 ) else if %__GenerateLayout% EQU 1 (
891 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
893 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly msbuildargs %__UnprocessedBuildArgs%
894 echo %__MsgPrefix%!NEXTCMD!
897 if not !errorlevel! == 0 (
898 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
903 REM =========================================================================================
905 REM === All builds complete!
907 REM =========================================================================================
909 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
910 echo %__MsgPrefix%Product binaries are available at !__BinDir!
913 REM =========================================================================================
915 REM === Handle the "all" case.
917 REM =========================================================================================
923 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
924 if %__TotalSpecifiedBuildArch% EQU 0 (
925 REM Nothing specified means we want to build all architectures.
926 set __BuildArchList=x64 x86 arm arm64
929 REM Otherwise, add all the specified architectures to the list.
931 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
932 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
933 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
934 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
938 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
939 if %__TotalSpecifiedBuildType% EQU 0 (
940 REM Nothing specified means we want to build all build types.
941 set __BuildTypeList=Debug Checked Release
944 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
945 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
946 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
948 REM Create a temporary file to collect build results. We always build all flavors specified, and
949 REM report a summary of the results at the end.
951 set __AllBuildSuccess=true
952 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
953 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
955 for %%i in (%__BuildArchList%) do (
956 for %%j in (%__BuildTypeList%) do (
957 call :BuildOne %%i %%j
961 if %__AllBuildSuccess%==true (
962 echo %__MsgPrefix%All builds succeeded!
965 echo %__MsgPrefix%Builds failed:
966 type %__BuildResultFile%
967 del /f /q %__BuildResultFile%
971 REM This code is unreachable, but leaving it nonetheless, just in case things change.
977 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
978 echo %__MsgPrefix%Invoking: %__NextCmd%
980 if not !errorlevel! == 0 (
981 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
982 set __AllBuildSuccess=false
986 REM =========================================================================================
988 REM === Helper routines
990 REM =========================================================================================
997 echo Build the CoreCLR repo.
1000 echo build.cmd [option1] [option2]
1002 echo build.cmd all [option1] [option2]
1004 echo All arguments are optional. The options are:
1006 echo.-? -h -help --help: view this message.
1007 echo -all: Builds all configurations and platforms.
1008 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
1009 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
1010 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
1011 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
1012 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
1013 echo respectively^).
1014 echo add nativemscorlib to go further and build the native image for designated mscorlib.
1015 echo -nopgooptimize: do not use profile guided optimizations.
1016 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
1017 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
1018 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
1019 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
1020 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
1021 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
1022 echo -skipconfigure: skip CMake ^(default: CMake is run^)
1023 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
1024 echo -skipnative: skip building native components ^(default: native components are built^).
1025 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
1026 echo -skiptests: skip building tests ^(default: tests are built^).
1027 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
1028 echo -skipmanagedtools: skip build tools such as R2R dump and RunInContext
1029 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1030 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1031 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1032 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1033 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1034 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1035 echo portable : build for portable RID.
1037 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1038 echo one or more build architectures or types is specified, then only those build architectures
1039 echo and types are built.
1043 echo -- builds all architectures, and all build types per architecture
1044 echo build -all -x86
1045 echo -- builds all build types for x86
1046 echo build -all -x64 -x86 -Checked -Release
1047 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1051 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1052 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1053 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1054 of the previous version to "%VSINSTALLDIR%" and then build.
1055 REM DIA SDK not included in Express editions
1056 echo Visual Studio Express does not include the DIA SDK. ^
1057 You need Visual Studio 2017 or 2019 (Community is free).
1058 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites