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 __BuildJit32="-DBUILD_JIT32=0"
79 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
84 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
86 set __PassThroughArgs=
88 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
91 set __UnprocessedBuildArgs=
98 set __BuildNativeCoreLib=1
99 set __RestoreOptData=1
102 if "%1" == "" goto ArgsDone
104 if /i "%1" == "-?" goto Usage
105 if /i "%1" == "-h" goto Usage
106 if /i "%1" == "-help" goto Usage
108 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
109 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
111 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
112 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
118 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
119 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
120 if [!__PassThroughArgs!]==[] (
121 set __PassThroughArgs=%1
123 set __PassThroughArgs=%__PassThroughArgs% %1
126 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)
127 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)
128 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)
129 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)
130 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)
131 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)
132 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)
133 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 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)
140 if /i "%1" == "buildjit32" (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
144 if /i "%1" == "compatjitcrossgen" (set __CompatJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "buildstandalonegc" (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
148 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if [!processedArgs!]==[] (
151 call set __UnprocessedBuildArgs=!__args!
153 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
158 if defined __BuildAll goto BuildAll
160 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
161 if %__TotalSpecifiedBuildArch% GTR 1 (
162 echo Error: more than one build architecture specified, but "all" not specified.
166 if %__BuildArchX64%==1 set __BuildArch=x64
167 if %__BuildArchX86%==1 set __BuildArch=x86
168 if %__BuildArchArm%==1 (
172 if %__BuildArchArm64%==1 (
173 set __BuildArch=arm64
177 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
178 if %__TotalSpecifiedBuildType% GTR 1 (
179 echo Error: more than one build type specified, but "all" not specified.
183 if %__BuildTypeDebug%==1 set __BuildType=Debug
184 if %__BuildTypeChecked%==1 set __BuildType=Checked
185 if %__BuildTypeRelease%==1 set __BuildType=Release
187 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
189 :: Set the remaining variables based upon the determined build configuration
190 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
191 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
192 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
193 set "__PackagesBinDir=%__BinDir%\.nuget"
194 set "__TestRootDir=%__RootBinDir%\tests"
195 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
196 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
197 set "__CrossComponentBinDir=%__BinDir%"
198 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
200 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
201 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
202 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
204 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
205 set "__CMakeBinDir=%__BinDir%"
206 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
208 if not exist "%__BinDir%" md "%__BinDir%"
209 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
210 if not exist "%__LogsDir%" md "%__LogsDir%"
212 REM It is convinient to have your Nuget search path include the location where the build
213 REM will plass packages. However nuget used during the build will fail if that directory
214 REM does not exist. Avoid this in at least one case by agressively creating the directory.
215 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
217 echo %__MsgPrefix%Commencing CoreCLR Repo build
219 :: Set the remaining variables based upon the determined build configuration
221 echo %__MsgPrefix%Checking prerequisites
222 :: Eval the output from probe-win1.ps1
223 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
225 REM =========================================================================================
227 REM === Start the build steps
229 REM =========================================================================================
231 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
232 call "%__VSToolsRoot%\VsDevCmd.bat"
234 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
236 REM =========================================================================================
238 REM === Restore optimization profile data
240 REM =========================================================================================
242 REM Parse the package version out of project.json so that we can pass it on to CMake
244 echo %__MsgPrefix%Error: Python not found on PATH, please make sure that it is installed.
247 set OptDataProjectJsonPath=%__ProjectDir%\src\.nuget\optdata\project.json
248 if EXIST "%OptDataProjectJsonPath%" (
249 for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.PGO.CoreCLR') do @(
250 set __PgoOptDataVersion=%%s
252 for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.IBC.CoreCLR') do @(
253 set __IbcOptDataVersion=%%s
257 if %__RestoreOptData% EQU 1 (
258 echo %__MsgPrefix%Restoring the OptimizationData Package
259 @call %__ProjectDir%\run.cmd sync -optdata
260 if not !errorlevel! == 0 (
261 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
266 REM =========================================================================================
268 REM === Build the CLR VM
270 REM =========================================================================================
272 if %__BuildNative% EQU 1 (
273 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
275 set nativePlatfromArgs=-platform=%__BuildArch%
276 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
278 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
279 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
280 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
282 if /i "%__BuildArch%" == "arm64" (
283 rem arm64 builds currently use private toolset which has not been released yet
284 REM TODO, remove once the toolset is open.
289 :: Set the environment for the native build
290 set __VCBuildArch=x86_amd64
291 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
292 if /i "%__BuildArch%" == "arm" (
293 set __VCBuildArch=x86_arm
295 REM Make CMake pick the highest installed version in the 10.0.* range
296 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
299 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
300 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
301 @if defined _echo @echo on
303 if not defined VSINSTALLDIR (
304 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
307 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
310 if defined __SkipConfigure goto SkipConfigure
312 echo %__MsgPrefix%Regenerating the Visual Studio solution
314 pushd "%__IntermediatesDir%"
315 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%"
316 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32% %__BuildStandaloneGC% !__ExtraCmakeArgs!
317 @if defined _echo @echo on
320 if defined __ConfigureOnly goto SkipNativeBuild
322 if not exist "%__IntermediatesDir%\install.vcxproj" (
323 echo %__MsgPrefix%Error: failed to generate native component build project!
327 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
329 if not !errorlevel! == 0 (
330 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
331 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
332 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
333 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
339 REM =========================================================================================
341 REM === Build Cross-Architecture Native Components (if applicable)
343 REM =========================================================================================
345 if /i "%__BuildArch%"=="arm64" (
346 set __DoCrossArchBuild=1
349 if /i "%__BuildArch%"=="arm" (
350 set __DoCrossArchBuild=1
353 if /i "%__DoCrossArchBuild%"=="1" (
355 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
357 :: Set the environment for the native build
358 set __VCBuildArch=x86_amd64
359 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
360 @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
361 @if defined _echo @echo on
363 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
364 if defined __SkipConfigure goto SkipConfigureCrossBuild
366 pushd "%__CrossCompIntermediatesDir%"
367 set __CMakeBinDir=%__CrossComponentBinDir%
368 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
369 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%"
370 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
371 @if defined _echo @echo on
373 :SkipConfigureCrossBuild
374 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
375 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
379 if defined __ConfigureOnly goto SkipCrossCompBuild
381 echo %__MsgPrefix%Invoking msbuild
383 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
384 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
385 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
386 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
387 if not !errorlevel! == 0 (
388 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
389 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
390 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
391 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
398 REM =========================================================================================
400 REM === CoreLib and NuGet package build section.
402 REM =========================================================================================
404 if %__BuildCoreLib% EQU 1 (
406 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
407 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
410 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
411 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
412 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
414 set __ExtraBuildArgs=
415 if not defined __IbcTuning (
416 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
417 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
420 if /i "%__BuildArch%" == "arm64" (
421 set __nugetBuildArgs=-buildNugetPackage=false
422 ) else if "%__SkipNugetPackage%" == "1" (
423 set __nugetBuildArgs=-buildNugetPackage=false
425 set __nugetBuildArgs=-buildNugetPackage=true
428 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
429 if not !errorlevel! == 0 (
430 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
431 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
432 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
433 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
438 REM Need diasymreader.dll on your path for /CreatePdb
439 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
441 if %__BuildNativeCoreLib% EQU 1 (
442 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
444 if "%__CompatJitCrossgen%"=="1" (
445 set COMPlus_UseWindowsX86CoreLegacyJit=1
448 echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll"
449 "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
450 if NOT !errorlevel! == 0 (
451 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
452 :: Put it in the same log, helpful for Jenkins
453 type %__CrossGenCoreLibLog%
456 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.ni.dll" >> "%__CrossGenCoreLibLog%" 2>&1
457 if NOT !errorlevel! == 0 (
458 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
459 :: Put it in the same log, helpful for Jenkins
460 type %__CrossGenCoreLibLog%
464 if "%__CompatJitCrossgen%"=="1" (
465 set COMPlus_UseWindowsX86CoreLegacyJit=
469 if %__BuildPackages% EQU 1 (
470 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
472 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
473 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
474 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
476 REM The conditions as to what to build are captured in the builds file.
477 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
479 if not !errorlevel! == 0 (
480 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
481 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
482 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
483 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
488 REM =========================================================================================
490 REM === Test build section
492 REM =========================================================================================
494 if %__BuildTests% EQU 1 (
495 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
497 REM Construct the arguments to pass to the test build script.
499 rem arm64 builds currently use private toolset which has not been released yet
500 REM TODO, remove once the toolset is open.
501 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
503 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
504 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
506 if not !errorlevel! == 0 (
507 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
512 REM =========================================================================================
514 REM === All builds complete!
516 REM =========================================================================================
518 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
519 echo %__MsgPrefix%Product binaries are available at !__BinDir!
520 if %__BuildTests% EQU 1 (
521 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
525 REM =========================================================================================
527 REM === Handle the "all" case.
529 REM =========================================================================================
535 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
536 if %__TotalSpecifiedBuildArch% EQU 0 (
537 REM Nothing specified means we want to build all architectures.
538 set __BuildArchList=x64 x86 arm arm64
541 REM Otherwise, add all the specified architectures to the list.
543 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
544 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
545 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
546 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
550 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
551 if %__TotalSpecifiedBuildType% EQU 0 (
552 REM Nothing specified means we want to build all build types.
553 set __BuildTypeList=Debug Checked Release
556 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
557 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
558 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
560 REM Create a temporary file to collect build results. We always build all flavors specified, and
561 REM report a summary of the results at the end.
563 set __AllBuildSuccess=true
564 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
565 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
567 for %%i in (%__BuildArchList%) do (
568 for %%j in (%__BuildTypeList%) do (
569 call :BuildOne %%i %%j
573 if %__AllBuildSuccess%==true (
574 echo %__MsgPrefix%All builds succeeded!
577 echo %__MsgPrefix%Builds failed:
578 type %__BuildResultFile%
579 del /f /q %__BuildResultFile%
583 REM This code is unreachable, but leaving it nonetheless, just in case things change.
589 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
590 echo %__MsgPrefix%Invoking: %__NextCmd%
592 if not !errorlevel! == 0 (
593 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
594 set __AllBuildSuccess=false
598 REM =========================================================================================
600 REM === Helper routines
602 REM =========================================================================================
609 echo Build the CoreCLR repo.
612 echo build.cmd [option1] [option2]
614 echo build.cmd all [option1] [option2] -- ...
616 echo All arguments are optional. The options are:
618 echo.-? -h -help: view this message.
619 echo all: Builds all configurations and platforms.
620 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
621 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
622 echo -- ... : all arguments following this tag will be passed directly to msbuild.
623 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
624 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
625 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
627 echo add nativemscorlib to go further and build the native image for designated mscorlib.
628 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
629 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
630 echo ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
631 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
632 echo skipconfigure: skip CMake ^(default: CMake is run^)
633 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
634 echo skipnative: skip building native components ^(default: native components are built^).
635 echo skiptests: skip building tests ^(default: tests are built^).
636 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
637 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
638 echo buildstandalonegc: builds the GC in a standalone mode.
639 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
640 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
641 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
642 echo -sequential: force a non-parallel build ^(default is to build in parallel
643 echo using all processors^).
644 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
645 echo -Rebuild: passes /t:rebuild to the build projects.
647 echo If "all" is specified, then all build architectures and types are built. If, in addition,
648 echo one or more build architectures or types is specified, then only those build architectures
649 echo and types are built.
653 echo -- builds all architectures, and all build types per architecture
655 echo -- builds all build types for x86
656 echo build all x64 x86 Checked Release
657 echo -- builds x64 and x86 architectures, Checked and Release build types for each
661 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
662 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
663 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
664 of the previous version to "%VSINSTALLDIR%" and then build.
665 :: DIA SDK not included in Express editions
666 echo Visual Studio Express does not include the DIA SDK. ^
667 You need Visual Studio 2015 or 2017 (Community is free).
668 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
673 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
675 if /i "%__ToolsetDir%" == "" (
676 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
680 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
681 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
683 %__ToolsetDir%\VC_sdk\inc;^
684 %__ToolsetDir%\sdpublic\sdk\inc;^
685 %__ToolsetDir%\sdpublic\shared\inc;^
686 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
687 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
688 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
689 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
690 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
691 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
692 %__ToolsetDir%\diasdk\include