1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
4 :: Define a prefix for most output progress messages that come from this script. That makes
5 :: it easier to see where these are coming from. Note that there is a trailing space here.
6 set "__MsgPrefix=BUILD: "
8 echo %__MsgPrefix%Starting Build at %TIME%
9 set __ThisScriptFull="%~f0"
10 set __ThisScriptDir="%~dp0"
12 :: Default to highest Visual Studio version available
14 :: For VS2015 (and prior), only a single instance is allowed to be installed on a box
15 :: and VS140COMNTOOLS is set as a global environment variable by the installer. This
16 :: allows users to locate where the instance of VS2015 is installed.
18 :: For VS2017, multiple instances can be installed on the same box SxS and VS150COMNTOOLS
19 :: is no longer set as a global environment variable and is instead only set if the user
20 :: has launched the VS2017 Developer Command Prompt.
22 :: Following this logic, we will default to the VS2017 toolset if VS150COMNTOOLS tools is
23 :: set, as this indicates the user is running from the VS2017 Developer Command Prompt and
24 :: is already configured to use that toolset. Otherwise, we will fallback to using the VS2015
25 :: toolset if it is installed. Finally, we will fail the script if no supported VS instance
28 if defined VisualStudioVersion (
29 if not defined __VSVersion echo %__MsgPrefix%Detected Visual Studio %VisualStudioVersion% developer command ^prompt environment
33 echo %__MsgPrefix%"Searching for Visual Studio 2017 or 2015 installation"
34 set _VSWHERE="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
36 for /f "usebackq tokens=*" %%i in (`%_VSWHERE% -latest -prerelease -property installationPath`) do set _VSCOMNTOOLS=%%i\Common7\Tools
38 if not exist "%_VSCOMNTOOLS%" set _VSCOMNTOOLS=%VS140COMNTOOLS%
39 if not exist "%_VSCOMNTOOLS%" (
40 echo %__MsgPrefix%Error: Visual Studio 2015 or 2017 required.
41 echo Please see https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/developer-guide.md for build instructions.
45 call "%_VSCOMNTOOLS%\VsDevCmd.bat"
49 if defined VS150COMNTOOLS (
50 set "__VSToolsRoot=%VS150COMNTOOLS%"
51 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
52 set __VSVersion=vs2017
54 set "__VSToolsRoot=%VS140COMNTOOLS%"
55 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
56 set __VSVersion=vs2015
59 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
60 :: __BuildArch -- default: x64
61 :: __BuildType -- default: Debug
62 :: __BuildOS -- default: Windows_NT
63 :: __ProjectDir -- default: directory of the dir.props file
64 :: __SourceDir -- default: %__ProjectDir%\src\
65 :: __PackagesDir -- default: %__ProjectDir%\packages\
66 :: __RootBinDir -- default: %__ProjectDir%\bin\
67 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
69 :: __PackagesBinDir -- default: %__BinDir%\.nuget
70 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
72 :: Thus, these variables are not simply internal to this script!
74 :: Set the default arguments for build
77 set __BuildOS=Windows_NT
79 :: Set the various build properties here so that CMake and MSBuild can pick them up
80 set "__ProjectDir=%~dp0"
81 :: remove trailing slash
82 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
83 set "__ProjectFilesDir=%__ProjectDir%"
84 set "__SourceDir=%__ProjectDir%\src"
85 set "__PackagesDir=%DotNetRestorePackagesPath%"
86 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\packages"
87 set "__RootBinDir=%__ProjectDir%\bin"
88 set "__LogsDir=%__RootBinDir%\Logs"
89 set "__PgoOptDataVersion="
90 set "__IbcOptDataVersion="
97 set __BuildArchArm64=0
99 set __BuildTypeDebug=0
100 set __BuildTypeChecked=0
101 set __BuildTypeRelease=0
103 set __PgoInstrument=0
108 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
109 REM when using "all".
110 set __PassThroughArgs=
112 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
115 set __UnprocessedBuildArgs=
122 set __BuildPackages=1
123 set __BuildNativeCoreLib=1
124 set __RestoreOptData=1
127 if "%1" == "" goto ArgsDone
129 if /i "%1" == "-?" goto Usage
130 if /i "%1" == "-h" goto Usage
131 if /i "%1" == "-help" goto Usage
132 if /i "%1" == "--help" goto Usage
135 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 REM TODO these are deprecated remove them eventually
146 REM don't add more, use the - syntax instead
147 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
149 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
151 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
153 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
154 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
155 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
157 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
158 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
159 if [!__PassThroughArgs!]==[] (
160 set __PassThroughArgs=%1
162 set __PassThroughArgs=%__PassThroughArgs% %1
165 if /i "%1" == "-freebsdmscorlib" (set __BuildSOS=0&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)
166 if /i "%1" == "-linuxmscorlib" (set __BuildSOS=0&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)
167 if /i "%1" == "-netbsdmscorlib" (set __BuildSOS=0&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)
168 if /i "%1" == "-osxmscorlib" (set __BuildSOS=0&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)
169 if /i "%1" == "-windowsmscorlib" (set __BuildSOS=0&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)
170 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)
171 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)
172 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 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)
179 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
185 REM TODO these are deprecated remove them eventually
186 REM don't add more, use the - syntax instead
187 if /i "%1" == "freebsdmscorlib" (set __BuildSOS=0&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)
188 if /i "%1" == "linuxmscorlib" (set __BuildSOS=0&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)
189 if /i "%1" == "netbsdmscorlib" (set __BuildSOS=0&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)
190 if /i "%1" == "osxmscorlib" (set __BuildSOS=0&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)
191 if /i "%1" == "windowsmscorlib" (set __BuildSOS=0&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)
192 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)
193 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)
194 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
195 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
196 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
197 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
198 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 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)
201 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
207 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
208 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if [!processedArgs!]==[] (
211 set __UnprocessedBuildArgs=%__args%
213 set __UnprocessedBuildArgs=%__args%
214 for %%t in (!processedArgs!) do (
215 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
221 if %__PgoOptimize%==0 set __RestoreOptData=0
223 if defined __BuildAll goto BuildAll
225 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
226 if %__TotalSpecifiedBuildArch% GTR 1 (
227 echo Error: more than one build architecture specified, but "all" not specified.
231 if %__BuildArchX64%==1 set __BuildArch=x64
232 if %__BuildArchX86%==1 set __BuildArch=x86
233 if %__BuildArchArm%==1 (
237 if %__BuildArchArm64%==1 (
238 set __BuildArch=arm64
242 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
243 if %__TotalSpecifiedBuildType% GTR 1 (
244 echo Error: more than one build type specified, but "all" not specified.
248 if %__BuildTypeDebug%==1 set __BuildType=Debug
249 if %__BuildTypeChecked%==1 set __BuildType=Checked
250 if %__BuildTypeRelease%==1 set __BuildType=Release
252 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
254 if %__EnforcePgo%==1 (
255 if %__BuildArchArm%==1 (
256 echo NOTICE: enforcepgo does nothing on arm architecture
258 if %__BuildArchArm64%==1 (
259 echo NOTICE: enforcepgo does nothing on arm64 architecture
263 :: Set the remaining variables based upon the determined build configuration
264 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
265 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
266 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
267 set "__PackagesBinDir=%__BinDir%\.nuget"
268 set "__TestRootDir=%__RootBinDir%\tests"
269 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
270 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
271 set "__CrossComponentBinDir=%__BinDir%"
272 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
275 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
276 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
277 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
279 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
280 set "__CMakeBinDir=%__BinDir%"
281 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
283 if not exist "%__BinDir%" md "%__BinDir%"
284 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
285 if not exist "%__LogsDir%" md "%__LogsDir%"
287 REM It is convenient to have your Nuget search path include the location where the build
288 REM will place packages. However nuget used during the build will fail if that directory
289 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
290 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
292 echo %__MsgPrefix%Commencing CoreCLR Repo build
294 :: Set the remaining variables based upon the determined build configuration
296 echo %__MsgPrefix%Checking prerequisites
297 :: Eval the output from probe-win1.ps1
298 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
300 REM NumberOfEnabledCore is an WMI property providing number of enabled cores on machine
301 REM processor(s) and later is used to set optimal level of CL parallelism during native build step
302 if not defined NumberOfCores (
303 REM Determine number of physical processor cores available on machine
304 for /f "tokens=*" %%I in (
305 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
308 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
310 REM =========================================================================================
312 REM === Start the build steps
314 REM =========================================================================================
316 @if defined _echo @echo on
318 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
320 REM =========================================================================================
322 REM === Restore optimization profile data
324 REM =========================================================================================
326 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
327 echo %__MsgPrefix%Restoring the OptimizationData Package
328 @call %__ProjectDir%\run.cmd sync -optdata
329 if not !errorlevel! == 0 (
330 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
335 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
336 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
337 if not exist "%DotNetCli%" (
338 echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
341 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
342 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
343 set __PgoOptDataVersion=%%s
345 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
346 set __IbcOptDataVersion=%%s
349 REM =========================================================================================
351 REM === Build the CLR VM
353 REM =========================================================================================
355 if %__BuildNative% EQU 1 (
356 REM Scope environment changes start {
359 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
361 set __NativePlatformArgs=-platform=%__BuildArch%
362 if not "%__ToolsetDir%" == "" ( set __NativePlatformArgs=-useEnv )
364 if not "%__ToolsetDir%" == "" (
365 rem arm64 builds currently use private toolset which has not been released yet
366 REM TODO, remove once the toolset is open.
371 :: Set the environment for the native build
372 set __VCBuildArch=x86_amd64
373 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
374 if /i "%__BuildArch%" == "arm" (
375 set __VCBuildArch=x86_arm
377 REM Make CMake pick the highest installed version in the 10.0.* range
378 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
380 if /i "%__BuildArch%" == "arm64" (
381 set __VCBuildArch=x86_arm64
383 REM Make CMake pick the highest installed version in the 10.0.* range
384 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
387 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
388 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
389 @if defined _echo @echo on
391 if not defined VSINSTALLDIR (
392 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
395 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
398 if defined __SkipConfigure goto SkipConfigure
400 echo %__MsgPrefix%Regenerating the Visual Studio solution
402 pushd "%__IntermediatesDir%"
403 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%"
404 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
405 @if defined _echo @echo on
409 if defined __ConfigureOnly goto SkipNativeBuild
411 if not exist "%__IntermediatesDir%\install.vcxproj" (
412 echo %__MsgPrefix%Error: failed to generate native component build project!
416 set __BuildLogRootName=CoreCLR
417 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
418 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
419 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
420 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
421 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
422 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
424 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %__NativePlatformArgs% %__RunArgs% -ExtraParameters="/p:ForceImportBeforeCppTargets=%__ProjectDir%/clr.nativebuild.props /m:2" %__UnprocessedBuildArgs%
426 if not !errorlevel! == 0 (
427 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
435 REM } Scope environment changes end
439 REM =========================================================================================
441 REM === Build Cross-Architecture Native Components (if applicable)
443 REM =========================================================================================
445 if /i "%__BuildArch%"=="arm64" (
446 set __DoCrossArchBuild=1
449 if /i "%__BuildArch%"=="arm" (
450 set __DoCrossArchBuild=1
453 if /i "%__DoCrossArchBuild%"=="1" (
454 REM Scope environment changes start {
457 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
459 :: Set the environment for the native build
460 set __VCBuildArch=x86_amd64
461 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
463 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
464 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
465 @if defined _echo @echo on
467 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
468 if defined __SkipConfigure goto SkipConfigureCrossBuild
470 pushd "%__CrossCompIntermediatesDir%"
471 set __CMakeBinDir=%__CrossComponentBinDir%
472 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
473 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%" "-DCMAKE_SYSTEM_VERSION=10.0"
474 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
475 @if defined _echo @echo on
478 :SkipConfigureCrossBuild
479 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
480 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
484 if defined __ConfigureOnly goto SkipCrossCompBuild
486 set __BuildLogRootName=Cross
487 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
488 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
489 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
490 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
491 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
492 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
494 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% -ExtraParameters="/p:ForceImportBeforeCppTargets=%__ProjectDir%/clr.nativebuild.props /m:2" %__UnprocessedBuildArgs%
496 if not !errorlevel! == 0 (
497 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
505 REM } Scope environment changes end
509 REM =========================================================================================
511 REM === CoreLib and NuGet package build section.
513 REM =========================================================================================
515 if %__BuildCoreLib% EQU 1 (
516 REM Scope environment changes start {
519 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
520 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
523 set __ExtraBuildArgs=
524 if not defined __IbcTuning (
525 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
526 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
529 if "%__BuildSOS%" == "0" (
530 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
533 if /i "%__BuildArch%" == "arm64" (
534 set __nugetBuildArgs=-buildNugetPackage=false
535 ) else if "%__SkipNugetPackage%" == "1" (
536 set __nugetBuildArgs=-buildNugetPackage=false
538 set __nugetBuildArgs=-buildNugetPackage=true
541 set __BuildLogRootName=System.Private.CoreLib
542 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
543 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
544 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
545 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
546 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
547 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
549 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
551 if not !errorlevel! == 0 (
552 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
559 REM } Scope environment changes end
563 REM Scope environment changes start {
566 REM Need diasymreader.dll on your path for /CreatePdb
567 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
569 if %__BuildNativeCoreLib% EQU 1 (
570 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
572 REM Need VS native tools environment for the **target** arch when running instrumented binaries
573 if %__PgoInstrument% EQU 1 (
574 set __VCExecArch=%__BuildArch%
575 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
576 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
577 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
578 @if defined _echo @echo on
579 if NOT !errorlevel! == 0 (
580 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
584 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
586 for /f "tokens=*" %%f in ('where pgort*.dll') do (
587 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
589 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
590 copy /y "!__PgoRtPath!" "%__BinDir%" || (
591 echo %__MsgPrefix%Error: copy failed
597 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
598 echo %__MsgPrefix%!NEXTCMD!
599 !NEXTCMD! > "%__CrossGenCoreLibLog%" 2>&1
600 if NOT !errorlevel! == 0 (
601 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
602 :: Put it in the same log, helpful for Jenkins
603 type %__CrossGenCoreLibLog%
607 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
608 echo %__MsgPrefix%!NEXTCMD!
609 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
610 if NOT !errorlevel! == 0 (
611 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
612 :: Put it in the same log, helpful for Jenkins
613 type %__CrossGenCoreLibLog%
618 REM } Scope environment changes end
622 if %__BuildPackages% EQU 1 (
623 REM Scope environment changes start {
626 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
628 set __BuildLogRootName=Nuget
629 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
630 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
631 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
632 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
633 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
634 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
636 REM The conditions as to what to build are captured in the builds file.
637 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
639 if not !errorlevel! == 0 (
640 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
647 REM } Scope environment changes end
651 REM =========================================================================================
653 REM === Test build section
655 REM =========================================================================================
657 if %__BuildTests% EQU 1 (
658 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
660 REM Construct the arguments to pass to the test build script.
662 rem arm64 builds currently use private toolset which has not been released yet
663 REM TODO, remove once the toolset is open.
664 if not "%__ToolsetDir%" == "" call :PrivateToolSet
666 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
667 echo %__MsgPrefix%!NEXTCMD!
670 if not !errorlevel! == 0 (
671 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
676 REM =========================================================================================
678 REM === All builds complete!
680 REM =========================================================================================
682 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
683 echo %__MsgPrefix%Product binaries are available at !__BinDir!
684 if %__BuildTests% EQU 1 (
685 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
689 REM =========================================================================================
691 REM === Handle the "all" case.
693 REM =========================================================================================
699 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
700 if %__TotalSpecifiedBuildArch% EQU 0 (
701 REM Nothing specified means we want to build all architectures.
702 set __BuildArchList=x64 x86 arm arm64
705 REM Otherwise, add all the specified architectures to the list.
707 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
708 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
709 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
710 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
714 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
715 if %__TotalSpecifiedBuildType% EQU 0 (
716 REM Nothing specified means we want to build all build types.
717 set __BuildTypeList=Debug Checked Release
720 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
721 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
722 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
724 REM Create a temporary file to collect build results. We always build all flavors specified, and
725 REM report a summary of the results at the end.
727 set __AllBuildSuccess=true
728 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
729 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
731 for %%i in (%__BuildArchList%) do (
732 for %%j in (%__BuildTypeList%) do (
733 call :BuildOne %%i %%j
737 if %__AllBuildSuccess%==true (
738 echo %__MsgPrefix%All builds succeeded!
741 echo %__MsgPrefix%Builds failed:
742 type %__BuildResultFile%
743 del /f /q %__BuildResultFile%
747 REM This code is unreachable, but leaving it nonetheless, just in case things change.
753 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
754 echo %__MsgPrefix%Invoking: %__NextCmd%
756 if not !errorlevel! == 0 (
757 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
758 set __AllBuildSuccess=false
762 REM =========================================================================================
764 REM === Helper routines
766 REM =========================================================================================
773 echo Build the CoreCLR repo.
776 echo build.cmd [option1] [option2]
778 echo build.cmd all [option1] [option2] -- ...
780 echo All arguments are optional. The options are:
782 echo.-? -h -help --help: view this message.
783 echo -all: Builds all configurations and platforms.
784 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
785 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
786 echo -- ... : all arguments following this tag will be passed directly to msbuild.
787 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
788 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
789 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
791 echo add nativemscorlib to go further and build the native image for designated mscorlib.
792 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
793 echo -nopgooptimize: do not use profile guided optimizations.
794 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
795 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
796 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
797 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
798 echo -skipconfigure: skip CMake ^(default: CMake is run^)
799 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
800 echo -skipnative: skip building native components ^(default: native components are built^).
801 echo -skiptests: skip building tests ^(default: tests are built^).
802 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
803 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
804 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
805 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
806 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
807 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
808 echo -Rebuild: passes /t:rebuild to the build projects.
809 echo portable : build for portable RID.
811 echo If "all" is specified, then all build architectures and types are built. If, in addition,
812 echo one or more build architectures or types is specified, then only those build architectures
813 echo and types are built.
817 echo -- builds all architectures, and all build types per architecture
819 echo -- builds all build types for x86
820 echo build -all -x64 -x86 -Checked -Release
821 echo -- builds x64 and x86 architectures, Checked and Release build types for each
825 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
826 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
827 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
828 of the previous version to "%VSINSTALLDIR%" and then build.
829 :: DIA SDK not included in Express editions
830 echo Visual Studio Express does not include the DIA SDK. ^
831 You need Visual Studio 2015 or 2017 (Community is free).
832 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
837 echo %__MsgPrefix%Setting up the usage of __ToolsetDir:%__ToolsetDir%
839 if /i "%__ToolsetDir%" == "" (
840 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
844 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
845 call "%__ToolsetDir%"\buildenv_arm64.cmd
849 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
850 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
852 %__ToolsetDir%\VC_sdk\inc;^
853 %__ToolsetDir%\sdpublic\sdk\inc;^
854 %__ToolsetDir%\sdpublic\shared\inc;^
855 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
856 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
857 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
858 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
859 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
860 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
861 %__ToolsetDir%\diasdk\include