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 VS150COMNTOOLS (
17 set "__VSToolsRoot=%VS150COMNTOOLS%"
18 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
19 set __VSVersion=vs2017
21 set "__VSToolsRoot=%VS140COMNTOOLS%"
22 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
23 set __VSVersion=vs2015
26 :: Work around Jenkins CI + msbuild problem: Jenkins sometimes creates very large environment
27 :: variables, and msbuild can't handle environment blocks with such large variables. So clear
28 :: out the variables that might be too large.
31 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
32 :: __BuildArch -- default: x64
33 :: __BuildType -- default: Debug
34 :: __BuildOS -- default: Windows_NT
35 :: __ProjectDir -- default: directory of the dir.props file
36 :: __SourceDir -- default: %__ProjectDir%\src\
37 :: __PackagesDir -- default: %__ProjectDir%\packages\
38 :: __RootBinDir -- default: %__ProjectDir%\bin\
39 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
41 :: __PackagesBinDir -- default: %__BinDir%\.nuget
42 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
44 :: Thus, these variables are not simply internal to this script!
46 :: Set the default arguments for build
49 set __BuildOS=Windows_NT
51 :: Set the various build properties here so that CMake and MSBuild can pick them up
52 set "__ProjectDir=%~dp0"
53 :: remove trailing slash
54 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
55 set "__ProjectFilesDir=%__ProjectDir%"
56 set "__SourceDir=%__ProjectDir%\src"
57 set "__PackagesDir=%DotNetRestorePackagesPath%"
58 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\packages"
59 set "__RootBinDir=%__ProjectDir%\bin"
60 set "__LogsDir=%__RootBinDir%\Logs"
61 set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"
68 set __BuildArchArm64=0
70 set __BuildTypeDebug=0
71 set __BuildTypeChecked=0
72 set __BuildTypeRelease=0
81 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
83 set __PassThroughArgs=
85 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
88 set __UnprocessedBuildArgs=
89 set __CommonMSBuildArgs=
94 set __BuildCrossArchNative=0
95 set __SkipCrossArchNative=0
98 set __BuildNativeCoreLib=1
99 set __BuildManagedTools=1
100 set __RestoreOptData=1
101 set __GenerateLayout=0
102 set __CrossgenAltJit=
103 set __SkipRestoreArg=
104 set __OfficialBuildIdArg=
106 set __SkipNugetPackage=0
107 set __PgoOptDataVersion=
108 set __IbcOptDataVersion=
109 set __IbcMergeVersion=
111 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
113 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
114 @REM and allow the "-priority=1" syntax.
118 if "%1" == "" goto ArgsDone
120 if /i "%1" == "/?" goto Usage
121 if /i "%1" == "-?" goto Usage
122 if /i "%1" == "/h" goto Usage
123 if /i "%1" == "-h" goto Usage
124 if /i "%1" == "/help" goto Usage
125 if /i "%1" == "-help" goto Usage
126 if /i "%1" == "--help" goto Usage
128 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 REM TODO these are deprecated remove them eventually
139 REM don't add more, use the - syntax instead
140 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
152 REM Explicitly block -Rebuild.
153 if /i "%1" == "Rebuild" (
154 echo "ERROR: 'Rebuild' is not supported. Please remove it."
157 if /i "%1" == "-Rebuild" (
158 echo "ERROR: 'Rebuild' is not supported. Please remove it."
163 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
164 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
165 if [!__PassThroughArgs!]==[] (
166 set __PassThroughArgs=%1
168 set __PassThroughArgs=%__PassThroughArgs% %1
171 if /i "%1" == "-freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "-linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-nativemscorlib" (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-configureonly" (set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
184 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
185 if /i "%1" == "-generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 if /i "%1" == "-usenmakemakefiles" (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
187 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
189 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "-ibcoptimize" (set __IbcOptimize=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "-ibconly" (set __IbcOptimize=1&set __IbcOnly=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
192 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
193 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
194 REM TODO remove these once they are no longer used in buildpipeline
195 if /i "%1" == "-skiprestore" (set __SkipRestoreArg=/p:RestoreDuringBuild=false&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
196 if /i "%1" == "-OfficialBuildId" (set __OfficialBuildIdArg=/p:OfficialBuildId=%2&set processedArgs=!processedArgs! %1=%2&shift&shift&goto Arg_Loop)
198 REM TODO these are deprecated remove them eventually
199 REM don't add more, use the - syntax instead
200 if /i "%1" == "freebsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "linuxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "netbsdmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "osxmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "windowsmscorlib" (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 if /i "%1" == "nativemscorlib" (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildManagedTools=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 if /i "%1" == "configureonly" (set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if /i "%1" == "skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
211 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
213 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
214 if /i "%1" == "generatelayout" (set __GenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
215 if /i "%1" == "usenmakemakefiles" (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
216 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
217 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
218 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
219 if /i "%1" == "ibcoptimize" (set __IbcOptimize=1&set __PartialNgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
220 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
221 if /i "%1" == "crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
222 REM TODO remove this once it's no longer used in buildpipeline
223 if /i "%1" == "--" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
225 if [!processedArgs!]==[] (
226 set __UnprocessedBuildArgs=%__args%
228 set __UnprocessedBuildArgs=%__args%
229 for %%t in (!processedArgs!) do (
230 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
236 @REM Special handling for -priority=N argument.
237 if defined __Priority (
238 if defined __PassThroughArgs (
239 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
241 set __PassThroughArgs=-priority=%__Priority%
243 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! /p:CLRTestPriorityToBuild=%__Priority%
246 if defined __BuildAll goto BuildAll
248 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
249 if %__TotalSpecifiedBuildArch% GTR 1 (
250 echo Error: more than one build architecture specified, but "all" not specified.
254 if %__BuildArchX64%==1 set __BuildArch=x64
255 if %__BuildArchX86%==1 set __BuildArch=x86
256 if %__BuildArchArm%==1 (
260 if %__BuildArchArm64%==1 (
261 set __BuildArch=arm64
265 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
266 if %__TotalSpecifiedBuildType% GTR 1 (
267 echo Error: more than one build type specified, but "all" not specified.
271 if %__BuildTypeDebug%==1 set __BuildType=Debug
272 if %__BuildTypeChecked%==1 set __BuildType=Checked
273 if %__BuildTypeRelease%==1 set __BuildType=Release
275 set __CommonMSBuildArgs=/p:__BuildOS=%__BuildOS% /p:__BuildType=%__BuildType% /p:__BuildArch=%__BuildArch% !__SkipRestoreArg! !__OfficialBuildIdArg!
277 if %__EnforcePgo%==1 (
278 if %__BuildArchArm%==1 (
279 echo NOTICE: enforcepgo does nothing on arm architecture
281 if %__BuildArchArm64%==1 (
282 echo NOTICE: enforcepgo does nothing on arm64 architecture
286 REM Determine if this is a cross-arch build. Only do cross-arch build if we're also building native.
288 if %__SkipCrossArchNative% EQU 0 (
289 if %__BuildNative% EQU 1 (
290 if /i "%__BuildArch%"=="arm64" (
291 set __BuildCrossArchNative=1
293 if /i "%__BuildArch%"=="arm" (
294 set __BuildCrossArchNative=1
299 REM Set the remaining variables based upon the determined build configuration
301 if %__PgoOptimize%==0 set __RestoreOptData=0
302 if /i %__BuildType% NEQ Release set __RestoreOptData=0
304 REM REVIEW: why no System.Private.CoreLib NuGet package build for ARM64?
305 if /i "%__BuildArch%"=="arm64" set __SkipNugetPackage=0
307 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
308 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
309 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
310 set "__PackagesBinDir=%__BinDir%\.nuget"
311 set "__CrossComponentBinDir=%__BinDir%"
312 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
315 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
316 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
317 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
319 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
320 set "__CMakeBinDir=%__BinDir%"
321 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
323 if not exist "%__BinDir%" md "%__BinDir%"
324 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
325 if not exist "%__LogsDir%" md "%__LogsDir%"
326 if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"
328 REM Set up the directory for MSBuild debug logs.
329 set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%
331 REM It is convenient to have your Nuget search path include the location where the build
332 REM will place packages. However nuget used during the build will fail if that directory
333 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
334 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
336 echo %__MsgPrefix%Commencing CoreCLR product build
338 REM Set the remaining variables based upon the determined build configuration
340 echo %__MsgPrefix%Checking prerequisites
343 if %__BuildNative%==0 if %__BuildNativeCoreLib%==0 if %__BuildTests%==0 set __CMakeNeeded=0
344 if %__CMakeNeeded%==1 (
345 REM Eval the output from set-cmake-path.ps1
346 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
347 REM echo Using CMake from %CMakePath%
350 REM NumberOfCores is an WMI property providing number of physical cores on machine
351 REM processor(s). It is used to set optimal level of CL parallelism during native build step
352 if not defined NumberOfCores (
353 REM Determine number of physical processor cores available on machine
354 set TotalNumberOfCores=0
355 for /f "tokens=*" %%I in (
356 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
357 ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
358 set NumberOfCores=!TotalNumberOfCores!
360 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
362 REM =========================================================================================
364 REM === Start the build steps
366 REM =========================================================================================
368 @if defined _echo @echo on
370 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
371 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
372 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
373 /p:UsePartialNGENOptimization=false /maxcpucount^
374 %__ProjectDir%\build.proj /t:GenerateVersionHeader /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h"^
375 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
377 REM =========================================================================================
379 REM === Restore optimization profile data
381 REM =========================================================================================
383 if %__RestoreOptData% EQU 1 (
384 echo %__MsgPrefix%Restoring the OptimizationData Package
385 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
386 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
387 /p:UsePartialNGENOptimization=false /maxcpucount^
388 ./build.proj /t:RestoreOptData^
389 %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
390 if not !errorlevel! == 0 (
391 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
396 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
397 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
398 if not exist "%DotNetCli%" (
399 echo %__MsgPrefix%Error: "%DotNetCli%" not found
402 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
403 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do (
404 set __PgoOptDataVersion=%%s
406 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do (
407 set __IbcOptDataVersion=%%s
410 REM =========================================================================================
412 REM === Generate source files for eventing
414 REM =========================================================================================
416 set __IntermediatesIncDir=%__IntermediatesDir%\src\inc
417 set __IntermediatesEventingDir=%__IntermediatesDir%\eventing
419 REM Find python and set it to the variable PYTHON
420 echo import sys; sys.stdout.write(sys.executable) | (py -3 || py -2 || python3 || python2 || python) > %TEMP%\pythonlocation.txt 2> NUL
421 set /p PYTHON=<%TEMP%\pythonlocation.txt
423 if NOT DEFINED PYTHON (
424 echo %__MsgPrefix%Error: Could not find a python installation
428 if %__BuildNative% EQU 1 (
430 echo %__MsgPrefix%Laying out dynamically generated files consumed by the native build system
431 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
432 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc %__IntermediatesIncDir% --dummy %__IntermediatesIncDir%\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern --noxplatheader|| exit /b 1
434 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
435 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir%\eventpipe --nonextern || exit /b 1
437 echo %__MsgPrefix%Laying out ETW event logging interface
438 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesIncDir% --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
441 if %__BuildCoreLib% EQU 1 (
443 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
444 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate %__IntermediatesEventingDir% || exit /b 1
447 if %__BuildCrossArchNative% EQU 1 (
449 set __CrossCompIntermediatesIncDir=%__CrossCompIntermediatesDir%\src\inc
450 set __CrossCompIntermediatesEventingDir=%__CrossCompIntermediatesDir%\eventing
452 echo %__MsgPrefix%Laying out dynamically generated files consumed by the crossarch build system
453 echo %__MsgPrefix%Laying out dynamically generated Event test files and etmdummy stub functions
454 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventing.py --inc !__CrossCompIntermediatesIncDir! --dummy !__CrossCompIntermediatesIncDir!\etmdummy.h --man %__SourceDir%\vm\ClrEtwAll.man --nonextern || exit /b 1
456 echo %__MsgPrefix%Laying out dynamically generated EventPipe Implementation
457 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEventPipe.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir!\eventpipe --nonextern || exit /b 1
459 echo %__MsgPrefix%Laying out dynamically generated EventSource classes
460 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genRuntimeEventSources.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesEventingDir! || exit /b 1
462 echo %__MsgPrefix%Laying out ETW event logging interface
463 "!PYTHON!" -B -Wall %__SourceDir%\scripts\genEtwProvider.py --man %__SourceDir%\vm\ClrEtwAll.man --intermediate !__CrossCompIntermediatesIncDir! --exc %__SourceDir%\vm\ClrEtwAllMeta.lst || exit /b 1
466 REM =========================================================================================
468 REM === Build the CLR VM
470 REM =========================================================================================
472 if %__BuildNative% EQU 1 (
473 REM Scope environment changes start {
476 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
478 REM Set the environment for the native build
479 set __VCBuildArch=x86_amd64
480 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
481 if /i "%__BuildArch%" == "arm" (
482 set __VCBuildArch=x86_arm
484 REM Make CMake pick the highest installed version in the 10.0.* range
485 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
487 if /i "%__BuildArch%" == "arm64" (
488 set __VCBuildArch=x86_arm64
490 REM Make CMake pick the highest installed version in the 10.0.* range
491 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
494 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
495 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
496 @if defined _echo @echo on
498 if not defined VSINSTALLDIR (
499 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
502 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
504 if defined __SkipConfigure goto SkipConfigure
506 echo %__MsgPrefix%Regenerating the Visual Studio solution
508 pushd "%__IntermediatesDir%"
509 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%"
510 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
511 @if defined _echo @echo on
515 if not exist "%__IntermediatesDir%\install.vcxproj" (
516 echo %__MsgPrefix%Error: failed to generate native component build project!
520 if defined __ConfigureOnly goto SkipNativeBuild
522 set __BuildLogRootName=CoreCLR
523 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
524 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
525 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
526 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
527 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
528 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
529 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
531 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
532 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
533 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
534 /p:UsePartialNGENOptimization=false /maxcpucount %__IntermediatesDir%\install.vcxproj^
535 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% /m:2 %__UnprocessedBuildArgs%
537 if not !errorlevel! == 0 (
538 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
546 REM } Scope environment changes end
550 REM =========================================================================================
552 REM === Build Cross-Architecture Native Components (if applicable)
554 REM =========================================================================================
556 if %__BuildCrossArchNative% EQU 1 (
557 REM Scope environment changes start {
560 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
562 REM Set the environment for the cross-arch native build
563 set __VCBuildArch=x86_amd64
564 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
566 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
567 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
568 @if defined _echo @echo on
570 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
571 if defined __SkipConfigure goto SkipConfigureCrossBuild
573 pushd "%__CrossCompIntermediatesDir%"
574 set __CMakeBinDir=%__CrossComponentBinDir%
575 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
576 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"
577 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
578 @if defined _echo @echo on
581 :SkipConfigureCrossBuild
582 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
583 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
587 if defined __ConfigureOnly goto SkipCrossCompBuild
589 set __BuildLogRootName=Cross
590 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
591 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
592 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
593 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
594 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
595 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
596 set __Logging=!_MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
598 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
599 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
600 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
601 /p:UsePartialNGENOptimization=false /maxcpucount^
602 %__CrossCompIntermediatesDir%\install.vcxproj^
603 !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__CommonMSBuildArgs% /m:2 %__UnprocessedBuildArgs%
605 if not !errorlevel! == 0 (
606 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
614 REM } Scope environment changes end
618 REM =========================================================================================
620 REM === CoreLib and NuGet package build section.
622 REM =========================================================================================
624 if %__BuildCoreLib% EQU 1 (
625 REM Scope environment changes start {
628 if %__IbcOnly% EQU 0 (
629 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
630 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
633 set __ExtraBuildArgs=
635 if "%__BuildSOS%" == "0" (
636 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:SkipSOS=true
639 if "%__BuildManagedTools%" == "1" (
640 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildManagedTools=true
643 if "%__SkipNugetPackage%" == "1" (
644 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=false
646 set __ExtraBuildArgs=!__ExtraBuildArgs! /p:BuildNugetPackage=true
649 set __BuildLogRootName=System.Private.CoreLib
650 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
651 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
652 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
653 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
654 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
655 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
656 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
658 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
659 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
660 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
661 /p:UsePartialNGENOptimization=false /maxcpucount^
662 %__ProjectDir%\build.proj^
663 !__Logging! %__CommonMSBuildArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
665 if not !errorlevel! == 0 (
666 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
673 if %__IbcOptimize% EQU 1 (
674 echo %__MsgPrefix%Commencing IBCMerge of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
675 set IbcMergeProjectFilePath=%__ProjectDir%\src\.nuget\optdata\ibcmerge.csproj
676 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "!IbcMergeProjectFilePath!" /t:DumpIbcMergePackageVersion /nologo') do @(
677 set __IbcMergeVersion=%%s
680 set IbcMergePath=%__PackagesDir%\microsoft.dotnet.ibcmerge\!__IbcMergeVersion!\lib\net45\ibcmerge.exe
681 if exist !IbcMergePath! (
682 echo %__MsgPrefix%Optimizing using IBC training data
683 set OptimizationDataDir=%__PackagesDir%\optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR\!__IbcOptDataVersion!\data\
684 set InputAssemblyFile=!OptimizationDataDir!System.Private.CoreLib.dll
685 set TargetOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.pgo
687 if exist "!InputAssemblyFile!" (
688 set RawOptimizationDataFile=!OptimizationDataDir!System.Private.CoreLib.ibc
690 REM Merge the optimization data into the source DLL
691 set NEXTCMD="!IbcMergePath!" -q -f -delete -mo "!InputAssemblyFile!" "!RawOptimizationDataFile!"
692 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
693 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
694 if NOT !errorlevel! == 0 (
695 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
696 REM Put it in the same log, helpful for Jenkins
697 type %__CrossGenCoreLibLog%
701 REM Verify that the optimization data has been merged
702 set NEXTCMD="!IbcMergePath!" -mi "!InputAssemblyFile!"
703 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
704 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
705 if NOT !errorlevel! == 0 (
706 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
707 REM Put it in the same log, helpful for Jenkins
708 type %__CrossGenCoreLibLog%
712 REM Save the module as *.pgo to match the convention expected
713 copy /y !InputAssemblyFile! !TargetOptimizationDataFile!
716 if exist "!TargetOptimizationDataFile!" (
717 REM Customize IBCMerge's arguments depending on input props
718 set IBCMergeArguments=-q -f -delete -mo "%__BinDir%\IL\System.Private.CoreLib.dll" -incremental "!TargetOptimizationDataFile!"
720 REM Apply optimization data to the compiled assembly
721 set NEXTCMD="!IbcMergePath!" !IBCMergeArguments!
722 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
723 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
724 if NOT !errorlevel! == 0 (
725 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
726 REM Put it in the same log, helpful for Jenkins
727 type %__CrossGenCoreLibLog%
731 REM Verify that the optimization data has been applied
732 set NEXTCMD="!IbcMergePath!" -mi "%__BinDir%\IL\System.Private.CoreLib.dll"
733 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
734 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
735 if NOT !errorlevel! == 0 (
736 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
737 REM Put it in the same log, helpful for Jenkins
738 type %__CrossGenCoreLibLog%
742 echo %__MsgPrefix%!TargetOptimizationDataFile! does not exist >> %__CrossGenCoreLibLog%
743 echo %__MsgPrefix%Error: IbcMerge of System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
744 REM Put it in the same log, helpful for Jenkins
745 type %__CrossGenCoreLibLog%
751 REM } Scope environment changes end
755 REM =========================================================================================
757 REM === Build native System.Private.CoreLib.
759 REM =========================================================================================
761 REM Scope environment changes start {
764 REM Need diasymreader.dll on your path for /CreatePdb
765 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
767 if %__BuildNativeCoreLib% EQU 1 (
768 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
769 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
771 REM Need VS native tools environment for the **target** arch when running instrumented binaries
772 if %__PgoInstrument% EQU 1 (
773 set __VCExecArch=%__BuildArch%
774 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
775 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
776 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
777 @if defined _echo @echo on
778 if NOT !errorlevel! == 0 (
779 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
783 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
785 for /f "tokens=*" %%f in ('where pgort*.dll') do (
786 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
788 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
789 copy /y "!__PgoRtPath!" "%__BinDir%" || (
790 echo %__MsgPrefix%Error: copy failed
796 if defined __CrossgenAltJit (
797 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
798 REM so we don't need to save or unset these afterwards.
799 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
800 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
802 set COMPlus_AltJitNgen=*
803 set COMPlus_AltJitName=%__CrossgenAltJit%
804 set COMPlus_AltJitAssertOnNYI=1
805 set COMPlus_NoGuiOnAssert=1
806 set COMPlus_ContinueOnAssert=0
809 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
810 echo %__MsgPrefix%!NEXTCMD!
811 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
812 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
813 if NOT !errorlevel! == 0 (
814 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
815 REM Put it in the same log, helpful for Jenkins
816 type %__CrossGenCoreLibLog%
820 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\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 /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
826 REM Put it in the same log, helpful for Jenkins
827 type %__CrossGenCoreLibLog%
832 REM } Scope environment changes end
835 REM =========================================================================================
837 REM === Build packages
839 REM =========================================================================================
841 if %__BuildPackages% EQU 1 (
842 REM Scope environment changes start {
845 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
847 set __BuildLogRootName=Nuget
848 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
849 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
850 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
851 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
852 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
853 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
854 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
856 REM The conditions as to what to build are captured in the builds file.
857 call %__ProjectDir%\msbuild.cmd /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
858 /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
859 /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
860 /p:UsePartialNGENOptimization=false /maxcpucount^
861 %__SourceDir%\.nuget\packages.builds^
862 !__Logging! /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__UnprocessedBuildArgs%
864 if not !errorlevel! == 0 (
865 echo %__MsgPrefix%Error: Nuget package generation failed. Refer to the build log files for details:
872 REM } Scope environment changes end
876 REM =========================================================================================
878 REM === Test build section
880 REM =========================================================================================
882 if %__BuildTests% EQU 1 (
883 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
885 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
886 echo %__MsgPrefix%!NEXTCMD!
889 if not !errorlevel! == 0 (
890 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
893 ) else if %__GenerateLayout% EQU 1 (
894 echo %__MsgPrefix%Generating layout for %__BuildOS%.%__BuildArch%.%__BuildType%
896 set NEXTCMD=call %__ProjectDir%\tests\runtest.cmd %__BuildArch% %__BuildType% GenerateLayoutOnly %__UnprocessedBuildArgs%
897 echo %__MsgPrefix%!NEXTCMD!
900 if not !errorlevel! == 0 (
901 REM runtest.cmd has already emitted an error message and mentioned the build log file to examine.
906 REM =========================================================================================
908 REM === All builds complete!
910 REM =========================================================================================
912 echo %__MsgPrefix%Build succeeded. Finished at %TIME%
913 echo %__MsgPrefix%Product binaries are available at !__BinDir!
916 REM =========================================================================================
918 REM === Handle the "all" case.
920 REM =========================================================================================
926 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
927 if %__TotalSpecifiedBuildArch% EQU 0 (
928 REM Nothing specified means we want to build all architectures.
929 set __BuildArchList=x64 x86 arm arm64
932 REM Otherwise, add all the specified architectures to the list.
934 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
935 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
936 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
937 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
941 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
942 if %__TotalSpecifiedBuildType% EQU 0 (
943 REM Nothing specified means we want to build all build types.
944 set __BuildTypeList=Debug Checked Release
947 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
948 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
949 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
951 REM Create a temporary file to collect build results. We always build all flavors specified, and
952 REM report a summary of the results at the end.
954 set __AllBuildSuccess=true
955 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
956 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
958 for %%i in (%__BuildArchList%) do (
959 for %%j in (%__BuildTypeList%) do (
960 call :BuildOne %%i %%j
964 if %__AllBuildSuccess%==true (
965 echo %__MsgPrefix%All builds succeeded!
968 echo %__MsgPrefix%Builds failed:
969 type %__BuildResultFile%
970 del /f /q %__BuildResultFile%
974 REM This code is unreachable, but leaving it nonetheless, just in case things change.
980 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
981 echo %__MsgPrefix%Invoking: %__NextCmd%
983 if not !errorlevel! == 0 (
984 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
985 set __AllBuildSuccess=false
989 REM =========================================================================================
991 REM === Helper routines
993 REM =========================================================================================
1000 echo Build the CoreCLR repo.
1003 echo build.cmd [option1] [option2]
1005 echo build.cmd all [option1] [option2]
1007 echo All arguments are optional. The options are:
1009 echo.-? -h -help --help: view this message.
1010 echo -all: Builds all configurations and platforms.
1011 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
1012 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
1013 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
1014 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
1015 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
1016 echo respectively^).
1017 echo add nativemscorlib to go further and build the native image for designated mscorlib.
1018 echo -nopgooptimize: do not use profile guided optimizations.
1019 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
1020 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
1021 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
1022 echo -ibcoptimize: use IBC data to optimize System.Private.CoreLib.dll
1023 echo -ibconly: only run the ibcoptimize step. Assumes an appropriate build already exists
1024 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
1025 echo -skipconfigure: skip CMake ^(default: CMake is run^)
1026 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
1027 echo -skipnative: skip building native components ^(default: native components are built^).
1028 echo -skipcrossarchnative: skip building cross-architecture native components ^(default: components are built^).
1029 echo -skiptests: skip building tests ^(default: tests are built^).
1030 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
1031 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
1032 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
1033 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
1034 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
1035 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
1036 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
1037 echo portable : build for portable RID.
1039 echo If "all" is specified, then all build architectures and types are built. If, in addition,
1040 echo one or more build architectures or types is specified, then only those build architectures
1041 echo and types are built.
1045 echo -- builds all architectures, and all build types per architecture
1046 echo build -all -x86
1047 echo -- builds all build types for x86
1048 echo build -all -x64 -x86 -Checked -Release
1049 echo -- builds x64 and x86 architectures, Checked and Release build types for each
1053 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
1054 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
1055 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
1056 of the previous version to "%VSINSTALLDIR%" and then build.
1057 REM DIA SDK not included in Express editions
1058 echo Visual Studio Express does not include the DIA SDK. ^
1059 You need Visual Studio 2015 or 2017 (Community is free).
1060 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites