1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
7 :: Default to highest Visual Studio version available
8 if defined VS150COMNTOOLS (
9 set "__VSToolsRoot=%VS150COMNTOOLS%"
10 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
11 set __VSVersion=vs2017
13 set "__VSToolsRoot=%VS140COMNTOOLS%"
14 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
15 set __VSVersion=vs2015
18 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
19 :: __BuildArch -- default: x64
20 :: __BuildType -- default: Debug
21 :: __BuildOS -- default: Windows_NT
22 :: __ProjectDir -- default: directory of the dir.props file
23 :: __SourceDir -- default: %__ProjectDir%\src\
24 :: __PackagesDir -- default: %__ProjectDir%\packages\
25 :: __RootBinDir -- default: %__ProjectDir%\bin\
26 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
28 :: __PackagesBinDir -- default: %__BinDir%\.nuget
29 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
31 :: Thus, these variables are not simply internal to this script!
33 :: Set the default arguments for build
36 set __BuildOS=Windows_NT
38 :: Define a prefix for most output progress messages that come from this script. That makes
39 :: it easier to see where these are coming from. Note that there is a trailing space here.
40 set "__MsgPrefix=BUILD: "
42 :: Set the various build properties here so that CMake and MSBuild can pick them up
43 set "__ProjectDir=%~dp0"
44 :: remove trailing slash
45 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
46 set "__ProjectFilesDir=%__ProjectDir%"
47 set "__SourceDir=%__ProjectDir%\src"
48 set "__PackagesDir=%__ProjectDir%\packages"
49 set "__RootBinDir=%__ProjectDir%\bin"
50 set "__LogsDir=%__RootBinDir%\Logs"
57 set __BuildArchArm64=0
59 set __BuildTypeDebug=0
60 set __BuildTypeChecked=0
61 set __BuildTypeRelease=0
62 set __BuildJit32="-DBUILD_JIT32=0"
63 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
67 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
69 set __PassThroughArgs=
71 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
74 set __UnprocessedBuildArgs=
81 set __BuildNativeCoreLib=1
84 if "%1" == "" goto ArgsDone
86 if /i "%1" == "-?" goto Usage
87 if /i "%1" == "-h" goto Usage
88 if /i "%1" == "-help" goto Usage
90 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
91 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
92 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
93 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
94 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
96 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
97 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
98 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
100 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
101 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
102 set __PassThroughArgs=%__PassThroughArgs% %1
104 if /i "%1" == "freebsdmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
105 if /i "%1" == "linuxmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
106 if /i "%1" == "netbsdmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
107 if /i "%1" == "osxmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
108 if /i "%1" == "windowsmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
109 if /i "%1" == "nativemscorlib" (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 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)
111 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
112 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116 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)
117 if /i "%1" == "buildjit32" (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
118 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
119 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
120 if /i "%1" == "compatjitcrossgen" (set __CompatJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
121 if /i "%1" == "legacyjitcrossgen" (set __LegacyJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
122 if /i "%1" == "buildstandalonegc" (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
124 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
125 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if [!processedArgs!]==[] (
128 call set __UnprocessedBuildArgs=!__args!
130 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
135 if defined __BuildAll goto BuildAll
137 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
138 if %__TotalSpecifiedBuildArch% GTR 1 (
139 echo Error: more than one build architecture specified, but "all" not specified.
143 if %__BuildArchX64%==1 set __BuildArch=x64
144 if %__BuildArchX86%==1 set __BuildArch=x86
145 if %__BuildArchArm%==1 (
149 if %__BuildArchArm64%==1 (
150 set __BuildArch=arm64
154 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
155 if %__TotalSpecifiedBuildType% GTR 1 (
156 echo Error: more than one build type specified, but "all" not specified.
160 if %__BuildTypeDebug%==1 set __BuildType=Debug
161 if %__BuildTypeChecked%==1 set __BuildType=Checked
162 if %__BuildTypeRelease%==1 set __BuildType=Release
164 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
166 :: Set the remaining variables based upon the determined build configuration
167 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
168 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
169 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
170 set "__PackagesBinDir=%__BinDir%\.nuget"
171 set "__TestRootDir=%__RootBinDir%\tests"
172 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
173 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
174 set "__CrossComponentBinDir=%__BinDir%"
175 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
177 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
178 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
179 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
181 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
182 set "__CMakeBinDir=%__BinDir%"
183 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
185 if not exist "%__BinDir%" md "%__BinDir%"
186 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
187 if not exist "%__LogsDir%" md "%__LogsDir%"
189 REM It is convinient to have your Nuget search path include the location where the build
190 REM will plass packages. However nuget used during the build will fail if that directory
191 REM does not exist. Avoid this in at least one case by agressively creating the directory.
192 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
194 echo %__MsgPrefix%Commencing CoreCLR Repo build
196 :: Set the remaining variables based upon the determined build configuration
198 echo %__MsgPrefix%Checking prerequisites
199 :: Eval the output from probe-win1.ps1
200 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
202 REM =========================================================================================
204 REM === Start the build steps
206 REM =========================================================================================
208 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
209 call "%__VSToolsRoot%\VsDevCmd.bat"
211 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
213 REM =========================================================================================
215 REM === Build the CLR VM
217 REM =========================================================================================
219 if %__BuildNative% EQU 1 (
220 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
222 set nativePlatfromArgs=-platform=%__BuildArch%
223 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
225 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
226 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
227 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
229 if /i "%__BuildArch%" == "arm64" (
230 rem arm64 builds currently use private toolset which has not been released yet
231 REM TODO, remove once the toolset is open.
236 :: Set the environment for the native build
237 set __VCBuildArch=x86_amd64
238 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
239 if /i "%__BuildArch%" == "arm" (
240 set __VCBuildArch=x86_arm
242 REM Make CMake pick the highest installed version in the 10.0.* range
243 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
246 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
247 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
248 @if defined _echo @echo on
250 if not defined VSINSTALLDIR (
251 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
254 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
257 if defined __SkipConfigure goto SkipConfigure
259 echo %__MsgPrefix%Regenerating the Visual Studio solution
261 pushd "%__IntermediatesDir%"
262 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%"
263 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32% %__BuildStandaloneGC% !__ExtraCmakeArgs!
264 @if defined _echo @echo on
267 if defined __ConfigureOnly goto SkipNativeBuild
269 if not exist "%__IntermediatesDir%\install.vcxproj" (
270 echo %__MsgPrefix%Error: failed to generate native component build project!
274 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
276 if not !errorlevel! == 0 (
277 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
278 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
279 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
280 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
286 REM =========================================================================================
288 REM === Build Cross-Architecture Native Components (if applicable)
290 REM =========================================================================================
292 if /i "%__BuildArch%"=="arm64" (
293 set __DoCrossArchBuild=1
296 if /i "%__BuildArch%"=="arm" (
297 set __DoCrossArchBuild=1
300 if /i "%__DoCrossArchBuild%"=="1" (
302 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
304 :: Set the environment for the native build
305 set __VCBuildArch=x86_amd64
306 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
307 @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
308 @if defined _echo @echo on
310 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
311 if defined __SkipConfigure goto SkipConfigureCrossBuild
313 pushd "%__CrossCompIntermediatesDir%"
314 set __CMakeBinDir=%__CrossComponentBinDir%
315 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
316 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%"
317 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
318 @if defined _echo @echo on
320 :SkipConfigureCrossBuild
321 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
322 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
326 if defined __ConfigureOnly goto SkipCrossCompBuild
328 echo %__MsgPrefix%Invoking msbuild
330 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
331 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
332 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
333 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
334 if not !errorlevel! == 0 (
335 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
336 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
337 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
338 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
345 REM =========================================================================================
347 REM === CoreLib and NuGet package build section.
349 REM =========================================================================================
351 if %__BuildCoreLib% EQU 1 (
353 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
354 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
357 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
358 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
359 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
361 if /i "%__BuildArch%" == "arm64" (
362 set __nugetBuildArgs=-buildNugetPackage=false
363 ) else if "%__SkipNugetPackage%" == "1" (
364 set __nugetBuildArgs=-buildNugetPackage=false
366 set __nugetBuildArgs=-buildNugetPackage=true
369 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% %__UnprocessedBuildArgs%
370 if not !errorlevel! == 0 (
371 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
372 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
373 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
374 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
379 REM Need diasymreader.dll on your path for /CreatePdb
380 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
382 if %__BuildNativeCoreLib% EQU 1 (
383 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
385 if "%__CompatJitCrossgen%"=="1" (
386 set COMPlus_UseWindowsX86CoreLegacyJit=1
389 if "%__LegacyJitCrossgen%"=="1" (
391 set COMPlus_AltJitNgen=*
392 set COMPlus_AltJitName=legacyjit.dll
395 echo "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll"
396 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
397 if NOT !errorlevel! == 0 (
398 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
399 :: Put it in the same log, helpful for Jenkins
400 type %__CrossGenCoreLibLog%
403 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.ni.dll" >> "%__CrossGenCoreLibLog%" 2>&1
404 if NOT !errorlevel! == 0 (
405 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
406 :: Put it in the same log, helpful for Jenkins
407 type %__CrossGenCoreLibLog%
411 echo %__MsgPrefix%Generating native image of MScorlib facade for %__BuildOS%.%__BuildArch%.%__BuildType%
413 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenMSCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
414 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
416 "!__CrossgenExe!" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\mscorlib.ni.dll" "%__BinDir%\mscorlib.dll" > "!__CrossGenCoreLibLog!" 2>&1
419 if "%__CompatJitCrossgen%"=="1" (
420 set COMPlus_UseWindowsX86CoreLegacyJit=
423 if "%__LegacyJitCrossgen%"=="1" (
425 set COMPlus_AltJitNgen=
426 set COMPlus_AltJitName=
430 echo %__MsgPrefix%Error: CrossGen mscorlib facade build failed. Refer to !__CrossGenCoreLibLog!
431 :: Put it in the same log, helpful for Jenkins
432 type %__CrossGenCoreLibLog%
437 if %__BuildPackages% EQU 1 (
438 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
440 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
441 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
442 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
444 REM The conditions as to what to build are captured in the builds file.
445 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
447 if not !errorlevel! == 0 (
448 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
449 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
450 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
451 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
456 REM =========================================================================================
458 REM === Test build section
460 REM =========================================================================================
462 if %__BuildTests% EQU 1 (
463 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
465 REM Construct the arguments to pass to the test build script.
467 rem arm64 builds currently use private toolset which has not been released yet
468 REM TODO, remove once the toolset is open.
469 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
471 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
472 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
474 if not !errorlevel! == 0 (
475 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
480 REM =========================================================================================
482 REM === All builds complete!
484 REM =========================================================================================
486 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
487 echo %__MsgPrefix%Product binaries are available at !__BinDir!
488 if %__BuildTests% EQU 1 (
489 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
493 REM =========================================================================================
495 REM === Handle the "all" case.
497 REM =========================================================================================
503 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
504 if %__TotalSpecifiedBuildArch% EQU 0 (
505 REM Nothing specified means we want to build all architectures.
506 set __BuildArchList=x64 x86 arm arm64
509 REM Otherwise, add all the specified architectures to the list.
511 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
512 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
513 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
514 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
518 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
519 if %__TotalSpecifiedBuildType% EQU 0 (
520 REM Nothing specified means we want to build all build types.
521 set __BuildTypeList=Debug Checked Release
524 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
525 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
526 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
528 REM Create a temporary file to collect build results. We always build all flavors specified, and
529 REM report a summary of the results at the end.
531 set __AllBuildSuccess=true
532 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
533 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
535 for %%i in (%__BuildArchList%) do (
536 for %%j in (%__BuildTypeList%) do (
537 call :BuildOne %%i %%j
541 if %__AllBuildSuccess%==true (
542 echo %__MsgPrefix%All builds succeeded!
545 echo %__MsgPrefix%Builds failed:
546 type %__BuildResultFile%
547 del /f /q %__BuildResultFile%
551 REM This code is unreachable, but leaving it nonetheless, just in case things change.
557 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
558 echo %__MsgPrefix%Invoking: %__NextCmd%
560 if not !errorlevel! == 0 (
561 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
562 set __AllBuildSuccess=false
566 REM =========================================================================================
568 REM === Helper routines
570 REM =========================================================================================
577 echo Build the CoreCLR repo.
580 echo build.cmd [option1] [option2]
582 echo build.cmd all [option1] [option2] -- ...
584 echo All arguments are optional. The options are:
586 echo.-? -h -help: view this message.
587 echo all: Builds all configurations and platforms.
588 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
589 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
590 echo -- ... : all arguments following this tag will be passed directly to msbuild.
591 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
592 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
593 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
595 echo add nativemscorlib to go further and build the native image for designated mscorlib.
596 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
597 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
598 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
599 echo skipconfigure: skip CMake ^(default: CMake is run^)
600 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
601 echo skipnative: skip building native components ^(default: native components are built^).
602 echo skiptests: skip building tests ^(default: tests are built^).
603 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
604 echo buildstandalonegc: builds the GC in a standalone mode.
605 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
606 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
607 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
608 echo -sequential: force a non-parallel build ^(default is to build in parallel
609 echo using all processors^).
610 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
611 echo -Rebuild: passes /t:rebuild to the build projects.
613 echo If "all" is specified, then all build architectures and types are built. If, in addition,
614 echo one or more build architectures or types is specified, then only those build architectures
615 echo and types are built.
619 echo -- builds all architectures, and all build types per architecture
621 echo -- builds all build types for x86
622 echo build all x64 x86 Checked Release
623 echo -- builds x64 and x86 architectures, Checked and Release build types for each
627 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
628 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
629 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
630 of the previous version to "%VSINSTALLDIR%" and then build.
631 :: DIA SDK not included in Express editions
632 echo Visual Studio Express does not include the DIA SDK. ^
633 You need Visual Studio 2015 or 2017 (Community is free).
634 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
639 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
641 if /i "%__ToolsetDir%" == "" (
642 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
646 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
647 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
649 %__ToolsetDir%\VC_sdk\inc;^
650 %__ToolsetDir%\sdpublic\sdk\inc;^
651 %__ToolsetDir%\sdpublic\shared\inc;^
652 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
653 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
654 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
655 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
656 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
657 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
658 %__ToolsetDir%\diasdk\include