1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
7 :: Default to highest Visual Studio version available
9 :: For VS2015 (and prior), only a single instance is allowed to be installed on a box
10 :: and VS140COMNTOOLS is set as a global environment variable by the installer. This
11 :: allows users to locate where the instance of VS2015 is installed.
13 :: For VS2017, multiple instances can be installed on the same box SxS and VS150COMNTOOLS
14 :: is no longer set as a global environment variable and is instead only set if the user
15 :: has launched the VS2017 Developer Command Prompt.
17 :: Following this logic, we will default to the VS2017 toolset if VS150COMNTOOLS tools is
18 :: set, as this indicates the user is running from the VS2017 Developer Command Prompt and
19 :: is already configured to use that toolset. Otherwise, we will fallback to using the VS2015
20 :: toolset if it is installed. Finally, we will fail the script if no supported VS instance
22 if defined VS150COMNTOOLS (
23 set "__VSToolsRoot=%VS150COMNTOOLS%"
24 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
25 set __VSVersion=vs2017
27 set "__VSToolsRoot=%VS140COMNTOOLS%"
28 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
29 set __VSVersion=vs2015
32 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
33 :: __BuildArch -- default: x64
34 :: __BuildType -- default: Debug
35 :: __BuildOS -- default: Windows_NT
36 :: __ProjectDir -- default: directory of the dir.props file
37 :: __SourceDir -- default: %__ProjectDir%\src\
38 :: __PackagesDir -- default: %__ProjectDir%\packages\
39 :: __RootBinDir -- default: %__ProjectDir%\bin\
40 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
42 :: __PackagesBinDir -- default: %__BinDir%\.nuget
43 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
45 :: Thus, these variables are not simply internal to this script!
47 :: Set the default arguments for build
50 set __BuildOS=Windows_NT
52 :: Define a prefix for most output progress messages that come from this script. That makes
53 :: it easier to see where these are coming from. Note that there is a trailing space here.
54 set "__MsgPrefix=BUILD: "
56 :: Set the various build properties here so that CMake and MSBuild can pick them up
57 set "__ProjectDir=%~dp0"
58 :: remove trailing slash
59 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
60 set "__ProjectFilesDir=%__ProjectDir%"
61 set "__SourceDir=%__ProjectDir%\src"
62 set "__PackagesDir=%__ProjectDir%\packages"
63 set "__RootBinDir=%__ProjectDir%\bin"
64 set "__LogsDir=%__RootBinDir%\Logs"
65 set "__PgoOptDataVersion="
66 set "__IbcOptDataVersion="
73 set __BuildArchArm64=0
75 set __BuildTypeDebug=0
76 set __BuildTypeChecked=0
77 set __BuildTypeRelease=0
78 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
79 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=0"
85 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
87 set __PassThroughArgs=
89 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
92 set __UnprocessedBuildArgs=
99 set __BuildNativeCoreLib=1
100 set __RestoreOptData=1
103 if "%1" == "" goto ArgsDone
105 if /i "%1" == "-?" goto Usage
106 if /i "%1" == "-h" goto Usage
107 if /i "%1" == "-help" goto Usage
109 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
111 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
112 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
117 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
119 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
120 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
121 if [!__PassThroughArgs!]==[] (
122 set __PassThroughArgs=%1
124 set __PassThroughArgs=%__PassThroughArgs% %1
127 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)
128 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)
129 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)
130 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)
131 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)
132 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)
133 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)
134 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 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)
141 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
145 if /i "%1" == "buildstandalonegc" (
146 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"
147 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=1"
148 set processedArgs=!processedArgs! %1
152 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
153 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
155 if [!processedArgs!]==[] (
156 call set __UnprocessedBuildArgs=!__args!
158 call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
163 if %__PgoOptimize%==0 set __RestoreOptData=0
165 if defined __BuildAll goto BuildAll
167 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
168 if %__TotalSpecifiedBuildArch% GTR 1 (
169 echo Error: more than one build architecture specified, but "all" not specified.
173 if %__BuildArchX64%==1 set __BuildArch=x64
174 if %__BuildArchX86%==1 set __BuildArch=x86
175 if %__BuildArchArm%==1 (
179 if %__BuildArchArm64%==1 (
180 set __BuildArch=arm64
184 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
185 if %__TotalSpecifiedBuildType% GTR 1 (
186 echo Error: more than one build type specified, but "all" not specified.
190 if %__BuildTypeDebug%==1 set __BuildType=Debug
191 if %__BuildTypeChecked%==1 set __BuildType=Checked
192 if %__BuildTypeRelease%==1 set __BuildType=Release
194 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
196 :: Set the remaining variables based upon the determined build configuration
197 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
198 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
199 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
200 set "__PackagesBinDir=%__BinDir%\.nuget"
201 set "__TestRootDir=%__RootBinDir%\tests"
202 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
203 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
204 set "__CrossComponentBinDir=%__BinDir%"
205 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
207 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
208 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
209 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
211 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
212 set "__CMakeBinDir=%__BinDir%"
213 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
215 if not exist "%__BinDir%" md "%__BinDir%"
216 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
217 if not exist "%__LogsDir%" md "%__LogsDir%"
219 REM It is convinient to have your Nuget search path include the location where the build
220 REM will plass packages. However nuget used during the build will fail if that directory
221 REM does not exist. Avoid this in at least one case by agressively creating the directory.
222 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
224 echo %__MsgPrefix%Commencing CoreCLR Repo build
226 :: Set the remaining variables based upon the determined build configuration
228 echo %__MsgPrefix%Checking prerequisites
229 :: Eval the output from probe-win1.ps1
230 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
232 REM =========================================================================================
234 REM === Start the build steps
236 REM =========================================================================================
238 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
239 call "%__VSToolsRoot%\VsDevCmd.bat"
241 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
243 REM =========================================================================================
245 REM === Restore optimization profile data
247 REM =========================================================================================
249 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
250 echo %__MsgPrefix%Restoring the OptimizationData Package
251 @call %__ProjectDir%\run.cmd sync -optdata
252 if not !errorlevel! == 0 (
253 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
258 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
259 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
260 if not exist "%DotNetCli%" (
261 echo Assertion failed: dotnet.exe not found at path "%DotNetCli%"
264 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
265 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
266 set __PgoOptDataVersion=%%s
268 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
269 set __IbcOptDataVersion=%%s
272 REM =========================================================================================
274 REM === Build the CLR VM
276 REM =========================================================================================
278 if %__BuildNative% EQU 1 (
279 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
281 set nativePlatfromArgs=-platform=%__BuildArch%
282 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
284 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
285 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
286 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
288 if /i "%__BuildArch%" == "arm64" (
289 rem arm64 builds currently use private toolset which has not been released yet
290 REM TODO, remove once the toolset is open.
295 :: Set the environment for the native build
296 set __VCBuildArch=x86_amd64
297 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
298 if /i "%__BuildArch%" == "arm" (
299 set __VCBuildArch=x86_arm
301 REM Make CMake pick the highest installed version in the 10.0.* range
302 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
305 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
306 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
307 @if defined _echo @echo on
309 if not defined VSINSTALLDIR (
310 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
313 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
316 if defined __SkipConfigure goto SkipConfigure
318 echo %__MsgPrefix%Regenerating the Visual Studio solution
320 pushd "%__IntermediatesDir%"
321 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%"
322 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildStandaloneGC% %__BuildStandaloneGCOnly% !__ExtraCmakeArgs!
323 @if defined _echo @echo on
326 if defined __ConfigureOnly goto SkipNativeBuild
328 if not exist "%__IntermediatesDir%\install.vcxproj" (
329 echo %__MsgPrefix%Error: failed to generate native component build project!
333 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
335 if not !errorlevel! == 0 (
336 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
337 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
338 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
339 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
345 REM =========================================================================================
347 REM === Build Cross-Architecture Native Components (if applicable)
349 REM =========================================================================================
351 if /i "%__BuildArch%"=="arm64" (
352 set __DoCrossArchBuild=1
355 if /i "%__BuildArch%"=="arm" (
356 set __DoCrossArchBuild=1
359 if /i "%__DoCrossArchBuild%"=="1" (
361 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
363 :: Set the environment for the native build
364 set __VCBuildArch=x86_amd64
365 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
366 @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
367 @if defined _echo @echo on
369 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
370 if defined __SkipConfigure goto SkipConfigureCrossBuild
372 pushd "%__CrossCompIntermediatesDir%"
373 set __CMakeBinDir=%__CrossComponentBinDir%
374 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
375 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%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%"
376 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
377 @if defined _echo @echo on
379 :SkipConfigureCrossBuild
380 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
381 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
385 if defined __ConfigureOnly goto SkipCrossCompBuild
387 echo %__MsgPrefix%Invoking msbuild
389 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
390 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
391 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
392 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
393 if not !errorlevel! == 0 (
394 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
395 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
396 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
397 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
404 REM =========================================================================================
406 REM === CoreLib and NuGet package build section.
408 REM =========================================================================================
410 if %__BuildCoreLib% EQU 1 (
412 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
413 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
416 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
417 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
418 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
420 set __ExtraBuildArgs=
421 if not defined __IbcTuning (
422 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
423 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
426 if /i "%__BuildArch%" == "arm64" (
427 set __nugetBuildArgs=-buildNugetPackage=false
428 ) else if "%__SkipNugetPackage%" == "1" (
429 set __nugetBuildArgs=-buildNugetPackage=false
431 set __nugetBuildArgs=-buildNugetPackage=true
434 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
435 if not !errorlevel! == 0 (
436 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
437 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
438 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
439 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
444 REM Need diasymreader.dll on your path for /CreatePdb
445 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
447 if %__BuildNativeCoreLib% EQU 1 (
448 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
450 echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
451 "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
452 if NOT !errorlevel! == 0 (
453 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
454 :: Put it in the same log, helpful for Jenkins
455 type %__CrossGenCoreLibLog%
458 echo "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
459 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll" >> "%__CrossGenCoreLibLog%" 2>&1
460 if NOT !errorlevel! == 0 (
461 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib 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 nopgooptimize: do not use profile guided optimizations.
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.
646 echo portable : build for portable RID.
648 echo If "all" is specified, then all build architectures and types are built. If, in addition,
649 echo one or more build architectures or types is specified, then only those build architectures
650 echo and types are built.
654 echo -- builds all architectures, and all build types per architecture
656 echo -- builds all build types for x86
657 echo build all x64 x86 Checked Release
658 echo -- builds x64 and x86 architectures, Checked and Release build types for each
662 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
663 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
664 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
665 of the previous version to "%VSINSTALLDIR%" and then build.
666 :: DIA SDK not included in Express editions
667 echo Visual Studio Express does not include the DIA SDK. ^
668 You need Visual Studio 2015 or 2017 (Community is free).
669 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
674 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
676 if /i "%__ToolsetDir%" == "" (
677 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
681 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
682 call "%__ToolsetDir%"\buildenv_arm64.cmd
686 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
687 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
689 %__ToolsetDir%\VC_sdk\inc;^
690 %__ToolsetDir%\sdpublic\sdk\inc;^
691 %__ToolsetDir%\sdpublic\shared\inc;^
692 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
693 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
694 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
695 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
696 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
697 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
698 %__ToolsetDir%\diasdk\include