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%
245 if defined __BuildAll goto BuildAll
247 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
248 if %__TotalSpecifiedBuildArch% GTR 1 (
249 echo Error: more than one build architecture specified, but "all" not specified.
253 if %__BuildArchX64%==1 set __BuildArch=x64
254 if %__BuildArchX86%==1 set __BuildArch=x86
255 if %__BuildArchArm%==1 (
259 if %__BuildArchArm64%==1 (
260 set __BuildArch=arm64
264 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
265 if %__TotalSpecifiedBuildType% GTR 1 (
266 echo Error: more than one build type specified, but "all" not specified.
270 if %__BuildTypeDebug%==1 set __BuildType=Debug
271 if %__BuildTypeChecked%==1 set __BuildType=Checked
272 if %__BuildTypeRelease%==1 set __BuildType=Release
274 set __CommonMSBuildArgs=/p:__BuildOS=%__BuildOS% /p:__BuildType=%__BuildType% /p:__BuildArch=%__BuildArch% !__SkipRestoreArg! !__OfficialBuildIdArg!
276 if %__EnforcePgo%==1 (
277 if %__BuildArchArm%==1 (
278 echo NOTICE: enforcepgo does nothing on arm architecture
280 if %__BuildArchArm64%==1 (
281 echo NOTICE: enforcepgo does nothing on arm64 architecture
285 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
287 if %__SkipCrossArchNative% EQU 0 (
288 if %__BuildNative% EQU 1 (
289 if /i "%__BuildArch%"=="arm64" (
290 set __BuildCrossArchNative=1
292 if /i "%__BuildArch%"=="arm" (
293 set __BuildCrossArchNative=1
298 REM Set the remaining variables based upon the determined build configuration
300 if %__PgoOptimize%==0 set __RestoreOptData=0
301 if /i %__BuildType% NEQ Release set __RestoreOptData=0
303 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
304 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
306 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
307 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
308 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
309 set "__PackagesBinDir=%__BinDir%\.nuget"
310 set "__CrossComponentBinDir=%__BinDir%"
311 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
314 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
315 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
316 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
318 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
319 set "__CMakeBinDir=%__BinDir%"
320 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
322 if not exist "%__BinDir%" md "%__BinDir%"
323 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
324 if not exist "%__LogsDir%" md "%__LogsDir%"
325 if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"
327 REM Set up the directory for MSBuild debug logs.
328 set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%
330 REM It is convenient to have your Nuget search path include the location where the build
331 REM will place packages. However nuget used during the build will fail if that directory
332 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
333 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
335 echo %__MsgPrefix%Commencing CoreCLR product build
337 REM Set the remaining variables based upon the determined build configuration
339 echo %__MsgPrefix%Checking prerequisites
342 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
343 if %__CMakeNeeded%==1 (
344 REM Eval the output from set-cmake-path.ps1
345 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
346 REM echo Using CMake from %CMakePath%
349 REM NumberOfCores is an WMI property providing number of physical cores on machine
350 REM processor(s). It is used to set optimal level of CL parallelism during native build step
351 if not defined NumberOfCores (
352 REM Determine number of physical processor cores available on machine
353 set TotalNumberOfCores=0
354 for /f "tokens=*" %%I in (
355 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
356 ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
357 set NumberOfCores=!TotalNumberOfCores!
359 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
361 REM =========================================================================================
363 REM === Start the build steps
365 REM =========================================================================================
367 @if defined _echo @echo on
369 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
370 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
371 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
372 /p:UsePartialNGENOptimization=false /maxcpucount^
373 %__ProjectDir%\build.proj /t:GenerateVersionHeader /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h"^
374 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
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 /nologo') do (
398 set __PgoOptDataVersion=%%s
400 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /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 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
415 set /p PYTHON=<%TEMP%\pythonlocation.txt
417 if NOT DEFINED PYTHON (
418 echo %__MsgPrefix%Error: Could not find a python installation
422 if %__BuildNative% EQU 1 (
424 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
425 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
426 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
428 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
429 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --exc %__SourceDir%\vm\ClrEtwAllMeta.lst --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
431 echo %__MsgPrefix%Laying out ETW event logging interface
432 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
435 if %__BuildCoreLib% EQU 1 (
437 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
438 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
441 if %__BuildCrossArchNative% EQU 1 (
443 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
444 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
446 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
447 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
448 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
450 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
451 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --exc %__SourceDir%\vm\ClrEtwAllMeta.lst --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
453 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
454 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
456 echo %__MsgPrefix%Laying out ETW event logging interface
457 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
460 REM =========================================================================================
462 REM === Build the CLR VM
464 REM =========================================================================================
466 if %__BuildNative% EQU 1 (
467 REM Scope environment changes start {
470 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
472 REM Set the environment for the native build
473 set __VCBuildArch=x86_amd64
474 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
475 if /i "%__BuildArch%" == "arm" (
476 set __VCBuildArch=x86_arm
478 REM Make CMake pick the highest installed version in the 10.0.* range
479 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
481 if /i "%__BuildArch%" == "arm64" (
482 set __VCBuildArch=x86_arm64
484 REM Make CMake pick the highest installed version in the 10.0.* range
485 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
488 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
489 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
490 @if defined _echo @echo on
492 if not defined VSINSTALLDIR (
493 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
496 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
498 if defined __SkipConfigure goto SkipConfigure
500 echo %__MsgPrefix%Regenerating the Visual Studio solution
502 pushd "%__IntermediatesDir%"
503 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%"
504 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
505 @if defined _echo @echo on
509 if not exist "%__IntermediatesDir%\install.vcxproj" (
510 echo %__MsgPrefix%Error: failed to generate native component build project!
514 if defined __ConfigureOnly goto SkipNativeBuild
516 set __BuildLogRootName=CoreCLR
517 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
518 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
519 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
520 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
521 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
522 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
523 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
525 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
526 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
527 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
528 /p:UsePartialNGENOptimization=false /maxcpucount %__IntermediatesDir%\install.vcxproj^
529 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% /m:2 %__UnprocessedBuildArgs%
531 if not !errorlevel! == 0 (
532 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
540 REM } Scope environment changes end
544 REM =========================================================================================
546 REM === Build Cross-Architecture Native Components (if applicable)
548 REM =========================================================================================
550 if %__BuildCrossArchNative% EQU 1 (
551 REM Scope environment changes start {
554 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
556 REM Set the environment for the cross-arch native build
557 set __VCBuildArch=x86_amd64
558 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
560 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
561 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
562 @if defined _echo @echo on
564 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
565 if defined __SkipConfigure goto SkipConfigureCrossBuild
567 pushd "%__CrossCompIntermediatesDir%"
568 set __CMakeBinDir=%__CrossComponentBinDir%
569 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
570 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"
571 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
572 @if defined _echo @echo on
575 :SkipConfigureCrossBuild
576 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
577 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
581 if defined __ConfigureOnly goto SkipCrossCompBuild
583 set __BuildLogRootName=Cross
584 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
585 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
586 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
587 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
588 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
589 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
590 set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
592 call %__ProjectDir%\cmake_msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
593 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
594 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
595 /p:UsePartialNGENOptimization=false /maxcpucount^
596 %__CrossCompIntermediatesDir%\install.vcxproj^
597 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% /m:2 %__UnprocessedBuildArgs%
599 if not !errorlevel! == 0 (
600 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
608 REM } Scope environment changes end
612 REM =========================================================================================
614 REM === CoreLib and NuGet package build section.
616 REM =========================================================================================
618 if %__BuildCoreLib% EQU 1 (
619 REM Scope environment changes start {
622 if %__IbcOnly% EQU 0 (
623 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
624 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
627 set __ExtraBuildArgs=
629 if "%__BuildSOS%" == "0" (
630 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:SkipSOS=true
633 if "%__BuildManagedTools%" == "1" (
634 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
637 if "%__SkipNugetPackage%" == "1" (
638 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=false
640 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=true
643 set __BuildLogRootName=System.Private.CoreLib
644 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
645 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
646 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
647 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
648 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
649 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
650 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
652 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
653 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
654 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
655 /p:UsePartialNGENOptimization=false /maxcpucount^
656 %__ProjectDir%\build.proj^
657 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
659 if not !errorlevel! == 0 (
660 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
667 if %__IbcOptimize% EQU 1 (
668 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
669 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
670 for /f "tokens=*" %%s in ('call "%__ProjectDir%\dotnet.cmd" msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
671 set __IbcMergeVersion=%%s
674 echo Restoring IBCMerge version !__IbcMergeVersion!...
675 echo Running: %__ProjectDir%\dotnet.cmd restore src/.nuget/optdata/ibcmerge.csproj --no-cache --packages "%__PackagesDir%" --source "https://devdiv.pkgs.visualstudio.com/_packaging/dotnet-core-internal-tooling/nuget/v3/index.json"
676 call %__ProjectDir%\dotnet.cmd restore src/.nuget/optdata/ibcmerge.csproj --no-cache --packages "%__PackagesDir%" --source "https://devdiv.pkgs.visualstudio.com/_packaging/dotnet-core-internal-tooling/nuget/v3/index.json"
678 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\tools\netcoreapp2.0\ibcmerge.dll
679 if exist !IbcMergePath! (
680 echo %__MsgPrefix%Optimizing using IBC training data
681 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\System.Private.CoreLib.dll\
682 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
683 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
685 if exist "!InputAssemblyFile!" (
686 set RawOptimizationDataFilePattern=!OptimizationDataDir!*.ibc
687 set RawOptimizationDataFile=
688 for %%x in (!RawOptimizationDataFilePattern!) do @(
689 if [!RawOptimizationDataFile!] == [] (
690 set RawOptimizationDataFile="%%x"
692 set RawOptimizationDataFile=!RawOptimizationDataFile! "%%x"
696 set IBCMergeCommand=%__ProjectDir%\dotnet.cmd --roll-forward-on-no-candidate-fx 2 "!IbcMergePath!"
698 REM Merge the optimization data into the source DLL
699 set NEXTCMD=!IBCMergeCommand! -q -f -delete -mo "!InputAssemblyFile!" !RawOptimizationDataFile!
700 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
701 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
702 if NOT !errorlevel! == 0 (
703 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
704 REM Put it in the same log, helpful for Jenkins
705 type %__CrossGenCoreLibLog%
709 REM Verify that the optimization data has been merged
710 set NEXTCMD=!IBCMergeCommand! -mi "!InputAssemblyFile!"
711 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
712 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
713 if NOT !errorlevel! == 0 (
714 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
715 REM Put it in the same log, helpful for Jenkins
716 type %__CrossGenCoreLibLog%
720 REM Save the module as *.pgo to match the convention expected
721 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
724 if exist "!TargetOptimizationDataFile!" (
725 REM Customize IBCMerge's arguments depending on input props
726 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
728 REM Apply optimization data to the compiled assembly
729 set NEXTCMD=!IBCMergeCommand! !IBCMergeArguments!
730 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
731 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
732 if NOT !errorlevel! == 0 (
733 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
734 REM Put it in the same log, helpful for Jenkins
735 type %__CrossGenCoreLibLog%
739 REM Verify that the optimization data has been applied
740 set NEXTCMD=!IBCMergeCommand! -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
741 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
742 call !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
743 if NOT !errorlevel! == 0 (
744 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
745 REM Put it in the same log, helpful for Jenkins
746 type %__CrossGenCoreLibLog%
750 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
751 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
752 REM Put it in the same log, helpful for Jenkins
753 type %__CrossGenCoreLibLog%
757 echo Could not find IBCMerge at !IbcMergePath!
762 REM } Scope environment changes end
766 REM =========================================================================================
768 REM === Build native System.Private.CoreLib.
770 REM =========================================================================================
772 REM Scope environment changes start {
775 REM Need diasymreader.dll on your path for /CreatePdb
776 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
778 if %__BuildNativeCoreLib% EQU 1 (
779 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
780 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
782 REM Need VS native tools environment for the **target** arch when running instrumented binaries
783 if %__PgoInstrument% EQU 1 (
784 set __VCExecArch=%__BuildArch%
785 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
786 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
787 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
788 @if defined _echo @echo on
789 if NOT !errorlevel! == 0 (
790 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
794 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
796 for /f "tokens=*" %%f in ('where pgort*.dll') do (
797 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
799 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
800 copy /y "!__PgoRtPath!" "%__BinDir%" || (
801 echo %__MsgPrefix%Error: copy failed
807 if defined __CrossgenAltJit (
808 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
809 REM so we don't need to save or unset these afterwards.
810 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
811 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
813 set COMPlus_AltJitNgen=*
814 set COMPlus_AltJitName=%__CrossgenAltJit%
815 set COMPlus_AltJitAssertOnNYI=1
816 set COMPlus_NoGuiOnAssert=1
817 set COMPlus_ContinueOnAssert=0
820 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
821 echo %__MsgPrefix%!NEXTCMD!
822 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
823 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
824 if NOT !errorlevel! == 0 (
825 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
826 REM Put it in the same log, helpful for Jenkins
827 type %__CrossGenCoreLibLog%
831 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
832 echo %__MsgPrefix%!NEXTCMD!
833 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
834 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
835 if NOT !errorlevel! == 0 (
836 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
837 REM Put it in the same log, helpful for Jenkins
838 type %__CrossGenCoreLibLog%
843 REM } Scope environment changes end
846 REM =========================================================================================
848 REM === Build packages
850 REM =========================================================================================
852 if %__BuildPackages% EQU 1 (
853 REM Scope environment changes start {
856 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
858 set __BuildLogRootName=Nuget
859 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
860 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
861 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
862 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
863 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
864 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
865 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
867 REM The conditions as to what to build are captured in the builds file.
868 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
869 /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
870 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
871 /p:UsePartialNGENOptimization=false /maxcpucount^
872 %__SourceDir%\.nuget\packages.builds^
873 !__Logging! /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
875 if not !errorlevel! == 0 (
876 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
883 REM } Scope environment changes end
887 REM =========================================================================================
889 REM === Test build section
891 REM =========================================================================================
893 if %__BuildTests% EQU 1 (
894 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
897 if defined __Priority (
898 set __PriorityArg=-priority=%__Priority%
900 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% !__PriorityArg! %__UnprocessedBuildArgs%
901 echo %__MsgPrefix%!NEXTCMD!
904 if not !errorlevel! == 0 (
905 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
908 ) else if %__GenerateLayout% EQU 1 (
909 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
911 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
912 echo %__MsgPrefix%!NEXTCMD!
915 if not !errorlevel! == 0 (
916 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
921 REM =========================================================================================
923 REM === All builds complete!
925 REM =========================================================================================
927 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
928 echo %__MsgPrefix%Product binaries are available at !__BinDir!
931 REM =========================================================================================
933 REM === Handle the "all" case.
935 REM =========================================================================================
941 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
942 if %__TotalSpecifiedBuildArch% EQU 0 (
943 REM Nothing specified means we want to build all architectures.
944 set __BuildArchList=x64 x86 arm arm64
947 REM Otherwise, add all the specified architectures to the list.
949 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
950 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
951 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
952 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
956 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
957 if %__TotalSpecifiedBuildType% EQU 0 (
958 REM Nothing specified means we want to build all build types.
959 set __BuildTypeList=Debug Checked Release
962 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
963 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
964 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
966 REM Create a temporary file to collect build results. We always build all flavors specified, and
967 REM report a summary of the results at the end.
969 set __AllBuildSuccess=true
970 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
971 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
973 for %%i in (%__BuildArchList%) do (
974 for %%j in (%__BuildTypeList%) do (
975 call :BuildOne %%i %%j
979 if %__AllBuildSuccess%==true (
980 echo %__MsgPrefix%All builds succeeded!
983 echo %__MsgPrefix%Builds failed:
984 type %__BuildResultFile%
985 del /f /q %__BuildResultFile%
989 REM This code is unreachable, but leaving it nonetheless, just in case things change.
995 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
996 echo %__MsgPrefix%Invoking: %__NextCmd%
998 if not !errorlevel! == 0 (
999 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
1000 set __AllBuildSuccess=false
1004 REM =========================================================================================
1006 REM === Helper routines
1008 REM =========================================================================================
1015 echo Build the CoreCLR repo.
1018 echo build.cmd [option1] [option2]
1020 echo build.cmd all [option1] [option2]
1022 echo All arguments are optional. The options are:
1024 echo.-? -h -help --help: view this message.
1025 echo -all: Builds all configurations and platforms.
1026 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
1027 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
1028 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
1029 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
1030 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
1031 echo respectively^).
1032 echo add nativemscorlib to go further and build the native image for designated mscorlib.
1033 echo -nopgooptimize: do not use profile guided optimizations.
1034 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
1035 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
1036 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
1037 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
1038 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
1039 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
1040 echo -skipconfigure: skip CMake ^(default: CMake is run^)
1041 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
1042 echo -skipnative: skip building native components ^(default: native components are built^).
1043 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
1044 echo -skiptests: skip building tests ^(default: tests are built^).
1045 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
1046 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1047 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1048 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1049 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1050 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1051 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1052 echo portable : build for portable RID.
1054 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1055 echo one or more build architectures or types is specified, then only those build architectures
1056 echo and types are built.
1060 echo -- builds all architectures, and all build types per architecture
1061 echo build -all -x86
1062 echo -- builds all build types for x86
1063 echo build -all -x64 -x86 -Checked -Release
1064 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1068 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1069 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1070 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1071 of the previous version to "%VSINSTALLDIR%" and then build.
1072 REM DIA SDK not included in Express editions
1073 echo Visual Studio Express does not include the DIA SDK. ^
1074 You need Visual Studio 2017 or 2019 (Community is free).
1075 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites