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
42 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
44 :: Thus, these variables are not simply internal to this script!
46 :: Set the default arguments for build
49 set __BuildOS=Windows_NT
51 :: Set the various build properties here so that CMake and MSBuild can pick them up
52 set "__ProjectDir=%~dp0"
53 :: remove trailing slash
54 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
55 set "__ProjectFilesDir=%__ProjectDir%"
56 set "__SourceDir=%__ProjectDir%\src"
57 set "__PackagesDir=%DotNetRestorePackagesPath%"
58 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\packages"
59 set "__RootBinDir=%__ProjectDir%\bin"
60 set "__LogsDir=%__RootBinDir%\Logs"
61 set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"
68 set __BuildArchArm64=0
70 set __BuildTypeDebug=0
71 set __BuildTypeChecked=0
72 set __BuildTypeRelease=0
81 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
83 set __PassThroughArgs=
85 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
88 set __UnprocessedBuildArgs=
89 set __CommonMSBuildArgs=
94 set __BuildCrossArchNative=0
95 set __SkipCrossArchNative=0
98 set __BuildNativeCoreLib=1
99 set __BuildManagedTools=1
100 set __RestoreOptData=1
101 set __GenerateLayout=0
102 set __CrossgenAltJit=
103 set __SkipRestoreArg=
104 set __OfficialBuildIdArg=
106 set __SkipNugetPackage=0
107 set __PgoOptDataVersion=
108 set __IbcOptDataVersion=
109 set __IbcMergeVersion=
111 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
113 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
114 @REM and allow the "-priority=1" syntax.
118 if "%1" == "" goto ArgsDone
120 if /i "%1" == "/?" goto Usage
121 if /i "%1" == "-?" goto Usage
122 if /i "%1" == "/h" goto Usage
123 if /i "%1" == "-h" goto Usage
124 if /i "%1" == "/help" goto Usage
125 if /i "%1" == "-help" goto Usage
126 if /i "%1" == "--help" goto Usage
128 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 REM TODO these are deprecated remove them eventually
139 REM don't add more, use the - syntax instead
140 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
152 REM Explicitly block -Rebuild.
153 if /i "%1" == "Rebuild" (
154 echo "ERROR: 'Rebuild' is not supported. Please remove it."
157 if /i "%1" == "-Rebuild" (
158 echo "ERROR: 'Rebuild' is not supported. Please remove it."
163 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
164 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
165 if [!__PassThroughArgs!]==[] (
166 set __PassThroughArgs=%1
168 set __PassThroughArgs=%__PassThroughArgs% %1
171 if /i "%1" == "-freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "-linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 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)
177 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)
178 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
184 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
185 if /i "%1" == "-generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 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)
187 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
189 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "-ibcoptimize" (set __IbcOptimize=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "-ibconly" (set __IbcOptimize=1&set __IbcOnly=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
192 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
193 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
194 REM TODO remove these once they are no longer used in buildpipeline
195 if /i "%1" == "-skiprestore" (set __SkipRestoreArg=/p:RestoreDuringBuild=false&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
196 if /i "%1" == "-OfficialBuildId" (set __OfficialBuildIdArg=/p:OfficialBuildId=%2&set processedArgs=!processedArgs! %1=%2&shift&shift&goto Arg_Loop)
198 REM TODO these are deprecated remove them eventually
199 REM don't add more, use the - syntax instead
200 if /i "%1" == "freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 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)
206 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)
207 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if /i "%1" == "skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
211 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
213 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
214 if /i "%1" == "generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
215 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)
216 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
217 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
218 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
219 if /i "%1" == "ibcoptimize" (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
220 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
221 if /i "%1" == "crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
222 REM TODO remove this once it's no longer used in buildpipeline
223 if /i "%1" == "--" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
225 if [!processedArgs!]==[] (
226 set __UnprocessedBuildArgs=%__args%
228 set __UnprocessedBuildArgs=%__args%
229 for %%t in (!processedArgs!) do (
230 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
236 @REM Special handling for -priority=N argument.
237 if defined __Priority (
238 if defined __PassThroughArgs (
239 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
241 set __PassThroughArgs=-priority=%__Priority%
243 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! /p:CLRTestPriorityToBuild=%__Priority%
246 if defined __BuildAll goto BuildAll
248 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
249 if %__TotalSpecifiedBuildArch% GTR 1 (
250 echo Error: more than one build architecture specified, but "all" not specified.
254 if %__BuildArchX64%==1 set __BuildArch=x64
255 if %__BuildArchX86%==1 set __BuildArch=x86
256 if %__BuildArchArm%==1 (
260 if %__BuildArchArm64%==1 (
261 set __BuildArch=arm64
265 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
266 if %__TotalSpecifiedBuildType% GTR 1 (
267 echo Error: more than one build type specified, but "all" not specified.
271 if %__BuildTypeDebug%==1 set __BuildType=Debug
272 if %__BuildTypeChecked%==1 set __BuildType=Checked
273 if %__BuildTypeRelease%==1 set __BuildType=Release
275 set __CommonMSBuildArgs=/p:__BuildOS=%__BuildOS% /p:__BuildType=%__BuildType% /p:__BuildArch=%__BuildArch% !__SkipRestoreArg! !__OfficialBuildIdArg!
277 if %__EnforcePgo%==1 (
278 if %__BuildArchArm%==1 (
279 echo NOTICE: enforcepgo does nothing on arm architecture
281 if %__BuildArchArm64%==1 (
282 echo NOTICE: enforcepgo does nothing on arm64 architecture
286 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
288 if %__SkipCrossArchNative% EQU 0 (
289 if %__BuildNative% EQU 1 (
290 if /i "%__BuildArch%"=="arm64" (
291 set __BuildCrossArchNative=1
293 if /i "%__BuildArch%"=="arm" (
294 set __BuildCrossArchNative=1
299 REM Set the remaining variables based upon the determined build configuration
301 if %__PgoOptimize%==0 set __RestoreOptData=0
302 if /i %__BuildType% NEQ Release set __RestoreOptData=0
304 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
305 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
307 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
308 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
309 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
310 set "__PackagesBinDir=%__BinDir%\.nuget"
311 set "__CrossComponentBinDir=%__BinDir%"
312 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
315 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
316 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
317 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
319 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
320 set "__CMakeBinDir=%__BinDir%"
321 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
323 if not exist "%__BinDir%" md "%__BinDir%"
324 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
325 if not exist "%__LogsDir%" md "%__LogsDir%"
326 if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"
328 REM Set up the directory for MSBuild debug logs.
329 set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%
331 REM It is convenient to have your Nuget search path include the location where the build
332 REM will place packages. However nuget used during the build will fail if that directory
333 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
334 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
336 echo %__MsgPrefix%Commencing CoreCLR product build
338 REM Set the remaining variables based upon the determined build configuration
340 echo %__MsgPrefix%Checking prerequisites
343 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
344 if %__CMakeNeeded%==1 (
345 REM Eval the output from set-cmake-path.ps1
346 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
347 REM echo Using CMake from %CMakePath%
350 REM NumberOfCores is an WMI property providing number of physical cores on machine
351 REM processor(s). It is used to set optimal level of CL parallelism during native build step
352 if not defined NumberOfCores (
353 REM Determine number of physical processor cores available on machine
354 set TotalNumberOfCores=0
355 for /f "tokens=*" %%I in (
356 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
357 ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
358 set NumberOfCores=!TotalNumberOfCores!
360 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
362 REM =========================================================================================
364 REM === Start the build steps
366 REM =========================================================================================
368 @if defined _echo @echo on
370 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
371 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
372 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
373 /p:UsePartialNGENOptimization=false /maxcpucount^
374 %__ProjectDir%\build.proj /t:GenerateVersionHeader /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h"^
375 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
377 REM =========================================================================================
379 REM === Restore optimization profile data
381 REM =========================================================================================
383 if %__RestoreOptData% EQU 1 (
384 echo %__MsgPrefix%Restoring the OptimizationData Package
385 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
386 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
387 /p:UsePartialNGENOptimization=false /maxcpucount^
388 ./build.proj /t:RestoreOptData^
389 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
390 if not !errorlevel! == 0 (
391 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
396 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
397 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
398 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
399 set __PgoOptDataVersion=%%s
401 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
402 set __IbcOptDataVersion=%%s
405 REM =========================================================================================
407 REM === Generate source files for eventing
409 REM =========================================================================================
411 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
412 set __IntermediatesEventingDir=%__IntermediatesDir%\Eventing
414 REM Find python and set it to the variable PYTHON
415 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
416 set /p PYTHON=<%TEMP%\pythonlocation.txt
418 if NOT DEFINED PYTHON (
419 echo %__MsgPrefix%Error: Could not find a python installation
423 if %__BuildNative% EQU 1 (
425 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
426 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
427 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
429 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
430 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
432 echo %__MsgPrefix%Laying out ETW event logging interface
433 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
436 if %__BuildCoreLib% EQU 1 (
438 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
439 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
442 if %__BuildCrossArchNative% EQU 1 (
444 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
445 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
447 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
448 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
449 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
451 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
452 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
454 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
455 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
457 echo %__MsgPrefix%Laying out ETW event logging interface
458 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
461 REM =========================================================================================
463 REM === Build the CLR VM
465 REM =========================================================================================
467 if %__BuildNative% EQU 1 (
468 REM Scope environment changes start {
471 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
473 REM Set the environment for the native build
474 set __VCBuildArch=x86_amd64
475 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
476 if /i "%__BuildArch%" == "arm" (
477 set __VCBuildArch=x86_arm
479 REM Make CMake pick the highest installed version in the 10.0.* range
480 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
482 if /i "%__BuildArch%" == "arm64" (
483 set __VCBuildArch=x86_arm64
485 REM Make CMake pick the highest installed version in the 10.0.* range
486 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
489 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
490 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
491 @if defined _echo @echo on
493 if not defined VSINSTALLDIR (
494 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
497 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
499 if defined __SkipConfigure goto SkipConfigure
501 echo %__MsgPrefix%Regenerating the Visual Studio solution
503 pushd "%__IntermediatesDir%"
504 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOS%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%"
505 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
506 @if defined _echo @echo on
510 if not exist "%__IntermediatesDir%\install.vcxproj" (
511 echo %__MsgPrefix%Error: failed to generate native component build project!
515 if defined __ConfigureOnly goto SkipNativeBuild
517 set __BuildLogRootName=CoreCLR
518 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
519 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
520 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
521 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
522 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
523 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
524 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
526 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
527 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
528 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
529 /p:UsePartialNGENOptimization=false /maxcpucount %__IntermediatesDir%\install.vcxproj^
530 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% /m:2 %__UnprocessedBuildArgs%
532 if not !errorlevel! == 0 (
533 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
541 REM } Scope environment changes end
545 REM =========================================================================================
547 REM === Build Cross-Architecture Native Components (if applicable)
549 REM =========================================================================================
551 if %__BuildCrossArchNative% EQU 1 (
552 REM Scope environment changes start {
555 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
557 REM Set the environment for the cross-arch native build
558 set __VCBuildArch=x86_amd64
559 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
561 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
562 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
563 @if defined _echo @echo on
565 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
566 if defined __SkipConfigure goto SkipConfigureCrossBuild
568 pushd "%__CrossCompIntermediatesDir%"
569 set __CMakeBinDir=%__CrossComponentBinDir%
570 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
571 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"
572 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
573 @if defined _echo @echo on
576 :SkipConfigureCrossBuild
577 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
578 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
582 if defined __ConfigureOnly goto SkipCrossCompBuild
584 set __BuildLogRootName=Cross
585 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
586 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
587 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
588 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
589 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
590 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
591 set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
593 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
594 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
595 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
596 /p:UsePartialNGENOptimization=false /maxcpucount^
597 %__CrossCompIntermediatesDir%\install.vcxproj^
598 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% /m:2 %__UnprocessedBuildArgs%
600 if not !errorlevel! == 0 (
601 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
609 REM } Scope environment changes end
613 REM =========================================================================================
615 REM === CoreLib and NuGet package build section.
617 REM =========================================================================================
619 if %__BuildCoreLib% EQU 1 (
620 REM Scope environment changes start {
623 if %__IbcOnly% EQU 0 (
624 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
625 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
628 set __ExtraBuildArgs=
630 if "%__BuildSOS%" == "0" (
631 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:SkipSOS=true
634 if "%__BuildManagedTools%" == "1" (
635 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
638 if "%__SkipNugetPackage%" == "1" (
639 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=false
641 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=true
644 set __BuildLogRootName=System.Private.CoreLib
645 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
646 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
647 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
648 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
649 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
650 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
651 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
653 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
654 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
655 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
656 /p:UsePartialNGENOptimization=false /maxcpucount^
657 %__ProjectDir%\build.proj^
658 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
660 if not !errorlevel! == 0 (
661 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
668 if %__IbcOptimize% EQU 1 (
669 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
670 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
671 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
672 set __IbcMergeVersion=%%s
675 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
676 if exist !IbcMergePath! (
677 echo %__MsgPrefix%Optimizing using IBC training data
678 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\System.Private.CoreLib\
679 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
680 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
682 if exist "!InputAssemblyFile!" (
683 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
685 REM Merge the optimization data into the source DLL
686 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
687 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
688 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
689 if NOT !errorlevel! == 0 (
690 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
691 REM Put it in the same log, helpful for Jenkins
692 type %__CrossGenCoreLibLog%
696 REM Verify that the optimization data has been merged
697 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
698 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
699 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
700 if NOT !errorlevel! == 0 (
701 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
702 REM Put it in the same log, helpful for Jenkins
703 type %__CrossGenCoreLibLog%
707 REM Save the module as *.pgo to match the convention expected
708 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
711 if exist "!TargetOptimizationDataFile!" (
712 REM Customize IBCMerge's arguments depending on input props
713 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
715 REM Apply optimization data to the compiled assembly
716 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
717 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
718 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
719 if NOT !errorlevel! == 0 (
720 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
721 REM Put it in the same log, helpful for Jenkins
722 type %__CrossGenCoreLibLog%
726 REM Verify that the optimization data has been applied
727 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
728 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
729 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
730 if NOT !errorlevel! == 0 (
731 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
732 REM Put it in the same log, helpful for Jenkins
733 type %__CrossGenCoreLibLog%
737 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
738 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
739 REM Put it in the same log, helpful for Jenkins
740 type %__CrossGenCoreLibLog%
746 REM } Scope environment changes end
750 REM =========================================================================================
752 REM === Build native System.Private.CoreLib.
754 REM =========================================================================================
756 REM Scope environment changes start {
759 REM Need diasymreader.dll on your path for /CreatePdb
760 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
762 if %__BuildNativeCoreLib% EQU 1 (
763 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
764 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
766 REM Need VS native tools environment for the **target** arch when running instrumented binaries
767 if %__PgoInstrument% EQU 1 (
768 set __VCExecArch=%__BuildArch%
769 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
770 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
771 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
772 @if defined _echo @echo on
773 if NOT !errorlevel! == 0 (
774 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
778 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
780 for /f "tokens=*" %%f in ('where pgort*.dll') do (
781 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
783 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
784 copy /y "!__PgoRtPath!" "%__BinDir%" || (
785 echo %__MsgPrefix%Error: copy failed
791 if defined __CrossgenAltJit (
792 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
793 REM so we don't need to save or unset these afterwards.
794 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
795 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
797 set COMPlus_AltJitNgen=*
798 set COMPlus_AltJitName=%__CrossgenAltJit%
799 set COMPlus_AltJitAssertOnNYI=1
800 set COMPlus_NoGuiOnAssert=1
801 set COMPlus_ContinueOnAssert=0
804 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
805 echo %__MsgPrefix%!NEXTCMD!
806 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
807 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
808 if NOT !errorlevel! == 0 (
809 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
810 REM Put it in the same log, helpful for Jenkins
811 type %__CrossGenCoreLibLog%
815 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
816 echo %__MsgPrefix%!NEXTCMD!
817 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
818 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
819 if NOT !errorlevel! == 0 (
820 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
821 REM Put it in the same log, helpful for Jenkins
822 type %__CrossGenCoreLibLog%
827 REM } Scope environment changes end
830 REM =========================================================================================
832 REM === Build packages
834 REM =========================================================================================
836 if %__BuildPackages% EQU 1 (
837 REM Scope environment changes start {
840 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
842 set __BuildLogRootName=Nuget
843 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
844 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
845 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
846 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
847 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
848 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
849 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
851 REM The conditions as to what to build are captured in the builds file.
852 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
853 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
854 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
855 /p:UsePartialNGENOptimization=false /maxcpucount^
856 %__SourceDir%\.nuget\packages.builds^
857 !__Logging! /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
859 if not !errorlevel! == 0 (
860 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
867 REM } Scope environment changes end
871 REM =========================================================================================
873 REM === Test build section
875 REM =========================================================================================
877 if %__BuildTests% EQU 1 (
878 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
880 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
881 echo %__MsgPrefix%!NEXTCMD!
884 if not !errorlevel! == 0 (
885 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
888 ) else if %__GenerateLayout% EQU 1 (
889 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
891 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
892 echo %__MsgPrefix%!NEXTCMD!
895 if not !errorlevel! == 0 (
896 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
901 REM =========================================================================================
903 REM === All builds complete!
905 REM =========================================================================================
907 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
908 echo %__MsgPrefix%Product binaries are available at !__BinDir!
911 REM =========================================================================================
913 REM === Handle the "all" case.
915 REM =========================================================================================
921 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
922 if %__TotalSpecifiedBuildArch% EQU 0 (
923 REM Nothing specified means we want to build all architectures.
924 set __BuildArchList=x64 x86 arm arm64
927 REM Otherwise, add all the specified architectures to the list.
929 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
930 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
931 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
932 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
936 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
937 if %__TotalSpecifiedBuildType% EQU 0 (
938 REM Nothing specified means we want to build all build types.
939 set __BuildTypeList=Debug Checked Release
942 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
943 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
944 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
946 REM Create a temporary file to collect build results. We always build all flavors specified, and
947 REM report a summary of the results at the end.
949 set __AllBuildSuccess=true
950 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
951 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
953 for %%i in (%__BuildArchList%) do (
954 for %%j in (%__BuildTypeList%) do (
955 call :BuildOne %%i %%j
959 if %__AllBuildSuccess%==true (
960 echo %__MsgPrefix%All builds succeeded!
963 echo %__MsgPrefix%Builds failed:
964 type %__BuildResultFile%
965 del /f /q %__BuildResultFile%
969 REM This code is unreachable, but leaving it nonetheless, just in case things change.
975 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
976 echo %__MsgPrefix%Invoking: %__NextCmd%
978 if not !errorlevel! == 0 (
979 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
980 set __AllBuildSuccess=false
984 REM =========================================================================================
986 REM === Helper routines
988 REM =========================================================================================
995 echo Build the CoreCLR repo.
998 echo build.cmd [option1] [option2]
1000 echo build.cmd all [option1] [option2]
1002 echo All arguments are optional. The options are:
1004 echo.-? -h -help --help: view this message.
1005 echo -all: Builds all configurations and platforms.
1006 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
1007 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
1008 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
1009 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
1010 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
1011 echo respectively^).
1012 echo add nativemscorlib to go further and build the native image for designated mscorlib.
1013 echo -nopgooptimize: do not use profile guided optimizations.
1014 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
1015 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
1016 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
1017 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
1018 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
1019 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
1020 echo -skipconfigure: skip CMake ^(default: CMake is run^)
1021 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
1022 echo -skipnative: skip building native components ^(default: native components are built^).
1023 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
1024 echo -skiptests: skip building tests ^(default: tests are built^).
1025 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
1026 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1027 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1028 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1029 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1030 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1031 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1032 echo portable : build for portable RID.
1034 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1035 echo one or more build architectures or types is specified, then only those build architectures
1036 echo and types are built.
1040 echo -- builds all architectures, and all build types per architecture
1041 echo build -all -x86
1042 echo -- builds all build types for x86
1043 echo build -all -x64 -x86 -Checked -Release
1044 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1048 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1049 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1050 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1051 of the previous version to "%VSINSTALLDIR%" and then build.
1052 REM DIA SDK not included in Express editions
1053 echo Visual Studio Express does not include the DIA SDK. ^
1054 You need Visual Studio 2017 or 2019 (Community is free).
1055 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites