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 set __PassThroughArgs=%__PassThroughArgs% %1
122 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)
123 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)
124 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)
125 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)
126 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)
127 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)
128 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)
129 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 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)
136 if /i "%1" == "buildjit32" (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
140 if /i "%1" == "compatjitcrossgen" (set __CompatJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "buildstandalonegc" (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
144 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if [!processedArgs!]==[] (
147 call set __UnprocessedBuildArgs=!__args!
149 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
154 if defined __BuildAll goto BuildAll
156 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
157 if %__TotalSpecifiedBuildArch% GTR 1 (
158 echo Error: more than one build architecture specified, but "all" not specified.
162 if %__BuildArchX64%==1 set __BuildArch=x64
163 if %__BuildArchX86%==1 set __BuildArch=x86
164 if %__BuildArchArm%==1 (
168 if %__BuildArchArm64%==1 (
169 set __BuildArch=arm64
173 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
174 if %__TotalSpecifiedBuildType% GTR 1 (
175 echo Error: more than one build type specified, but "all" not specified.
179 if %__BuildTypeDebug%==1 set __BuildType=Debug
180 if %__BuildTypeChecked%==1 set __BuildType=Checked
181 if %__BuildTypeRelease%==1 set __BuildType=Release
183 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
185 :: Set the remaining variables based upon the determined build configuration
186 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
187 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
188 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
189 set "__PackagesBinDir=%__BinDir%\.nuget"
190 set "__TestRootDir=%__RootBinDir%\tests"
191 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
192 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
193 set "__CrossComponentBinDir=%__BinDir%"
194 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
196 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
197 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
198 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
200 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
201 set "__CMakeBinDir=%__BinDir%"
202 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
204 if not exist "%__BinDir%" md "%__BinDir%"
205 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
206 if not exist "%__LogsDir%" md "%__LogsDir%"
208 REM It is convinient to have your Nuget search path include the location where the build
209 REM will plass packages. However nuget used during the build will fail if that directory
210 REM does not exist. Avoid this in at least one case by agressively creating the directory.
211 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
213 echo %__MsgPrefix%Commencing CoreCLR Repo build
215 :: Set the remaining variables based upon the determined build configuration
217 echo %__MsgPrefix%Checking prerequisites
218 :: Eval the output from probe-win1.ps1
219 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
221 REM =========================================================================================
223 REM === Start the build steps
225 REM =========================================================================================
227 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
228 call "%__VSToolsRoot%\VsDevCmd.bat"
230 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
232 REM =========================================================================================
234 REM === Restore optimization profile data
236 REM =========================================================================================
238 REM Parse the package version out of project.json so that we can pass it on to CMake
240 echo %__MsgPrefix%Error: Python not found on PATH, please make sure that it is installed.
243 set OptDataProjectJsonPath=%__ProjectDir%\src\.nuget\optdata\project.json
244 if EXIST "%OptDataProjectJsonPath%" (
245 for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.PGO.CoreCLR') do @(
246 set __PgoOptDataVersion=%%s
248 for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.IBC.CoreCLR') do @(
249 set __IbcOptDataVersion=%%s
253 if %__RestoreOptData% EQU 1 (
254 echo %__MsgPrefix%Restoring the OptimizationData Package
255 @call %__ProjectDir%\run.cmd sync -optdata
256 if not !errorlevel! == 0 (
257 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
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% %__BuildJit32% %__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 if "%__CompatJitCrossgen%"=="1" (
441 set COMPlus_UseWindowsX86CoreLegacyJit=1
444 echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll"
445 "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
446 if NOT !errorlevel! == 0 (
447 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
448 :: Put it in the same log, helpful for Jenkins
449 type %__CrossGenCoreLibLog%
452 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.ni.dll" >> "%__CrossGenCoreLibLog%" 2>&1
453 if NOT !errorlevel! == 0 (
454 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
455 :: Put it in the same log, helpful for Jenkins
456 type %__CrossGenCoreLibLog%
460 if "%__CompatJitCrossgen%"=="1" (
461 set COMPlus_UseWindowsX86CoreLegacyJit=
465 if %__BuildPackages% EQU 1 (
466 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
468 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
469 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
470 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
472 REM The conditions as to what to build are captured in the builds file.
473 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
475 if not !errorlevel! == 0 (
476 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
477 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
478 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
479 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
484 REM =========================================================================================
486 REM === Test build section
488 REM =========================================================================================
490 if %__BuildTests% EQU 1 (
491 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
493 REM Construct the arguments to pass to the test build script.
495 rem arm64 builds currently use private toolset which has not been released yet
496 REM TODO, remove once the toolset is open.
497 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
499 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
500 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
502 if not !errorlevel! == 0 (
503 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
508 REM =========================================================================================
510 REM === All builds complete!
512 REM =========================================================================================
514 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
515 echo %__MsgPrefix%Product binaries are available at !__BinDir!
516 if %__BuildTests% EQU 1 (
517 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
521 REM =========================================================================================
523 REM === Handle the "all" case.
525 REM =========================================================================================
531 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
532 if %__TotalSpecifiedBuildArch% EQU 0 (
533 REM Nothing specified means we want to build all architectures.
534 set __BuildArchList=x64 x86 arm arm64
537 REM Otherwise, add all the specified architectures to the list.
539 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
540 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
541 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
542 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
546 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
547 if %__TotalSpecifiedBuildType% EQU 0 (
548 REM Nothing specified means we want to build all build types.
549 set __BuildTypeList=Debug Checked Release
552 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
553 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
554 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
556 REM Create a temporary file to collect build results. We always build all flavors specified, and
557 REM report a summary of the results at the end.
559 set __AllBuildSuccess=true
560 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
561 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
563 for %%i in (%__BuildArchList%) do (
564 for %%j in (%__BuildTypeList%) do (
565 call :BuildOne %%i %%j
569 if %__AllBuildSuccess%==true (
570 echo %__MsgPrefix%All builds succeeded!
573 echo %__MsgPrefix%Builds failed:
574 type %__BuildResultFile%
575 del /f /q %__BuildResultFile%
579 REM This code is unreachable, but leaving it nonetheless, just in case things change.
585 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
586 echo %__MsgPrefix%Invoking: %__NextCmd%
588 if not !errorlevel! == 0 (
589 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
590 set __AllBuildSuccess=false
594 REM =========================================================================================
596 REM === Helper routines
598 REM =========================================================================================
605 echo Build the CoreCLR repo.
608 echo build.cmd [option1] [option2]
610 echo build.cmd all [option1] [option2] -- ...
612 echo All arguments are optional. The options are:
614 echo.-? -h -help: view this message.
615 echo all: Builds all configurations and platforms.
616 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
617 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
618 echo -- ... : all arguments following this tag will be passed directly to msbuild.
619 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
620 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
621 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
623 echo add nativemscorlib to go further and build the native image for designated mscorlib.
624 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
625 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
626 echo ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
627 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
628 echo skipconfigure: skip CMake ^(default: CMake is run^)
629 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
630 echo skipnative: skip building native components ^(default: native components are built^).
631 echo skiptests: skip building tests ^(default: tests are built^).
632 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
633 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
634 echo buildstandalonegc: builds the GC in a standalone mode.
635 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
636 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
637 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
638 echo -sequential: force a non-parallel build ^(default is to build in parallel
639 echo using all processors^).
640 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
641 echo -Rebuild: passes /t:rebuild to the build projects.
643 echo If "all" is specified, then all build architectures and types are built. If, in addition,
644 echo one or more build architectures or types is specified, then only those build architectures
645 echo and types are built.
649 echo -- builds all architectures, and all build types per architecture
651 echo -- builds all build types for x86
652 echo build all x64 x86 Checked Release
653 echo -- builds x64 and x86 architectures, Checked and Release build types for each
657 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
658 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
659 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
660 of the previous version to "%VSINSTALLDIR%" and then build.
661 :: DIA SDK not included in Express editions
662 echo Visual Studio Express does not include the DIA SDK. ^
663 You need Visual Studio 2015 or 2017 (Community is free).
664 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
669 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
671 if /i "%__ToolsetDir%" == "" (
672 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
676 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
677 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
679 %__ToolsetDir%\VC_sdk\inc;^
680 %__ToolsetDir%\sdpublic\sdk\inc;^
681 %__ToolsetDir%\sdpublic\shared\inc;^
682 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
683 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
684 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
685 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
686 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
687 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
688 %__ToolsetDir%\diasdk\include