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
9 :: For VS2015 (and prior), only a single instance is allowed to be installed on a box
10 :: and VS140COMNTOOLS is set as a global environment variable by the installer. This
11 :: allows users to locate where the instance of VS2015 is installed.
13 :: For VS2017, multiple instances can be installed on the same box SxS and VS150COMNTOOLS
14 :: is no longer set as a global environment variable and is instead only set if the user
15 :: has launched the VS2017 Developer Command Prompt.
17 :: Following this logic, we will default to the VS2017 toolset if VS150COMNTOOLS tools is
18 :: set, as this indicates the user is running from the VS2017 Developer Command Prompt and
19 :: is already configured to use that toolset. Otherwise, we will fallback to using the VS2015
20 :: toolset if it is installed. Finally, we will fail the script if no supported VS instance
22 if defined VS150COMNTOOLS (
23 set "__VSToolsRoot=%VS150COMNTOOLS%"
24 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
25 set __VSVersion=vs2017
27 set "__VSToolsRoot=%VS140COMNTOOLS%"
28 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
29 set __VSVersion=vs2015
32 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
33 :: __BuildArch -- default: x64
34 :: __BuildType -- default: Debug
35 :: __BuildOS -- default: Windows_NT
36 :: __ProjectDir -- default: directory of the dir.props file
37 :: __SourceDir -- default: %__ProjectDir%\src\
38 :: __PackagesDir -- default: %__ProjectDir%\packages\
39 :: __RootBinDir -- default: %__ProjectDir%\bin\
40 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
42 :: __PackagesBinDir -- default: %__BinDir%\.nuget
43 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
45 :: Thus, these variables are not simply internal to this script!
47 :: Set the default arguments for build
50 set __BuildOS=Windows_NT
52 :: Define a prefix for most output progress messages that come from this script. That makes
53 :: it easier to see where these are coming from. Note that there is a trailing space here.
54 set "__MsgPrefix=BUILD: "
56 :: Set the various build properties here so that CMake and MSBuild can pick them up
57 set "__ProjectDir=%~dp0"
58 :: remove trailing slash
59 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
60 set "__ProjectFilesDir=%__ProjectDir%"
61 set "__SourceDir=%__ProjectDir%\src"
62 set "__PackagesDir=%__ProjectDir%\packages"
63 set "__RootBinDir=%__ProjectDir%\bin"
64 set "__LogsDir=%__RootBinDir%\Logs"
65 set "__PgoOptDataVersion="
66 set "__IbcOptDataVersion="
73 set __BuildArchArm64=0
75 set __BuildTypeDebug=0
76 set __BuildTypeChecked=0
77 set __BuildTypeRelease=0
78 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
83 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
85 set __PassThroughArgs=
87 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
90 set __UnprocessedBuildArgs=
97 set __BuildNativeCoreLib=1
98 set __RestoreOptData=1
101 if "%1" == "" goto ArgsDone
103 if /i "%1" == "-?" goto Usage
104 if /i "%1" == "-h" goto Usage
105 if /i "%1" == "-help" goto Usage
107 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
108 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
109 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
111 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
117 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
118 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
119 if [!__PassThroughArgs!]==[] (
120 set __PassThroughArgs=%1
122 set __PassThroughArgs=%__PassThroughArgs% %1
125 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)
126 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)
127 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)
128 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)
129 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)
130 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)
131 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)
132 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 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)
139 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
142 if /i "%1" == "buildstandalonegc" (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
145 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if [!processedArgs!]==[] (
148 call set __UnprocessedBuildArgs=!__args!
150 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
155 if defined __BuildAll goto BuildAll
157 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
158 if %__TotalSpecifiedBuildArch% GTR 1 (
159 echo Error: more than one build architecture specified, but "all" not specified.
163 if %__BuildArchX64%==1 set __BuildArch=x64
164 if %__BuildArchX86%==1 set __BuildArch=x86
165 if %__BuildArchArm%==1 (
169 if %__BuildArchArm64%==1 (
170 set __BuildArch=arm64
174 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
175 if %__TotalSpecifiedBuildType% GTR 1 (
176 echo Error: more than one build type specified, but "all" not specified.
180 if %__BuildTypeDebug%==1 set __BuildType=Debug
181 if %__BuildTypeChecked%==1 set __BuildType=Checked
182 if %__BuildTypeRelease%==1 set __BuildType=Release
184 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
186 :: Set the remaining variables based upon the determined build configuration
187 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
188 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
189 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
190 set "__PackagesBinDir=%__BinDir%\.nuget"
191 set "__TestRootDir=%__RootBinDir%\tests"
192 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
193 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
194 set "__CrossComponentBinDir=%__BinDir%"
195 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
197 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
198 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
199 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
201 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
202 set "__CMakeBinDir=%__BinDir%"
203 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
205 if not exist "%__BinDir%" md "%__BinDir%"
206 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
207 if not exist "%__LogsDir%" md "%__LogsDir%"
209 REM It is convinient to have your Nuget search path include the location where the build
210 REM will plass packages. However nuget used during the build will fail if that directory
211 REM does not exist. Avoid this in at least one case by agressively creating the directory.
212 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
214 echo %__MsgPrefix%Commencing CoreCLR Repo build
216 :: Set the remaining variables based upon the determined build configuration
218 echo %__MsgPrefix%Checking prerequisites
219 :: Eval the output from probe-win1.ps1
220 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
222 REM =========================================================================================
224 REM === Start the build steps
226 REM =========================================================================================
228 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
229 call "%__VSToolsRoot%\VsDevCmd.bat"
231 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
233 REM =========================================================================================
235 REM === Restore optimization profile data
237 REM =========================================================================================
239 if %__RestoreOptData% EQU 1 (
240 echo %__MsgPrefix%Restoring the OptimizationData Package
241 @call %__ProjectDir%\run.cmd sync -optdata
242 if not !errorlevel! == 0 (
243 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
248 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
249 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
250 if not exist "%DotNetCli%" (
251 echo Assertion failed: dotnet.exe not found at path "%DotNetCli%"
254 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
255 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
256 set __PgoOptDataVersion=%%s
258 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
259 set __IbcOptDataVersion=%%s
262 REM =========================================================================================
264 REM === Build the CLR VM
266 REM =========================================================================================
268 if %__BuildNative% EQU 1 (
269 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
271 set nativePlatfromArgs=-platform=%__BuildArch%
272 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
274 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
275 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
276 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
278 if /i "%__BuildArch%" == "arm64" (
279 rem arm64 builds currently use private toolset which has not been released yet
280 REM TODO, remove once the toolset is open.
285 :: Set the environment for the native build
286 set __VCBuildArch=x86_amd64
287 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
288 if /i "%__BuildArch%" == "arm" (
289 set __VCBuildArch=x86_arm
291 REM Make CMake pick the highest installed version in the 10.0.* range
292 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
295 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
296 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
297 @if defined _echo @echo on
299 if not defined VSINSTALLDIR (
300 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
303 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
306 if defined __SkipConfigure goto SkipConfigure
308 echo %__MsgPrefix%Regenerating the Visual Studio solution
310 pushd "%__IntermediatesDir%"
311 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%"
312 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildStandaloneGC% !__ExtraCmakeArgs!
313 @if defined _echo @echo on
316 if defined __ConfigureOnly goto SkipNativeBuild
318 if not exist "%__IntermediatesDir%\install.vcxproj" (
319 echo %__MsgPrefix%Error: failed to generate native component build project!
323 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
325 if not !errorlevel! == 0 (
326 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
327 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
328 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
329 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
335 REM =========================================================================================
337 REM === Build Cross-Architecture Native Components (if applicable)
339 REM =========================================================================================
341 if /i "%__BuildArch%"=="arm64" (
342 set __DoCrossArchBuild=1
345 if /i "%__BuildArch%"=="arm" (
346 set __DoCrossArchBuild=1
349 if /i "%__DoCrossArchBuild%"=="1" (
351 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
353 :: Set the environment for the native build
354 set __VCBuildArch=x86_amd64
355 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
356 @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
357 @if defined _echo @echo on
359 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
360 if defined __SkipConfigure goto SkipConfigureCrossBuild
362 pushd "%__CrossCompIntermediatesDir%"
363 set __CMakeBinDir=%__CrossComponentBinDir%
364 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
365 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%"
366 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
367 @if defined _echo @echo on
369 :SkipConfigureCrossBuild
370 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
371 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
375 if defined __ConfigureOnly goto SkipCrossCompBuild
377 echo %__MsgPrefix%Invoking msbuild
379 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
380 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
381 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
382 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
383 if not !errorlevel! == 0 (
384 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
385 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
386 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
387 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
394 REM =========================================================================================
396 REM === CoreLib and NuGet package build section.
398 REM =========================================================================================
400 if %__BuildCoreLib% EQU 1 (
402 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
403 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
406 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
407 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
408 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
410 set __ExtraBuildArgs=
411 if not defined __IbcTuning (
412 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
413 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
416 if /i "%__BuildArch%" == "arm64" (
417 set __nugetBuildArgs=-buildNugetPackage=false
418 ) else if "%__SkipNugetPackage%" == "1" (
419 set __nugetBuildArgs=-buildNugetPackage=false
421 set __nugetBuildArgs=-buildNugetPackage=true
424 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
425 if not !errorlevel! == 0 (
426 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
427 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
428 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
429 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
434 REM Need diasymreader.dll on your path for /CreatePdb
435 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
437 if %__BuildNativeCoreLib% EQU 1 (
438 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
440 echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
441 "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
442 if NOT !errorlevel! == 0 (
443 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
444 :: Put it in the same log, helpful for Jenkins
445 type %__CrossGenCoreLibLog%
448 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll" >> "%__CrossGenCoreLibLog%" 2>&1
449 if NOT !errorlevel! == 0 (
450 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
451 :: Put it in the same log, helpful for Jenkins
452 type %__CrossGenCoreLibLog%
457 if %__BuildPackages% EQU 1 (
458 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
460 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
461 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
462 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
464 REM The conditions as to what to build are captured in the builds file.
465 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
467 if not !errorlevel! == 0 (
468 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
469 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
470 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
471 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
476 REM =========================================================================================
478 REM === Test build section
480 REM =========================================================================================
482 if %__BuildTests% EQU 1 (
483 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
485 REM Construct the arguments to pass to the test build script.
487 rem arm64 builds currently use private toolset which has not been released yet
488 REM TODO, remove once the toolset is open.
489 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
491 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
492 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
494 if not !errorlevel! == 0 (
495 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
500 REM =========================================================================================
502 REM === All builds complete!
504 REM =========================================================================================
506 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
507 echo %__MsgPrefix%Product binaries are available at !__BinDir!
508 if %__BuildTests% EQU 1 (
509 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
513 REM =========================================================================================
515 REM === Handle the "all" case.
517 REM =========================================================================================
523 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
524 if %__TotalSpecifiedBuildArch% EQU 0 (
525 REM Nothing specified means we want to build all architectures.
526 set __BuildArchList=x64 x86 arm arm64
529 REM Otherwise, add all the specified architectures to the list.
531 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
532 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
533 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
534 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
538 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
539 if %__TotalSpecifiedBuildType% EQU 0 (
540 REM Nothing specified means we want to build all build types.
541 set __BuildTypeList=Debug Checked Release
544 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
545 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
546 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
548 REM Create a temporary file to collect build results. We always build all flavors specified, and
549 REM report a summary of the results at the end.
551 set __AllBuildSuccess=true
552 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
553 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
555 for %%i in (%__BuildArchList%) do (
556 for %%j in (%__BuildTypeList%) do (
557 call :BuildOne %%i %%j
561 if %__AllBuildSuccess%==true (
562 echo %__MsgPrefix%All builds succeeded!
565 echo %__MsgPrefix%Builds failed:
566 type %__BuildResultFile%
567 del /f /q %__BuildResultFile%
571 REM This code is unreachable, but leaving it nonetheless, just in case things change.
577 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
578 echo %__MsgPrefix%Invoking: %__NextCmd%
580 if not !errorlevel! == 0 (
581 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
582 set __AllBuildSuccess=false
586 REM =========================================================================================
588 REM === Helper routines
590 REM =========================================================================================
597 echo Build the CoreCLR repo.
600 echo build.cmd [option1] [option2]
602 echo build.cmd all [option1] [option2] -- ...
604 echo All arguments are optional. The options are:
606 echo.-? -h -help: view this message.
607 echo all: Builds all configurations and platforms.
608 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
609 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
610 echo -- ... : all arguments following this tag will be passed directly to msbuild.
611 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
612 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
613 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
615 echo add nativemscorlib to go further and build the native image for designated mscorlib.
616 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
617 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
618 echo ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
619 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
620 echo skipconfigure: skip CMake ^(default: CMake is run^)
621 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
622 echo skipnative: skip building native components ^(default: native components are built^).
623 echo skiptests: skip building tests ^(default: tests are built^).
624 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
625 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
626 echo buildstandalonegc: builds the GC in a standalone mode.
627 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
628 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
629 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
630 echo -sequential: force a non-parallel build ^(default is to build in parallel
631 echo using all processors^).
632 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
633 echo -Rebuild: passes /t:rebuild to the build projects.
634 echo portable : build for portable RID.
636 echo If "all" is specified, then all build architectures and types are built. If, in addition,
637 echo one or more build architectures or types is specified, then only those build architectures
638 echo and types are built.
642 echo -- builds all architectures, and all build types per architecture
644 echo -- builds all build types for x86
645 echo build all x64 x86 Checked Release
646 echo -- builds x64 and x86 architectures, Checked and Release build types for each
650 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
651 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
652 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
653 of the previous version to "%VSINSTALLDIR%" and then build.
654 :: DIA SDK not included in Express editions
655 echo Visual Studio Express does not include the DIA SDK. ^
656 You need Visual Studio 2015 or 2017 (Community is free).
657 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
662 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
664 if /i "%__ToolsetDir%" == "" (
665 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
669 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
670 call "%__ToolsetDir%"\buildenv_arm64.cmd
674 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
675 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
677 %__ToolsetDir%\VC_sdk\inc;^
678 %__ToolsetDir%\sdpublic\sdk\inc;^
679 %__ToolsetDir%\sdpublic\shared\inc;^
680 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
681 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
682 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
683 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
684 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
685 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
686 %__ToolsetDir%\diasdk\include