1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
6 set __VSToolsRoot=%VS140COMNTOOLS%
7 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
8 :: __BuildArch -- default: x64
9 :: __BuildType -- default: Debug
10 :: __BuildOS -- default: Windows_NT
11 :: __ProjectDir -- default: directory of the dir.props file
12 :: __SourceDir -- default: %__ProjectDir%\src\
13 :: __PackagesDir -- default: %__ProjectDir%\packages\
14 :: __RootBinDir -- default: %__ProjectDir%\bin\
15 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
17 :: __PackagesBinDir -- default: %__BinDir%\.nuget
18 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
20 :: Thus, these variables are not simply internal to this script!
22 :: Set the default arguments for build
25 set __BuildOS=Windows_NT
27 :: Default to highest Visual Studio version available
28 set __VSVersion=vs2015
30 :: Define a prefix for most output progress messages that come from this script. That makes
31 :: it easier to see where these are coming from. Note that there is a trailing space here.
32 set "__MsgPrefix=BUILD: "
34 :: Set the various build properties here so that CMake and MSBuild can pick them up
35 set "__ProjectDir=%~dp0"
36 :: remove trailing slash
37 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
38 set "__ProjectFilesDir=%__ProjectDir%"
39 set "__SourceDir=%__ProjectDir%\src"
40 set "__PackagesDir=%__ProjectDir%\packages"
41 set "__RootBinDir=%__ProjectDir%\bin"
42 set "__LogsDir=%__RootBinDir%\Logs"
49 set __BuildArchArm64=0
51 set __BuildTypeDebug=0
52 set __BuildTypeChecked=0
53 set __BuildTypeRelease=0
54 set __BuildJit32="-DBUILD_JIT32=0"
55 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
59 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
61 set __PassThroughArgs=
63 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
66 set __UnprocessedBuildArgs=
73 set __BuildNativeCoreLib=1
76 if "%1" == "" goto ArgsDone
78 if /i "%1" == "-?" goto Usage
79 if /i "%1" == "-h" goto Usage
80 if /i "%1" == "-help" goto Usage
82 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
83 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
84 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
85 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
86 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
88 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
89 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
90 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
92 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
93 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
94 set __PassThroughArgs=%__PassThroughArgs% %1
96 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)
97 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)
98 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)
99 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)
100 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)
101 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)
102 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)
103 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
104 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
105 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
106 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
107 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
108 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)
109 if /i "%1" == "buildjit32" (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
111 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
112 if /i "%1" == "compatjitcrossgen" (set __CompatJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if /i "%1" == "legacyjitcrossgen" (set __LegacyJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "buildstandalonegc" (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
117 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
119 if [!processedArgs!]==[] (
120 call set __UnprocessedBuildArgs=!__args!
122 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
127 if defined __BuildAll goto BuildAll
129 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
130 if %__TotalSpecifiedBuildArch% GTR 1 (
131 echo Error: more than one build architecture specified, but "all" not specified.
135 if %__BuildArchX64%==1 set __BuildArch=x64
136 if %__BuildArchX86%==1 set __BuildArch=x86
137 if %__BuildArchArm%==1 (
141 if %__BuildArchArm64%==1 (
142 set __BuildArch=arm64
146 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
147 if %__TotalSpecifiedBuildType% GTR 1 (
148 echo Error: more than one build type specified, but "all" not specified.
152 if %__BuildTypeDebug%==1 set __BuildType=Debug
153 if %__BuildTypeChecked%==1 set __BuildType=Checked
154 if %__BuildTypeRelease%==1 set __BuildType=Release
156 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
158 :: Set the remaining variables based upon the determined build configuration
159 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
160 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
161 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
162 set "__PackagesBinDir=%__BinDir%\.nuget"
163 set "__TestRootDir=%__RootBinDir%\tests"
164 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
165 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
166 set "__CrossComponentBinDir=%__BinDir%"
167 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
169 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
170 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
171 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
173 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
174 set "__CMakeBinDir=%__BinDir%"
175 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
177 if not exist "%__BinDir%" md "%__BinDir%"
178 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
179 if not exist "%__LogsDir%" md "%__LogsDir%"
181 REM It is convinient to have your Nuget search path include the location where the build
182 REM will plass packages. However nuget used during the build will fail if that directory
183 REM does not exist. Avoid this in at least one case by agressively creating the directory.
184 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
186 echo %__MsgPrefix%Commencing CoreCLR Repo build
188 :: Set the remaining variables based upon the determined build configuration
190 echo %__MsgPrefix%Checking prerequisites
191 :: Eval the output from probe-win1.ps1
192 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
194 REM =========================================================================================
196 REM === Start the build steps
198 REM =========================================================================================
200 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
201 call "%__VSToolsRoot%\VsDevCmd.bat"
203 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
205 REM =========================================================================================
207 REM === Build the CLR VM
209 REM =========================================================================================
211 if %__BuildNative% EQU 1 (
212 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
214 set nativePlatfromArgs=-platform=%__BuildArch%
215 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
217 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
218 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
219 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
221 if /i "%__BuildArch%" == "arm64" (
222 rem arm64 builds currently use private toolset which has not been released yet
223 REM TODO, remove once the toolset is open.
228 :: Set the environment for the native build
229 set __VCBuildArch=x86_amd64
230 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
231 if /i "%__BuildArch%" == "arm" (
232 set __VCBuildArch=x86_arm
234 REM Make CMake pick the highest installed version in the 10.0.* range
235 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
238 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
239 call "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
240 @if defined _echo @echo on
242 if not defined VSINSTALLDIR (
243 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
246 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
249 if defined __SkipConfigure goto SkipConfigure
251 echo %__MsgPrefix%Regenerating the Visual Studio solution
253 pushd "%__IntermediatesDir%"
254 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%"
255 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32% %__BuildStandaloneGC% !__ExtraCmakeArgs!
256 @if defined _echo @echo on
259 if defined __ConfigureOnly goto SkipNativeBuild
261 if not exist "%__IntermediatesDir%\install.vcxproj" (
262 echo %__MsgPrefix%Error: failed to generate native component build project!
266 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
268 if not !errorlevel! == 0 (
269 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
270 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
271 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
272 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
278 REM =========================================================================================
280 REM === Build Cross-Architecture Native Components (if applicable)
282 REM =========================================================================================
284 if /i "%__BuildArch%"=="arm64" (
285 set __DoCrossArchBuild=1
288 if /i "%__BuildArch%"=="arm" (
289 set __DoCrossArchBuild=1
292 if /i "%__DoCrossArchBuild%"=="1" (
294 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
296 :: Set the environment for the native build
297 set __VCBuildArch=x86_amd64
298 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
299 @call "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
300 @if defined _echo @echo on
302 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
303 if defined __SkipConfigure goto SkipConfigureCrossBuild
305 pushd "%__CrossCompIntermediatesDir%"
306 set __CMakeBinDir=%__CrossComponentBinDir%
307 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
308 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%"
309 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
310 @if defined _echo @echo on
312 :SkipConfigureCrossBuild
313 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
314 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
318 if defined __ConfigureOnly goto SkipCrossCompBuild
320 echo %__MsgPrefix%Invoking msbuild
322 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
323 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
324 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
325 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
326 if not !errorlevel! == 0 (
327 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
328 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
329 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
330 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
337 REM =========================================================================================
339 REM === CoreLib and NuGet package build section.
341 REM =========================================================================================
343 if %__BuildCoreLib% EQU 1 (
345 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
346 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
349 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
350 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
351 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
353 if /i "%__BuildArch%" == "arm64" (
354 set __nugetBuildArgs=-buildNugetPackage=false
355 ) else if "%__SkipNugetPackage%" == "1" (
356 set __nugetBuildArgs=-buildNugetPackage=false
358 set __nugetBuildArgs=-buildNugetPackage=true
361 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% %__UnprocessedBuildArgs%
362 if not !errorlevel! == 0 (
363 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
364 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
365 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
366 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
371 REM Need diasymreader.dll on your path for /CreatePdb
372 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
374 if %__BuildNativeCoreLib% EQU 1 (
375 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
377 if "%__CompatJitCrossgen%"=="1" (
378 set COMPlus_UseWindowsX86CoreLegacyJit=1
381 if "%__LegacyJitCrossgen%"=="1" (
383 set COMPlus_AltJitNgen=*
384 set COMPlus_AltJitName=legacyjit.dll
387 echo "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll"
388 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
389 if NOT !errorlevel! == 0 (
390 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
391 echo %__CrossGenCoreLibLog%
394 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.ni.dll" >> "%__CrossGenCoreLibLog%" 2>&1
395 if NOT !errorlevel! == 0 (
396 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
397 echo %__CrossGenCoreLibLog%
401 echo %__MsgPrefix%Generating native image of MScorlib facade for %__BuildOS%.%__BuildArch%.%__BuildType%
403 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenMSCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
404 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
406 "!__CrossgenExe!" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\mscorlib.ni.dll" "%__BinDir%\mscorlib.dll" > "!__CrossGenCoreLibLog!" 2>&1
409 if "%__CompatJitCrossgen%"=="1" (
410 set COMPlus_UseWindowsX86CoreLegacyJit=
413 if "%__LegacyJitCrossgen%"=="1" (
415 set COMPlus_AltJitNgen=
416 set COMPlus_AltJitName=
420 echo %__MsgPrefix%Error: CrossGen mscorlib facade build failed. Refer to the build log file for details:
421 echo !__CrossGenCoreLibLog!
426 if %__BuildPackages% EQU 1 (
427 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
429 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
430 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
431 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
433 REM The conditions as to what to build are captured in the builds file.
434 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
436 if not !errorlevel! == 0 (
437 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
438 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
439 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
440 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
445 REM =========================================================================================
447 REM === Test build section
449 REM =========================================================================================
451 if %__BuildTests% EQU 1 (
452 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
454 REM Construct the arguments to pass to the test build script.
456 rem arm64 builds currently use private toolset which has not been released yet
457 REM TODO, remove once the toolset is open.
458 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
460 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
461 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
463 if not !errorlevel! == 0 (
464 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
469 REM =========================================================================================
471 REM === All builds complete!
473 REM =========================================================================================
475 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
476 echo %__MsgPrefix%Product binaries are available at !__BinDir!
477 if %__BuildTests% EQU 1 (
478 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
482 REM =========================================================================================
484 REM === Handle the "all" case.
486 REM =========================================================================================
492 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
493 if %__TotalSpecifiedBuildArch% EQU 0 (
494 REM Nothing specified means we want to build all architectures.
495 set __BuildArchList=x64 x86 arm arm64
498 REM Otherwise, add all the specified architectures to the list.
500 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
501 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
502 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
503 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
507 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
508 if %__TotalSpecifiedBuildType% EQU 0 (
509 REM Nothing specified means we want to build all build types.
510 set __BuildTypeList=Debug Checked Release
513 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
514 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
515 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
517 REM Create a temporary file to collect build results. We always build all flavors specified, and
518 REM report a summary of the results at the end.
520 set __AllBuildSuccess=true
521 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
522 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
524 for %%i in (%__BuildArchList%) do (
525 for %%j in (%__BuildTypeList%) do (
526 call :BuildOne %%i %%j
530 if %__AllBuildSuccess%==true (
531 echo %__MsgPrefix%All builds succeeded!
534 echo %__MsgPrefix%Builds failed:
535 type %__BuildResultFile%
536 del /f /q %__BuildResultFile%
540 REM This code is unreachable, but leaving it nonetheless, just in case things change.
546 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
547 echo %__MsgPrefix%Invoking: %__NextCmd%
549 if not !errorlevel! == 0 (
550 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
551 set __AllBuildSuccess=false
555 REM =========================================================================================
557 REM === Helper routines
559 REM =========================================================================================
563 echo Build the CoreCLR repo.
566 echo build.cmd [option1] [option2]
568 echo build.cmd all [option1] [option2] -- ...
570 echo All arguments are optional. The options are:
572 echo.-? -h -help: view this message.
573 echo all: Builds all configurations and platforms.
574 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
575 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
576 echo -- ... : all arguments following this tag will be passed directly to msbuild.
577 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
578 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
579 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
581 echo add nativemscorlib to go further and build the native image for designated mscorlib.
582 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
583 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
584 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
585 echo skipconfigure: skip CMake ^(default: CMake is run^)
586 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
587 echo skipnative: skip building native components ^(default: native components are built^).
588 echo skiptests: skip building tests ^(default: tests are built^).
589 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
590 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
591 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
592 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
593 echo -sequential: force a non-parallel build ^(default is to build in parallel
594 echo using all processors^).
595 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
596 echo -Rebuild: passes /t:rebuild to the build projects.
598 echo If "all" is specified, then all build architectures and types are built. If, in addition,
599 echo one or more build architectures or types is specified, then only those build architectures
600 echo and types are built.
604 echo -- builds all architectures, and all build types per architecture
606 echo -- builds all build types for x86
607 echo build all x64 x86 Checked Release
608 echo -- builds x64 and x86 architectures, Checked and Release build types for each
612 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
613 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
614 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
615 of the previous version to "%VSINSTALLDIR%" and then build.
616 :: DIA SDK not included in Express editions
617 echo Visual Studio Express does not include the DIA SDK. ^
618 You need Visual Studio 2015+ (Community is free).
619 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
624 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
626 if /i "%__ToolsetDir%" == "" (
627 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
631 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
632 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
634 %__ToolsetDir%\VC_sdk\inc;^
635 %__ToolsetDir%\sdpublic\sdk\inc;^
636 %__ToolsetDir%\sdpublic\shared\inc;^
637 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
638 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
639 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
640 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
641 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
642 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
643 %__ToolsetDir%\diasdk\include