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 "__OptDataVersion="
72 set __BuildArchArm64=0
74 set __BuildTypeDebug=0
75 set __BuildTypeChecked=0
76 set __BuildTypeRelease=0
77 set __BuildJit32="-DBUILD_JIT32=0"
78 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
82 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
84 set __PassThroughArgs=
86 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
89 set __UnprocessedBuildArgs=
96 set __BuildNativeCoreLib=1
97 set __RestoreOptData=1
100 if "%1" == "" goto ArgsDone
102 if /i "%1" == "-?" goto Usage
103 if /i "%1" == "-h" goto Usage
104 if /i "%1" == "-help" goto Usage
106 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
107 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
108 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
109 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
112 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
117 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
118 set __PassThroughArgs=%__PassThroughArgs% %1
120 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)
121 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)
122 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)
123 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)
124 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)
125 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)
126 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)
127 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
129 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 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)
134 if /i "%1" == "buildjit32" (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
137 if /i "%1" == "compatjitcrossgen" (set __CompatJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "buildstandalonegc" (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
141 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if [!processedArgs!]==[] (
144 call set __UnprocessedBuildArgs=!__args!
146 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
151 if defined __BuildAll goto BuildAll
153 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
154 if %__TotalSpecifiedBuildArch% GTR 1 (
155 echo Error: more than one build architecture specified, but "all" not specified.
159 if %__BuildArchX64%==1 set __BuildArch=x64
160 if %__BuildArchX86%==1 set __BuildArch=x86
161 if %__BuildArchArm%==1 (
165 if %__BuildArchArm64%==1 (
166 set __BuildArch=arm64
170 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
171 if %__TotalSpecifiedBuildType% GTR 1 (
172 echo Error: more than one build type specified, but "all" not specified.
176 if %__BuildTypeDebug%==1 set __BuildType=Debug
177 if %__BuildTypeChecked%==1 set __BuildType=Checked
178 if %__BuildTypeRelease%==1 set __BuildType=Release
180 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
182 :: Set the remaining variables based upon the determined build configuration
183 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
184 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
185 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
186 set "__PackagesBinDir=%__BinDir%\.nuget"
187 set "__TestRootDir=%__RootBinDir%\tests"
188 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
189 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
190 set "__CrossComponentBinDir=%__BinDir%"
191 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
193 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
194 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
195 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
197 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
198 set "__CMakeBinDir=%__BinDir%"
199 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
201 if not exist "%__BinDir%" md "%__BinDir%"
202 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
203 if not exist "%__LogsDir%" md "%__LogsDir%"
205 REM It is convinient to have your Nuget search path include the location where the build
206 REM will plass packages. However nuget used during the build will fail if that directory
207 REM does not exist. Avoid this in at least one case by agressively creating the directory.
208 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
210 echo %__MsgPrefix%Commencing CoreCLR Repo build
212 :: Set the remaining variables based upon the determined build configuration
214 echo %__MsgPrefix%Checking prerequisites
215 :: Eval the output from probe-win1.ps1
216 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
218 REM =========================================================================================
220 REM === Start the build steps
222 REM =========================================================================================
224 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
225 call "%__VSToolsRoot%\VsDevCmd.bat"
227 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
229 REM =========================================================================================
231 REM === Restore optimization profile data
233 REM =========================================================================================
235 REM Parse the package version out of project.json so that we can pass it on to CMake
237 echo %__MsgPrefix%Error: Python not found on PATH, please make sure that it is installed.
240 set OptDataProjectJsonPath=%__ProjectDir%\src\.nuget\optdata\project.json
241 if EXIST "%OptDataProjectJsonPath%" (
242 for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.PGO.CoreCLR') do @(
243 set __OptDataVersion=%%s
247 if %__RestoreOptData% EQU 1 (
248 echo %__MsgPrefix%Restoring the OptimizationData Package
249 @call %__ProjectDir%\run.cmd sync -optdata
250 if not !errorlevel! == 0 (
251 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
256 REM =========================================================================================
258 REM === Build the CLR VM
260 REM =========================================================================================
262 if %__BuildNative% EQU 1 (
263 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
265 set nativePlatfromArgs=-platform=%__BuildArch%
266 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
268 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
269 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
270 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
272 if /i "%__BuildArch%" == "arm64" (
273 rem arm64 builds currently use private toolset which has not been released yet
274 REM TODO, remove once the toolset is open.
279 :: Set the environment for the native build
280 set __VCBuildArch=x86_amd64
281 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
282 if /i "%__BuildArch%" == "arm" (
283 set __VCBuildArch=x86_arm
285 REM Make CMake pick the highest installed version in the 10.0.* range
286 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
289 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
290 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
291 @if defined _echo @echo on
293 if not defined VSINSTALLDIR (
294 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
297 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
300 if defined __SkipConfigure goto SkipConfigure
302 echo %__MsgPrefix%Regenerating the Visual Studio solution
304 pushd "%__IntermediatesDir%"
305 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__OptDataVersion%"
306 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32% %__BuildStandaloneGC% !__ExtraCmakeArgs!
307 @if defined _echo @echo on
310 if defined __ConfigureOnly goto SkipNativeBuild
312 if not exist "%__IntermediatesDir%\install.vcxproj" (
313 echo %__MsgPrefix%Error: failed to generate native component build project!
317 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
319 if not !errorlevel! == 0 (
320 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
321 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
322 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
323 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
329 REM =========================================================================================
331 REM === Build Cross-Architecture Native Components (if applicable)
333 REM =========================================================================================
335 if /i "%__BuildArch%"=="arm64" (
336 set __DoCrossArchBuild=1
339 if /i "%__BuildArch%"=="arm" (
340 set __DoCrossArchBuild=1
343 if /i "%__DoCrossArchBuild%"=="1" (
345 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
347 :: Set the environment for the native build
348 set __VCBuildArch=x86_amd64
349 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
350 @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
351 @if defined _echo @echo on
353 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
354 if defined __SkipConfigure goto SkipConfigureCrossBuild
356 pushd "%__CrossCompIntermediatesDir%"
357 set __CMakeBinDir=%__CrossComponentBinDir%
358 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
359 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=%__OptDataVersion%"
360 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
361 @if defined _echo @echo on
363 :SkipConfigureCrossBuild
364 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
365 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
369 if defined __ConfigureOnly goto SkipCrossCompBuild
371 echo %__MsgPrefix%Invoking msbuild
373 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
374 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
375 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
376 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
377 if not !errorlevel! == 0 (
378 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
379 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
380 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
381 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
388 REM =========================================================================================
390 REM === CoreLib and NuGet package build section.
392 REM =========================================================================================
394 if %__BuildCoreLib% EQU 1 (
396 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
397 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
400 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
401 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
402 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
404 if /i "%__BuildArch%" == "arm64" (
405 set __nugetBuildArgs=-buildNugetPackage=false
406 ) else if "%__SkipNugetPackage%" == "1" (
407 set __nugetBuildArgs=-buildNugetPackage=false
409 set __nugetBuildArgs=-buildNugetPackage=true
412 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% %__UnprocessedBuildArgs%
413 if not !errorlevel! == 0 (
414 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
415 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
416 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
417 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
422 REM Need diasymreader.dll on your path for /CreatePdb
423 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
425 if %__BuildNativeCoreLib% EQU 1 (
426 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
428 if "%__CompatJitCrossgen%"=="1" (
429 set COMPlus_UseWindowsX86CoreLegacyJit=1
432 echo "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll"
433 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
434 if NOT !errorlevel! == 0 (
435 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
436 :: Put it in the same log, helpful for Jenkins
437 type %__CrossGenCoreLibLog%
440 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.ni.dll" >> "%__CrossGenCoreLibLog%" 2>&1
441 if NOT !errorlevel! == 0 (
442 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
443 :: Put it in the same log, helpful for Jenkins
444 type %__CrossGenCoreLibLog%
448 echo %__MsgPrefix%Generating native image of MScorlib facade for %__BuildOS%.%__BuildArch%.%__BuildType%
450 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenMSCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
451 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
453 "!__CrossgenExe!" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\mscorlib.ni.dll" "%__BinDir%\mscorlib.dll" > "!__CrossGenCoreLibLog!" 2>&1
456 if "%__CompatJitCrossgen%"=="1" (
457 set COMPlus_UseWindowsX86CoreLegacyJit=
461 echo %__MsgPrefix%Error: CrossGen mscorlib facade build failed. Refer to !__CrossGenCoreLibLog!
462 :: Put it in the same log, helpful for Jenkins
463 type %__CrossGenCoreLibLog%
468 if %__BuildPackages% EQU 1 (
469 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
471 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
472 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
473 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
475 REM The conditions as to what to build are captured in the builds file.
476 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
478 if not !errorlevel! == 0 (
479 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
480 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
481 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
482 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
487 REM =========================================================================================
489 REM === Test build section
491 REM =========================================================================================
493 if %__BuildTests% EQU 1 (
494 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
496 REM Construct the arguments to pass to the test build script.
498 rem arm64 builds currently use private toolset which has not been released yet
499 REM TODO, remove once the toolset is open.
500 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
502 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
503 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
505 if not !errorlevel! == 0 (
506 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
511 REM =========================================================================================
513 REM === All builds complete!
515 REM =========================================================================================
517 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
518 echo %__MsgPrefix%Product binaries are available at !__BinDir!
519 if %__BuildTests% EQU 1 (
520 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
524 REM =========================================================================================
526 REM === Handle the "all" case.
528 REM =========================================================================================
534 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
535 if %__TotalSpecifiedBuildArch% EQU 0 (
536 REM Nothing specified means we want to build all architectures.
537 set __BuildArchList=x64 x86 arm arm64
540 REM Otherwise, add all the specified architectures to the list.
542 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
543 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
544 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
545 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
549 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
550 if %__TotalSpecifiedBuildType% EQU 0 (
551 REM Nothing specified means we want to build all build types.
552 set __BuildTypeList=Debug Checked Release
555 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
556 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
557 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
559 REM Create a temporary file to collect build results. We always build all flavors specified, and
560 REM report a summary of the results at the end.
562 set __AllBuildSuccess=true
563 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
564 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
566 for %%i in (%__BuildArchList%) do (
567 for %%j in (%__BuildTypeList%) do (
568 call :BuildOne %%i %%j
572 if %__AllBuildSuccess%==true (
573 echo %__MsgPrefix%All builds succeeded!
576 echo %__MsgPrefix%Builds failed:
577 type %__BuildResultFile%
578 del /f /q %__BuildResultFile%
582 REM This code is unreachable, but leaving it nonetheless, just in case things change.
588 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
589 echo %__MsgPrefix%Invoking: %__NextCmd%
591 if not !errorlevel! == 0 (
592 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
593 set __AllBuildSuccess=false
597 REM =========================================================================================
599 REM === Helper routines
601 REM =========================================================================================
608 echo Build the CoreCLR repo.
611 echo build.cmd [option1] [option2]
613 echo build.cmd all [option1] [option2] -- ...
615 echo All arguments are optional. The options are:
617 echo.-? -h -help: view this message.
618 echo all: Builds all configurations and platforms.
619 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
620 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
621 echo -- ... : all arguments following this tag will be passed directly to msbuild.
622 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
623 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
624 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
626 echo add nativemscorlib to go further and build the native image for designated mscorlib.
627 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
628 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
629 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
630 echo skipconfigure: skip CMake ^(default: CMake is run^)
631 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
632 echo skipnative: skip building native components ^(default: native components are built^).
633 echo skiptests: skip building tests ^(default: tests are built^).
634 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
635 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
636 echo buildstandalonegc: builds the GC in a standalone mode.
637 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
638 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
639 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
640 echo -sequential: force a non-parallel build ^(default is to build in parallel
641 echo using all processors^).
642 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
643 echo -Rebuild: passes /t:rebuild to the build projects.
645 echo If "all" is specified, then all build architectures and types are built. If, in addition,
646 echo one or more build architectures or types is specified, then only those build architectures
647 echo and types are built.
651 echo -- builds all architectures, and all build types per architecture
653 echo -- builds all build types for x86
654 echo build all x64 x86 Checked Release
655 echo -- builds x64 and x86 architectures, Checked and Release build types for each
659 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
660 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
661 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
662 of the previous version to "%VSINSTALLDIR%" and then build.
663 :: DIA SDK not included in Express editions
664 echo Visual Studio Express does not include the DIA SDK. ^
665 You need Visual Studio 2015 or 2017 (Community is free).
666 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
671 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
673 if /i "%__ToolsetDir%" == "" (
674 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
678 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
679 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
681 %__ToolsetDir%\VC_sdk\inc;^
682 %__ToolsetDir%\sdpublic\sdk\inc;^
683 %__ToolsetDir%\sdpublic\shared\inc;^
684 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
685 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
686 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
687 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
688 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
689 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
690 %__ToolsetDir%\diasdk\include