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
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
101 REM Is this a portable build?
102 set __IsPortableBuild=
105 if "%1" == "" goto ArgsDone
107 if /i "%1" == "-?" goto Usage
108 if /i "%1" == "-h" goto Usage
109 if /i "%1" == "-help" goto Usage
111 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
112 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
117 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
118 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
119 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
121 if /i "%1" == "-portable" (set __IsPortableBuild=-portable&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
123 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
124 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
125 if [!__PassThroughArgs!]==[] (
126 set __PassThroughArgs=%1
128 set __PassThroughArgs=%__PassThroughArgs% %1
131 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)
132 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)
133 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)
134 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)
135 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)
136 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)
137 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)
138 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 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)
145 if /i "%1" == "buildjit32" (set __BuildJit32=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
149 if /i "%1" == "compatjitcrossgen" (set __CompatJitCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "buildstandalonegc" (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
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 defined __BuildAll goto BuildAll
165 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
166 if %__TotalSpecifiedBuildArch% GTR 1 (
167 echo Error: more than one build architecture specified, but "all" not specified.
171 if %__BuildArchX64%==1 set __BuildArch=x64
172 if %__BuildArchX86%==1 set __BuildArch=x86
173 if %__BuildArchArm%==1 (
177 if %__BuildArchArm64%==1 (
178 set __BuildArch=arm64
182 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
183 if %__TotalSpecifiedBuildType% GTR 1 (
184 echo Error: more than one build type specified, but "all" not specified.
188 if %__BuildTypeDebug%==1 set __BuildType=Debug
189 if %__BuildTypeChecked%==1 set __BuildType=Checked
190 if %__BuildTypeRelease%==1 set __BuildType=Release
192 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
194 :: Set the remaining variables based upon the determined build configuration
195 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
196 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
197 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
198 set "__PackagesBinDir=%__BinDir%\.nuget"
199 set "__TestRootDir=%__RootBinDir%\tests"
200 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
201 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
202 set "__CrossComponentBinDir=%__BinDir%"
203 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
205 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
206 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
207 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
209 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
210 set "__CMakeBinDir=%__BinDir%"
211 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
213 if not exist "%__BinDir%" md "%__BinDir%"
214 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
215 if not exist "%__LogsDir%" md "%__LogsDir%"
217 REM It is convinient to have your Nuget search path include the location where the build
218 REM will plass packages. However nuget used during the build will fail if that directory
219 REM does not exist. Avoid this in at least one case by agressively creating the directory.
220 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
222 echo %__MsgPrefix%Commencing CoreCLR Repo build
224 :: Set the remaining variables based upon the determined build configuration
226 echo %__MsgPrefix%Checking prerequisites
227 :: Eval the output from probe-win1.ps1
228 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
230 REM =========================================================================================
232 REM === Start the build steps
234 REM =========================================================================================
236 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
237 call "%__VSToolsRoot%\VsDevCmd.bat"
239 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
241 REM =========================================================================================
243 REM === Restore optimization profile data
245 REM =========================================================================================
247 REM Parse the package version out of project.json so that we can pass it on to CMake
249 echo %__MsgPrefix%Error: Python not found on PATH, please make sure that it is installed.
252 set OptDataProjectJsonPath=%__ProjectDir%\src\.nuget\optdata\project.json
253 if EXIST "%OptDataProjectJsonPath%" (
254 for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.PGO.CoreCLR') do @(
255 set __PgoOptDataVersion=%%s
257 for /f "tokens=*" %%s in ('python "%__ProjectDir%\extract-from-json.py" -rf "%OptDataProjectJsonPath%" dependencies optimization.IBC.CoreCLR') do @(
258 set __IbcOptDataVersion=%%s
262 if %__RestoreOptData% EQU 1 (
263 echo %__MsgPrefix%Restoring the OptimizationData Package
264 @call %__ProjectDir%\run.cmd sync -optdata
265 if not !errorlevel! == 0 (
266 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
271 REM =========================================================================================
273 REM === Build the CLR VM
275 REM =========================================================================================
277 if %__BuildNative% EQU 1 (
278 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
280 set nativePlatfromArgs=-platform=%__BuildArch%
281 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
283 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
284 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
285 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
287 if /i "%__BuildArch%" == "arm64" (
288 rem arm64 builds currently use private toolset which has not been released yet
289 REM TODO, remove once the toolset is open.
294 :: Set the environment for the native build
295 set __VCBuildArch=x86_amd64
296 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
297 if /i "%__BuildArch%" == "arm" (
298 set __VCBuildArch=x86_arm
300 REM Make CMake pick the highest installed version in the 10.0.* range
301 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
304 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
305 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
306 @if defined _echo @echo on
308 if not defined VSINSTALLDIR (
309 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
312 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
315 if defined __SkipConfigure goto SkipConfigure
317 echo %__MsgPrefix%Regenerating the Visual Studio solution
319 pushd "%__IntermediatesDir%"
320 set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%"
321 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% "-DBUILD_JIT32=%__BuildJit32%" %__BuildStandaloneGC% !__ExtraCmakeArgs!
322 @if defined _echo @echo on
325 if defined __ConfigureOnly goto SkipNativeBuild
327 if not exist "%__IntermediatesDir%\install.vcxproj" (
328 echo %__MsgPrefix%Error: failed to generate native component build project!
332 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
334 if not !errorlevel! == 0 (
335 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
336 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
337 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
338 echo "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
344 REM =========================================================================================
346 REM === Build Cross-Architecture Native Components (if applicable)
348 REM =========================================================================================
350 if /i "%__BuildArch%"=="arm64" (
351 set __DoCrossArchBuild=1
354 if /i "%__BuildArch%"=="arm" (
355 set __DoCrossArchBuild=1
358 if /i "%__DoCrossArchBuild%"=="1" (
360 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
362 :: Set the environment for the native build
363 set __VCBuildArch=x86_amd64
364 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
365 @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
366 @if defined _echo @echo on
368 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
369 if defined __SkipConfigure goto SkipConfigureCrossBuild
371 pushd "%__CrossCompIntermediatesDir%"
372 set __CMakeBinDir=%__CrossComponentBinDir%
373 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
374 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%"
375 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
376 @if defined _echo @echo on
378 :SkipConfigureCrossBuild
379 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
380 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
384 if defined __ConfigureOnly goto SkipCrossCompBuild
386 echo %__MsgPrefix%Invoking msbuild
388 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
389 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
390 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
391 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
392 if not !errorlevel! == 0 (
393 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
394 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
395 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
396 echo "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
403 REM =========================================================================================
405 REM === CoreLib and NuGet package build section.
407 REM =========================================================================================
409 if %__BuildCoreLib% EQU 1 (
411 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
412 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
415 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
416 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
417 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
419 set __ExtraBuildArgs=
420 if not defined __IbcTuning (
421 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
422 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
425 if /i "%__BuildArch%" == "arm64" (
426 set __nugetBuildArgs=-buildNugetPackage=false
427 ) else if "%__SkipNugetPackage%" == "1" (
428 set __nugetBuildArgs=-buildNugetPackage=false
430 set __nugetBuildArgs=-buildNugetPackage=true
433 set PackageCompatJit=
434 if "%__BuildJit32%" == "1" (
435 set PackageCompatJit=1
437 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
438 if not !errorlevel! == 0 (
439 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
440 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
441 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
442 echo "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
447 REM Need diasymreader.dll on your path for /CreatePdb
448 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
450 if %__BuildNativeCoreLib% EQU 1 (
451 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
453 if "%__CompatJitCrossgen%"=="1" (
454 set COMPlus_UseWindowsX86CoreLegacyJit=1
457 echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
458 "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
459 if NOT !errorlevel! == 0 (
460 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
461 :: Put it in the same log, helpful for Jenkins
462 type %__CrossGenCoreLibLog%
465 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll" >> "%__CrossGenCoreLibLog%" 2>&1
466 if NOT !errorlevel! == 0 (
467 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
468 :: Put it in the same log, helpful for Jenkins
469 type %__CrossGenCoreLibLog%
473 if "%__CompatJitCrossgen%"=="1" (
474 set COMPlus_UseWindowsX86CoreLegacyJit=
478 if %__BuildPackages% EQU 1 (
479 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
481 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
482 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
483 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
485 REM The conditions as to what to build are captured in the builds file.
486 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds %__IsPortableBuild% -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
488 if not !errorlevel! == 0 (
489 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
490 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
491 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
492 echo "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
497 REM =========================================================================================
499 REM === Test build section
501 REM =========================================================================================
503 if %__BuildTests% EQU 1 (
504 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
506 REM Construct the arguments to pass to the test build script.
508 rem arm64 builds currently use private toolset which has not been released yet
509 REM TODO, remove once the toolset is open.
510 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
512 echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
513 @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
515 if not !errorlevel! == 0 (
516 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
521 REM =========================================================================================
523 REM === All builds complete!
525 REM =========================================================================================
527 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
528 echo %__MsgPrefix%Product binaries are available at !__BinDir!
529 if %__BuildTests% EQU 1 (
530 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
534 REM =========================================================================================
536 REM === Handle the "all" case.
538 REM =========================================================================================
544 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
545 if %__TotalSpecifiedBuildArch% EQU 0 (
546 REM Nothing specified means we want to build all architectures.
547 set __BuildArchList=x64 x86 arm arm64
550 REM Otherwise, add all the specified architectures to the list.
552 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
553 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
554 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
555 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
559 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
560 if %__TotalSpecifiedBuildType% EQU 0 (
561 REM Nothing specified means we want to build all build types.
562 set __BuildTypeList=Debug Checked Release
565 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
566 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
567 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
569 REM Create a temporary file to collect build results. We always build all flavors specified, and
570 REM report a summary of the results at the end.
572 set __AllBuildSuccess=true
573 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
574 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
576 for %%i in (%__BuildArchList%) do (
577 for %%j in (%__BuildTypeList%) do (
578 call :BuildOne %%i %%j
582 if %__AllBuildSuccess%==true (
583 echo %__MsgPrefix%All builds succeeded!
586 echo %__MsgPrefix%Builds failed:
587 type %__BuildResultFile%
588 del /f /q %__BuildResultFile%
592 REM This code is unreachable, but leaving it nonetheless, just in case things change.
598 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
599 echo %__MsgPrefix%Invoking: %__NextCmd%
601 if not !errorlevel! == 0 (
602 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
603 set __AllBuildSuccess=false
607 REM =========================================================================================
609 REM === Helper routines
611 REM =========================================================================================
618 echo Build the CoreCLR repo.
621 echo build.cmd [option1] [option2]
623 echo build.cmd all [option1] [option2] -- ...
625 echo All arguments are optional. The options are:
627 echo.-? -h -help: view this message.
628 echo all: Builds all configurations and platforms.
629 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
630 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
631 echo -- ... : all arguments following this tag will be passed directly to msbuild.
632 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
633 echo or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
634 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
636 echo add nativemscorlib to go further and build the native image for designated mscorlib.
637 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
638 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
639 echo ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
640 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
641 echo skipconfigure: skip CMake ^(default: CMake is run^)
642 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
643 echo skipnative: skip building native components ^(default: native components are built^).
644 echo skiptests: skip building tests ^(default: tests are built^).
645 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
646 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
647 echo buildstandalonegc: builds the GC in a standalone mode.
648 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
649 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
650 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
651 echo -sequential: force a non-parallel build ^(default is to build in parallel
652 echo using all processors^).
653 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
654 echo -Rebuild: passes /t:rebuild to the build projects.
655 echo portable : build for portable RID.
657 echo If "all" is specified, then all build architectures and types are built. If, in addition,
658 echo one or more build architectures or types is specified, then only those build architectures
659 echo and types are built.
663 echo -- builds all architectures, and all build types per architecture
665 echo -- builds all build types for x86
666 echo build all x64 x86 Checked Release
667 echo -- builds x64 and x86 architectures, Checked and Release build types for each
671 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
672 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
673 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
674 of the previous version to "%VSINSTALLDIR%" and then build.
675 :: DIA SDK not included in Express editions
676 echo Visual Studio Express does not include the DIA SDK. ^
677 You need Visual Studio 2015 or 2017 (Community is free).
678 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
683 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
685 if /i "%__ToolsetDir%" == "" (
686 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
690 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
691 call "%__ToolsetDir%"\buildenv_arm64.cmd
695 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
696 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
698 %__ToolsetDir%\VC_sdk\inc;^
699 %__ToolsetDir%\sdpublic\sdk\inc;^
700 %__ToolsetDir%\sdpublic\shared\inc;^
701 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
702 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
703 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
704 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
705 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
706 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
707 %__ToolsetDir%\diasdk\include