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=/p:RestoreDuringBuild=true
104 set __OfficialBuildIdArg=
106 set __PgoOptDataVersion=
107 set __IbcOptDataVersion=
108 set __IbcMergeVersion=
110 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
112 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
113 @REM and allow the "-priority=1" syntax.
117 if "%1" == "" goto ArgsDone
119 if /i "%1" == "/?" goto Usage
120 if /i "%1" == "-?" goto Usage
121 if /i "%1" == "/h" goto Usage
122 if /i "%1" == "-h" goto Usage
123 if /i "%1" == "/help" goto Usage
124 if /i "%1" == "-help" goto Usage
125 if /i "%1" == "--help" goto Usage
127 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 REM TODO these are deprecated remove them eventually
138 REM don't add more, use the - syntax instead
139 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
149 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
151 REM Explicitly block -Rebuild.
152 if /i "%1" == "Rebuild" (
153 echo "ERROR: 'Rebuild' is not supported. Please remove it."
156 if /i "%1" == "-Rebuild" (
157 echo "ERROR: 'Rebuild' is not supported. Please remove it."
162 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
163 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
164 if [!__PassThroughArgs!]==[] (
165 set __PassThroughArgs=%1
167 set __PassThroughArgs=%__PassThroughArgs% %1
170 if /i "%1" == "-freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
171 if /i "%1" == "-linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "-netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 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)
176 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)
177 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
184 if /i "%1" == "-generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
185 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)
186 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
187 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
189 if /i "%1" == "-ibcoptimize" (set __IbcOptimize=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "-ibconly" (set __IbcOptimize=1&set __IbcOnly=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
192 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
193 REM TODO remove these once they are no longer used in buildpipeline
194 if /i "%1" == "-skiprestore" (set __SkipRestoreArg=/p:RestoreDuringBuild=false&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
195 if /i "%1" == "-OfficialBuildId" (set __OfficialBuildIdArg=/p:OfficialBuildId=%2&set processedArgs=!processedArgs! %1=%2&shift&shift&goto Arg_Loop)
197 REM TODO these are deprecated remove them eventually
198 REM don't add more, use the - syntax instead
199 if /i "%1" == "freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 if /i "%1" == "linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 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)
205 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)
206 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if /i "%1" == "skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
211 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
213 if /i "%1" == "generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
214 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)
215 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
216 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
217 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
218 if /i "%1" == "ibcoptimize" (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
219 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
220 if /i "%1" == "crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
221 REM TODO remove this once it's no longer used in buildpipeline
222 if /i "%1" == "--" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
224 if [!processedArgs!]==[] (
225 set __UnprocessedBuildArgs=%__args%
227 set __UnprocessedBuildArgs=%__args%
228 for %%t in (!processedArgs!) do (
229 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
235 @REM Special handling for -priority=N argument.
236 if defined __Priority (
237 if defined __PassThroughArgs (
238 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
240 set __PassThroughArgs=-priority=%__Priority%
244 if defined __BuildAll goto BuildAll
246 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
247 if %__TotalSpecifiedBuildArch% GTR 1 (
248 echo Error: more than one build architecture specified, but "all" not specified.
252 if %__BuildArchX64%==1 set __BuildArch=x64
253 if %__BuildArchX86%==1 set __BuildArch=x86
254 if %__BuildArchArm%==1 (
258 if %__BuildArchArm64%==1 (
259 set __BuildArch=arm64
263 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
264 if %__TotalSpecifiedBuildType% GTR 1 (
265 echo Error: more than one build type specified, but "all" not specified.
269 if %__BuildTypeDebug%==1 set __BuildType=Debug
270 if %__BuildTypeChecked%==1 set __BuildType=Checked
271 if %__BuildTypeRelease%==1 set __BuildType=Release
273 set __CommonMSBuildArgs=/p:__BuildOS=%__BuildOS% /p:__BuildType=%__BuildType% /p:__BuildArch=%__BuildArch% !__SkipRestoreArg! !__OfficialBuildIdArg!
275 if %__EnforcePgo%==1 (
276 if %__BuildArchArm%==1 (
277 echo NOTICE: enforcepgo does nothing on arm architecture
279 if %__BuildArchArm64%==1 (
280 echo NOTICE: enforcepgo does nothing on arm64 architecture
284 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
286 if %__SkipCrossArchNative% EQU 0 (
287 if %__BuildNative% EQU 1 (
288 if /i "%__BuildArch%"=="arm64" (
289 set __BuildCrossArchNative=1
291 if /i "%__BuildArch%"=="arm" (
292 set __BuildCrossArchNative=1
297 REM Set the remaining variables based upon the determined build configuration
299 if %__PgoOptimize%==0 set __RestoreOptData=0
300 if /i %__BuildType% NEQ Release set __RestoreOptData=0
302 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
303 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
304 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
305 set "__PackagesBinDir=%__BinDir%\.nuget"
306 set "__CrossComponentBinDir=%__BinDir%"
307 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
310 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
311 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
312 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
314 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
315 set "__CMakeBinDir=%__BinDir%"
316 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
318 if not exist "%__BinDir%" md "%__BinDir%"
319 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
320 if not exist "%__LogsDir%" md "%__LogsDir%"
321 if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"
323 REM Set up the directory for MSBuild debug logs.
324 set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%
326 REM It is convenient to have your Nuget search path include the location where the build
327 REM will place packages. However nuget used during the build will fail if that directory
328 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
329 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
331 echo %__MsgPrefix%Commencing CoreCLR product build
333 REM Set the remaining variables based upon the determined build configuration
335 echo %__MsgPrefix%Checking prerequisites
338 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
339 if %__CMakeNeeded%==1 (
340 REM Eval the output from set-cmake-path.ps1
341 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
342 REM echo Using CMake from %CMakePath%
345 REM NumberOfCores is an WMI property providing number of physical cores on machine
346 REM processor(s). It is used to set optimal level of CL parallelism during native build step
347 if not defined NumberOfCores (
348 REM Determine number of physical processor cores available on machine
349 set TotalNumberOfCores=0
350 for /f "tokens=*" %%I in (
351 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
352 ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
353 set NumberOfCores=!TotalNumberOfCores!
355 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
357 REM =========================================================================================
359 REM === Start the build steps
361 REM =========================================================================================
363 @if defined _echo @echo on
365 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
366 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
367 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
368 /p:UsePartialNGENOptimization=false /maxcpucount^
369 %__ProjectDir%\build.proj /t:GenerateVersionHeader /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h"^
370 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
371 if not !errorlevel! == 0 (
372 echo %__MsgPrefix%Error: Failed to generate version headers.
376 REM =========================================================================================
378 REM === Restore optimization profile data
380 REM =========================================================================================
382 if %__RestoreOptData% EQU 1 (
383 echo %__MsgPrefix%Restoring the OptimizationData Package
384 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
385 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
386 /p:UsePartialNGENOptimization=false /maxcpucount^
387 ./build.proj /t:RestoreOptData^
388 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
389 if not !errorlevel! == 0 (
390 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
395 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
396 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
397 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /p:ArcadeBuild^=true /nologo') do (
398 set __PgoOptDataVersion=%%s
400 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /p:ArcadeBuild^=true /nologo') do (
401 set __IbcOptDataVersion=%%s
404 REM =========================================================================================
406 REM === Generate source files for eventing
408 REM =========================================================================================
410 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
411 set __IntermediatesEventingDir=%__IntermediatesDir%\Eventing
413 REM Find python and set it to the variable PYTHON
414 set _C=-c "import sys; sys.stdout.write(sys.executable)"
415 (py -3 %_C% || py -2 %_C% || python3 %_C% || python2 %_C% || python %_C%) > %TEMP%\pythonlocation.txt 2> NUL
417 set /p PYTHON=<%TEMP%\pythonlocation.txt
419 if NOT DEFINED PYTHON (
420 echo %__MsgPrefix%Error: Could not find a python installation
424 if %__BuildCoreLib% EQU 1 (
425 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
426 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
429 REM =========================================================================================
431 REM === Build Cross-Architecture Native Components (if applicable)
433 REM =========================================================================================
435 if %__BuildCrossArchNative% EQU 1 (
436 REM Scope environment changes start {
439 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
441 REM Set the environment for the cross-arch native build
442 set __VCBuildArch=x86_amd64
443 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
445 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
446 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
447 @if defined _echo @echo on
449 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
450 if defined __SkipConfigure goto SkipConfigureCrossBuild
452 pushd "%__CrossCompIntermediatesDir%"
453 set __CMakeBinDir=%__CrossComponentBinDir%
454 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
455 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"
456 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
457 @if defined _echo @echo on
460 :SkipConfigureCrossBuild
461 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
462 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
466 if defined __ConfigureOnly goto SkipCrossCompBuild
468 set __BuildLogRootName=Cross
469 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
470 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
471 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
472 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
473 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
474 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
475 set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
477 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
478 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
479 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
480 /p:UsePartialNGENOptimization=false /maxcpucount^
481 %__CrossCompIntermediatesDir%\install.vcxproj^
482 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
484 if not !errorlevel! == 0 (
485 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
493 REM } Scope environment changes end
497 REM =========================================================================================
499 REM === Build the CLR VM
501 REM =========================================================================================
503 if %__BuildNative% EQU 1 (
504 REM Scope environment changes start {
507 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
509 REM Set the environment for the native build
510 set __VCBuildArch=x86_amd64
511 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
512 if /i "%__BuildArch%" == "arm" (
513 set __VCBuildArch=x86_arm
514 REM Make CMake pick the highest installed version in the 10.0.* range
515 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
516 set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
518 if /i "%__BuildArch%" == "arm64" (
519 set __VCBuildArch=x86_arm64
521 REM Make CMake pick the highest installed version in the 10.0.* range
522 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
523 set ___CrossBuildDefine="-DCLR_CMAKE_CROSS_ARCH=1" "-DCLR_CMAKE_CROSS_HOST_ARCH=%__CrossArch%"
526 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
527 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
528 @if defined _echo @echo on
530 if not defined VSINSTALLDIR (
531 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
534 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
536 if defined __SkipConfigure goto SkipConfigure
538 echo %__MsgPrefix%Regenerating the Visual Studio solution
540 echo Cross Arch Defines !___CrossBuildDefine!
542 pushd "%__IntermediatesDir%"
543 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%"
544 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
545 @if defined _echo @echo on
549 if not exist "%__IntermediatesDir%\install.vcxproj" (
550 echo %__MsgPrefix%Error: failed to generate native component build project!
554 if defined __ConfigureOnly goto SkipNativeBuild
556 set __BuildLogRootName=CoreCLR
557 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
558 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
559 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
560 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
561 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
562 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
563 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
565 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
566 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
567 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
568 /p:UsePartialNGENOptimization=false /maxcpucount %__IntermediatesDir%\install.vcxproj^
569 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
571 if not !errorlevel! == 0 (
572 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
580 REM } Scope environment changes end
584 REM =========================================================================================
586 REM === CoreLib and NuGet package build section.
588 REM =========================================================================================
590 if %__BuildCoreLib% EQU 1 (
591 REM Scope environment changes start {
594 if %__IbcOnly% EQU 0 (
595 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
596 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
599 set __ExtraBuildArgs=
601 if "%__BuildSOS%" == "0" (
602 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:SkipSOS=true
605 if "%__BuildManagedTools%" == "1" (
606 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
609 set __BuildLogRootName=System.Private.CoreLib
610 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
611 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
612 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
613 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
614 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
615 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
616 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
618 call %__ProjectDir%\dotnet.cmd restore /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
619 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
620 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
621 /p:UsePartialNGENOptimization=false /maxcpucount /p:IncludeRestoreOnlyProjects=true /p:ArcadeBuild=true^
622 %__ProjectDir%\src\build.proj^
623 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
624 if not !errorlevel! == 0 (
625 echo %__MsgPrefix%Error: Managed Product assemblies restore failed. Refer to the build log files for details:
632 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
633 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
634 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
635 /p:UsePartialNGENOptimization=false /maxcpucount /p:ArcadeBuild=true^
636 %__ProjectDir%\src\build.proj^
637 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
638 if not !errorlevel! == 0 (
639 echo %__MsgPrefix%Error: Managed Product assemblies build failed. Refer to the build log files for details:
646 if %__IbcOptimize% EQU 1 (
647 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
648 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
649 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /p:ArcadeBuild=true /nologo') do @(
650 set __IbcMergeVersion=%%s
653 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\tools\netcoreapp2.0\ibcmerge.dll
654 if exist !IbcMergePath! (
655 echo %__MsgPrefix%Optimizing using IBC training data
656 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\System.Private.CoreLib.dll\
657 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
658 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
660 if exist "!InputAssemblyFile!" (
661 set RawOptimizationDataFilePattern=!OptimizationDataDir!*.ibc
662 set RawOptimizationDataFile=
663 for %%x in (!RawOptimizationDataFilePattern!) do @(
664 if [!RawOptimizationDataFile!] == [] (
665 set RawOptimizationDataFile="%%x"
667 set RawOptimizationDataFile=!RawOptimizationDataFile! "%%x"
671 set IBCMergeCommand=%__ProjectDir%\dotnet.cmd --roll-forward-on-no-candidate-fx 2 "!IbcMergePath!"
673 REM Merge the optimization data into the source DLL
674 set NEXTCMD=!IBCMergeCommand! -q -f -delete -mo "!InputAssemblyFile!" !RawOptimizationDataFile!
675 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
676 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
677 if NOT !errorlevel! == 0 (
678 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
679 REM Put it in the same log, helpful for Jenkins
680 type %__CrossGenCoreLibLog%
684 REM Verify that the optimization data has been merged
685 set NEXTCMD=!IBCMergeCommand! -mi "!InputAssemblyFile!"
686 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
687 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
688 if NOT !errorlevel! == 0 (
689 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
690 REM Put it in the same log, helpful for Jenkins
691 type %__CrossGenCoreLibLog%
695 REM Save the module as *.pgo to match the convention expected
696 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
699 if exist "!TargetOptimizationDataFile!" (
700 REM Customize IBCMerge's arguments depending on input props
701 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
703 REM Apply optimization data to the compiled assembly
704 set NEXTCMD=!IBCMergeCommand! !IBCMergeArguments!
705 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
706 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
707 if NOT !errorlevel! == 0 (
708 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
709 REM Put it in the same log, helpful for Jenkins
710 type %__CrossGenCoreLibLog%
714 REM Verify that the optimization data has been applied
715 set NEXTCMD=!IBCMergeCommand! -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
716 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
717 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
718 if NOT !errorlevel! == 0 (
719 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
720 REM Put it in the same log, helpful for Jenkins
721 type %__CrossGenCoreLibLog%
725 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
726 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
727 REM Put it in the same log, helpful for Jenkins
728 type %__CrossGenCoreLibLog%
732 echo Could not find IBCMerge at !IbcMergePath!. Have you restored src/.nuget/optdata/ibcmerge.csproj?
737 REM } Scope environment changes end
741 REM =========================================================================================
743 REM === Build native System.Private.CoreLib.
745 REM =========================================================================================
747 REM Scope environment changes start {
750 REM Need diasymreader.dll on your path for /CreatePdb
751 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
753 if %__BuildNativeCoreLib% EQU 1 (
754 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
755 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
757 REM Need VS native tools environment for the **target** arch when running instrumented binaries
758 if %__PgoInstrument% EQU 1 (
759 set __VCExecArch=%__BuildArch%
760 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
761 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
762 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
763 @if defined _echo @echo on
764 if NOT !errorlevel! == 0 (
765 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
769 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
771 for /f "tokens=*" %%f in ('where pgort*.dll') do (
772 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
774 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
775 copy /y "!__PgoRtPath!" "%__BinDir%" || (
776 echo %__MsgPrefix%Error: copy failed
782 if defined __CrossgenAltJit (
783 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
784 REM so we don't need to save or unset these afterwards.
785 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
786 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
788 set COMPlus_AltJitNgen=*
789 set COMPlus_AltJitName=%__CrossgenAltJit%
790 set COMPlus_AltJitAssertOnNYI=1
791 set COMPlus_NoGuiOnAssert=1
792 set COMPlus_ContinueOnAssert=0
795 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%\IL" /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
796 echo %__MsgPrefix%!NEXTCMD!
797 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
798 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
799 if NOT !errorlevel! == 0 (
800 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
801 REM Put it in the same log, helpful for Jenkins
802 type %__CrossGenCoreLibLog%
806 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
807 echo %__MsgPrefix%!NEXTCMD!
808 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
809 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
810 if NOT !errorlevel! == 0 (
811 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
812 REM Put it in the same log, helpful for Jenkins
813 type %__CrossGenCoreLibLog%
818 REM } Scope environment changes end
821 REM =========================================================================================
823 REM === Build packages
825 REM =========================================================================================
827 if %__BuildPackages% EQU 1 (
828 REM Scope environment changes start {
831 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
833 set __BuildLog="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.binlog"
835 REM The conditions as to what to build are captured in the builds file.
836 REM Package build uses the Arcade system and scripts, relying on it to restore required toolsets as part of build
837 powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%~dp0eng\common\build.ps1"^
838 -r -b -projects %__SourceDir%\.nuget\packages.builds^
839 -verbosity minimal /nodeReuse:false /bl:!__BuildLog!^
840 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
841 /p:UsePartialNGENOptimization=false /p:ArcadeBuild=true^
842 /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
843 if not !errorlevel! == 0 (
844 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log file for details:
849 REM } Scope environment changes end
853 REM =========================================================================================
855 REM === Test build section
857 REM =========================================================================================
859 if %__BuildTests% EQU 1 (
860 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
863 if defined __Priority (
864 set __PriorityArg=-priority=%__Priority%
866 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% !__PriorityArg! %__UnprocessedBuildArgs%
867 echo %__MsgPrefix%!NEXTCMD!
870 if not !errorlevel! == 0 (
871 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
874 ) else if %__GenerateLayout% EQU 1 (
875 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
877 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly msbuildargs %__UnprocessedBuildArgs%
878 echo %__MsgPrefix%!NEXTCMD!
881 if not !errorlevel! == 0 (
882 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
887 REM =========================================================================================
889 REM === All builds complete!
891 REM =========================================================================================
893 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
894 echo %__MsgPrefix%Product binaries are available at !__BinDir!
897 REM =========================================================================================
899 REM === Handle the "all" case.
901 REM =========================================================================================
907 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
908 if %__TotalSpecifiedBuildArch% EQU 0 (
909 REM Nothing specified means we want to build all architectures.
910 set __BuildArchList=x64 x86 arm arm64
913 REM Otherwise, add all the specified architectures to the list.
915 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
916 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
917 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
918 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
922 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
923 if %__TotalSpecifiedBuildType% EQU 0 (
924 REM Nothing specified means we want to build all build types.
925 set __BuildTypeList=Debug Checked Release
928 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
929 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
930 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
932 REM Create a temporary file to collect build results. We always build all flavors specified, and
933 REM report a summary of the results at the end.
935 set __AllBuildSuccess=true
936 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
937 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
939 for %%i in (%__BuildArchList%) do (
940 for %%j in (%__BuildTypeList%) do (
941 call :BuildOne %%i %%j
945 if %__AllBuildSuccess%==true (
946 echo %__MsgPrefix%All builds succeeded!
949 echo %__MsgPrefix%Builds failed:
950 type %__BuildResultFile%
951 del /f /q %__BuildResultFile%
955 REM This code is unreachable, but leaving it nonetheless, just in case things change.
961 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
962 echo %__MsgPrefix%Invoking: %__NextCmd%
964 if not !errorlevel! == 0 (
965 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
966 set __AllBuildSuccess=false
970 REM =========================================================================================
972 REM === Helper routines
974 REM =========================================================================================
981 echo Build the CoreCLR repo.
984 echo build.cmd [option1] [option2]
986 echo build.cmd all [option1] [option2]
988 echo All arguments are optional. The options are:
990 echo.-? -h -help --help: view this message.
991 echo -all: Builds all configurations and platforms.
992 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
993 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
994 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
995 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
996 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
998 echo add nativemscorlib to go further and build the native image for designated mscorlib.
999 echo -nopgooptimize: do not use profile guided optimizations.
1000 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
1001 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
1002 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
1003 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
1004 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
1005 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
1006 echo -skipconfigure: skip CMake ^(default: CMake is run^)
1007 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
1008 echo -skipnative: skip building native components ^(default: native components are built^).
1009 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
1010 echo -skiptests: skip building tests ^(default: tests are built^).
1011 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
1012 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1013 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1014 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1015 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1016 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1017 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1018 echo portable : build for portable RID.
1020 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1021 echo one or more build architectures or types is specified, then only those build architectures
1022 echo and types are built.
1026 echo -- builds all architectures, and all build types per architecture
1027 echo build -all -x86
1028 echo -- builds all build types for x86
1029 echo build -all -x64 -x86 -Checked -Release
1030 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1034 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1035 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1036 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1037 of the previous version to "%VSINSTALLDIR%" and then build.
1038 REM DIA SDK not included in Express editions
1039 echo Visual Studio Express does not include the DIA SDK. ^
1040 You need Visual Studio 2017 or 2019 (Community is free).
1041 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites