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"
58 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
60 set __PassThroughArgs=
62 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
65 set __UnprocessedBuildArgs=
72 set __BuildNativeCoreLib=1
75 if "%1" == "" goto ArgsDone
77 if /i "%1" == "-?" goto Usage
78 if /i "%1" == "-h" goto Usage
79 if /i "%1" == "-help" goto Usage
81 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
82 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
83 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
84 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
85 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
87 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
88 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
89 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
91 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
92 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
93 set __PassThroughArgs=%__PassThroughArgs% %1
95 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)
96 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)
97 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)
98 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)
99 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)
100 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)
101 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)
102 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
103 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
104 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
105 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
106 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
107 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)
108 if /i "%1" == "buildjit32" (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
109 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
111 if /i "%1" == "altjitcrossgen" (set __AltJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if [!processedArgs!]==[] (
114 call set __UnprocessedBuildArgs=!__args!
116 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
121 if defined __BuildAll goto BuildAll
123 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
124 if %__TotalSpecifiedBuildArch% GTR 1 (
125 echo Error: more than one build architecture specified, but "all" not specified.
129 if %__BuildArchX64%==1 set __BuildArch=x64
130 if %__BuildArchX86%==1 set __BuildArch=x86
131 if %__BuildArchArm%==1 (
135 if %__BuildArchArm64%==1 (
136 set __BuildArch=arm64
140 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
141 if %__TotalSpecifiedBuildType% GTR 1 (
142 echo Error: more than one build type specified, but "all" not specified.
146 if %__BuildTypeDebug%==1 set __BuildType=Debug
147 if %__BuildTypeChecked%==1 set __BuildType=Checked
148 if %__BuildTypeRelease%==1 set __BuildType=Release
150 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
152 :: Set the remaining variables based upon the determined build configuration
153 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
154 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
155 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
156 set "__PackagesBinDir=%__BinDir%\.nuget"
157 set "__TestRootDir=%__RootBinDir%\tests"
158 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
159 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
160 set "__CrossComponentBinDir=%__BinDir%"
161 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
163 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
164 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
165 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
167 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
168 set "__CMakeBinDir=%__BinDir%"
169 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
171 if not exist "%__BinDir%" md "%__BinDir%"
172 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
173 if not exist "%__LogsDir%" md "%__LogsDir%"
175 REM It is convinient to have your Nuget search path include the location where the build
176 REM will plass packages. However nuget used during the build will fail if that directory
177 REM does not exist. Avoid this in at least one case by agressively creating the directory.
178 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
180 echo %__MsgPrefix%Commencing CoreCLR Repo build
182 :: Set the remaining variables based upon the determined build configuration
184 echo %__MsgPrefix%Checking prerequisites
185 :: Eval the output from probe-win1.ps1
186 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy RemoteSigned "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
188 REM =========================================================================================
190 REM === Start the build steps
192 REM =========================================================================================
194 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
195 call "%__VSToolsRoot%\VsDevCmd.bat"
197 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
199 REM =========================================================================================
201 REM === Build the CLR VM
203 REM =========================================================================================
205 if %__BuildNative% EQU 1 (
206 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
208 set nativePlatfromArgs=-platform=%__BuildArch%
209 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
211 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
212 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
213 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
215 if /i "%__BuildArch%" == "arm64" (
216 rem arm64 builds currently use private toolset which has not been released yet
217 REM TODO, remove once the toolset is open.
222 :: Set the environment for the native build
223 set __VCBuildArch=x86_amd64
224 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
225 if /i "%__BuildArch%" == "arm" (
226 set __VCBuildArch=x86_arm
228 REM Make CMake pick the highest installed version in the 10.0.* range
229 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
232 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
233 call "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
234 @if defined _echo @echo on
236 if not defined VSINSTALLDIR (
237 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
240 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
243 if defined __SkipConfigure goto SkipConfigure
245 echo %__MsgPrefix%Regenerating the Visual Studio solution
247 pushd "%__IntermediatesDir%"
248 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%"
249 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32% !__ExtraCmakeArgs!
250 @if defined _echo @echo on
253 if defined __ConfigureOnly goto SkipNativeBuild
255 if not exist "%__IntermediatesDir%\install.vcxproj" (
256 echo %__MsgPrefix%Error: failed to generate native component build project!
260 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
262 if not !errorlevel! == 0 (
263 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
264 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
265 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
266 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
272 REM =========================================================================================
274 REM === Build Cross-Architecture Native Components (if applicable)
276 REM =========================================================================================
278 if /i "%__BuildArch%"=="arm64" (
279 set __DoCrossArchBuild=1
282 if /i "%__BuildArch%"=="arm" (
283 set __DoCrossArchBuild=1
286 if /i "%__DoCrossArchBuild%"=="1" (
288 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
290 :: Set the environment for the native build
291 set __VCBuildArch=x86_amd64
292 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
293 @call "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
294 @if defined _echo @echo on
296 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
297 if defined __SkipConfigure goto SkipConfigureCrossBuild
299 pushd "%__CrossCompIntermediatesDir%"
300 set __CMakeBinDir=%__CrossComponentBinDir%
301 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
302 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%"
303 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
304 @if defined _echo @echo on
306 :SkipConfigureCrossBuild
307 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
308 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
312 if defined __ConfigureOnly goto SkipCrossCompBuild
314 echo %__MsgPrefix%Invoking msbuild
316 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
317 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
318 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
319 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
320 if not !errorlevel! == 0 (
321 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
322 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
323 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
324 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
331 REM =========================================================================================
333 REM === CoreLib and NuGet package build section.
335 REM =========================================================================================
337 if %__BuildCoreLib% EQU 1 (
339 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
340 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
343 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
344 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
345 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
347 if /i "%__BuildArch%" == "arm64" (
348 set __nugetBuildArgs=-buildNugetPackage=false
349 ) else if "%__SkipNugetPackage%" == "1" (
350 set __nugetBuildArgs=-buildNugetPackage=false
352 set __nugetBuildArgs=-buildNugetPackage=true
355 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% %__UnprocessedBuildArgs%
356 if not !errorlevel! == 0 (
357 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
358 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
359 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
360 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
365 REM Need diasymreader.dll on your path for /CreatePdb
366 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
368 if %__BuildNativeCoreLib% EQU 1 (
369 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
371 echo "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll"
372 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
373 if NOT !errorlevel! == 0 (
374 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
375 echo %__CrossGenCoreLibLog%
378 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.ni.dll" >> "%__CrossGenCoreLibLog%" 2>&1
379 if NOT !errorlevel! == 0 (
380 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
381 echo %__CrossGenCoreLibLog%
385 echo %__MsgPrefix%Generating native image of MScorlib facade for %__BuildOS%.%__BuildArch%.%__BuildType%
387 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenMSCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
388 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
390 if "%__AltJitCrossgen%"=="1" (
391 set COMPlus_AltJitNgen=*
392 set COMPlus_AltJitName=protojit.dll
395 "!__CrossgenExe!" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\mscorlib.ni.dll" "%__BinDir%\mscorlib.dll" > "!__CrossGenCoreLibLog!" 2>&1
398 if "%__AltJitCrossgen%"=="1" (
399 set COMPlus_AltJitNgen=
400 set COMPlus_AltJitName=
404 echo %__MsgPrefix%Error: CrossGen mscorlib facade build failed. Refer to the build log file for details:
405 echo !__CrossGenCoreLibLog!
410 if %__BuildPackages% EQU 1 (
411 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
413 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
414 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
415 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
417 REM The conditions as to what to build are captured in the builds file.
418 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
420 if not !errorlevel! == 0 (
421 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
422 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
423 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
424 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
429 REM =========================================================================================
431 REM === Test build section
433 REM =========================================================================================
435 if %__BuildTests% EQU 1 (
436 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
438 REM Construct the arguments to pass to the test build script.
440 rem arm64 builds currently use private toolset which has not been released yet
441 REM TODO, remove once the toolset is open.
442 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
444 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
445 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
447 if not !errorlevel! == 0 (
448 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
453 REM =========================================================================================
455 REM === All builds complete!
457 REM =========================================================================================
459 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
460 echo %__MsgPrefix%Product binaries are available at !__BinDir!
461 if %__BuildTests% EQU 1 (
462 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
466 REM =========================================================================================
468 REM === Handle the "all" case.
470 REM =========================================================================================
476 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
477 if %__TotalSpecifiedBuildArch% EQU 0 (
478 REM Nothing specified means we want to build all architectures.
479 set __BuildArchList=x64 x86 arm arm64
482 REM Otherwise, add all the specified architectures to the list.
484 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
485 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
486 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
487 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
491 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
492 if %__TotalSpecifiedBuildType% EQU 0 (
493 REM Nothing specified means we want to build all build types.
494 set __BuildTypeList=Debug Checked Release
497 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
498 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
499 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
501 REM Create a temporary file to collect build results. We always build all flavors specified, and
502 REM report a summary of the results at the end.
504 set __AllBuildSuccess=true
505 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
506 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
508 for %%i in (%__BuildArchList%) do (
509 for %%j in (%__BuildTypeList%) do (
510 call :BuildOne %%i %%j
514 if %__AllBuildSuccess%==true (
515 echo %__MsgPrefix%All builds succeeded!
518 echo %__MsgPrefix%Builds failed:
519 type %__BuildResultFile%
520 del /f /q %__BuildResultFile%
524 REM This code is unreachable, but leaving it nonetheless, just in case things change.
530 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
531 echo %__MsgPrefix%Invoking: %__NextCmd%
533 if not !errorlevel! == 0 (
534 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
535 set __AllBuildSuccess=false
539 REM =========================================================================================
541 REM === Helper routines
543 REM =========================================================================================
547 echo Build the CoreCLR repo.
550 echo build.cmd [option1] [option2]
552 echo build.cmd all [option1] [option2] -- ...
554 echo All arguments are optional. The options are:
556 echo.-? -h -help: view this message.
557 echo all: Builds all configurations and platforms.
558 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
559 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
560 echo -- ... : all arguments following this tag will be passed directly to msbuild.
561 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
562 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
563 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
565 echo add nativemscorlib to go further and build the native image for designated mscorlib.
566 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
567 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
568 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
569 echo skipconfigure: skip CMake ^(default: CMake is run^)
570 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
571 echo skipnative: skip building native components ^(default: native components are built^).
572 echo skiptests: skip building tests ^(default: tests are built^).
573 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
574 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
575 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
576 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
577 echo -sequential: force a non-parallel build ^(default is to build in parallel
578 echo using all processors^).
579 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
580 echo -Rebuild: passes /t:rebuild to the build projects.
582 echo If "all" is specified, then all build architectures and types are built. If, in addition,
583 echo one or more build architectures or types is specified, then only those build architectures
584 echo and types are built.
588 echo -- builds all architectures, and all build types per architecture
590 echo -- builds all build types for x86
591 echo build all x64 x86 Checked Release
592 echo -- builds x64 and x86 architectures, Checked and Release build types for each
596 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
597 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
598 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
599 of the previous version to "%VSINSTALLDIR%" and then build.
600 :: DIA SDK not included in Express editions
601 echo Visual Studio Express does not include the DIA SDK. ^
602 You need Visual Studio 2015+ (Community is free).
603 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
608 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
610 if /i "%__ToolsetDir%" == "" (
611 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
615 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
616 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
618 %__ToolsetDir%\VC_sdk\inc;^
619 %__ToolsetDir%\sdpublic\sdk\inc;^
620 %__ToolsetDir%\sdpublic\shared\inc;^
621 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
622 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
623 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
624 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
625 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
626 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
627 %__ToolsetDir%\diasdk\include