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=%__ProjectDir%\packages"
86 set "__RootBinDir=%__ProjectDir%\bin"
87 set "__LogsDir=%__RootBinDir%\Logs"
88 set "__PgoOptDataVersion="
89 set "__IbcOptDataVersion="
96 set __BuildArchArm64=0
98 set __BuildTypeDebug=0
99 set __BuildTypeChecked=0
100 set __BuildTypeRelease=0
102 set __PgoInstrument=0
107 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
108 REM when using "all".
109 set __PassThroughArgs=
111 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
114 set __UnprocessedBuildArgs=
121 set __BuildPackages=1
122 set __BuildNativeCoreLib=1
123 set __RestoreOptData=1
126 if "%1" == "" goto ArgsDone
128 if /i "%1" == "-?" goto Usage
129 if /i "%1" == "-h" goto Usage
130 if /i "%1" == "-help" goto Usage
131 if /i "%1" == "--help" goto Usage
134 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 REM TODO these are deprecated remove them eventually
145 REM don't add more, use the - syntax instead
146 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
149 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
152 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
153 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
154 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
156 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
157 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
158 if [!__PassThroughArgs!]==[] (
159 set __PassThroughArgs=%1
161 set __PassThroughArgs=%__PassThroughArgs% %1
164 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)
165 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)
166 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)
167 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)
168 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)
169 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)
170 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)
171 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 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)
178 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
184 REM TODO these are deprecated remove them eventually
185 REM don't add more, use the - syntax instead
186 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)
187 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)
188 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)
189 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)
190 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)
191 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)
192 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)
193 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
194 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
195 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
196 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
197 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
198 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 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)
200 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
206 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
207 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if [!processedArgs!]==[] (
210 set __UnprocessedBuildArgs=%__args%
212 set __UnprocessedBuildArgs=%__args%
213 for %%t in (!processedArgs!) do (
214 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
220 if %__PgoOptimize%==0 set __RestoreOptData=0
222 if defined __BuildAll goto BuildAll
224 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
225 if %__TotalSpecifiedBuildArch% GTR 1 (
226 echo Error: more than one build architecture specified, but "all" not specified.
230 if %__BuildArchX64%==1 set __BuildArch=x64
231 if %__BuildArchX86%==1 set __BuildArch=x86
232 if %__BuildArchArm%==1 (
236 if %__BuildArchArm64%==1 (
237 set __BuildArch=arm64
241 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
242 if %__TotalSpecifiedBuildType% GTR 1 (
243 echo Error: more than one build type specified, but "all" not specified.
247 if %__BuildTypeDebug%==1 set __BuildType=Debug
248 if %__BuildTypeChecked%==1 set __BuildType=Checked
249 if %__BuildTypeRelease%==1 set __BuildType=Release
251 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
253 if %__EnforcePgo%==1 (
254 if %__BuildArchArm%==1 (
255 echo NOTICE: enforcepgo does nothing on arm architecture
257 if %__BuildArchArm64%==1 (
258 echo NOTICE: enforcepgo does nothing on arm64 architecture
262 :: Set the remaining variables based upon the determined build configuration
263 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
264 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
265 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
266 set "__PackagesBinDir=%__BinDir%\.nuget"
267 set "__TestRootDir=%__RootBinDir%\tests"
268 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
269 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
270 set "__CrossComponentBinDir=%__BinDir%"
271 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
274 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
275 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
276 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
278 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
279 set "__CMakeBinDir=%__BinDir%"
280 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
282 if not exist "%__BinDir%" md "%__BinDir%"
283 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
284 if not exist "%__LogsDir%" md "%__LogsDir%"
286 REM It is convenient to have your Nuget search path include the location where the build
287 REM will place packages. However nuget used during the build will fail if that directory
288 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
289 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
291 echo %__MsgPrefix%Commencing CoreCLR Repo build
293 :: Set the remaining variables based upon the determined build configuration
295 echo %__MsgPrefix%Checking prerequisites
296 :: Eval the output from probe-win1.ps1
297 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
299 REM NumberOfEnabledCore is an WMI property providing number of enabled cores on machine
300 REM processor(s) and later is used to set optimal level of CL parallelism during native build step
301 if not defined NumberOfCores (
302 REM Determine number of physical processor cores available on machine
303 for /f "tokens=*" %%I in (
304 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
307 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
309 REM =========================================================================================
311 REM === Start the build steps
313 REM =========================================================================================
315 @if defined _echo @echo on
317 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
319 REM =========================================================================================
321 REM === Restore optimization profile data
323 REM =========================================================================================
325 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
326 echo %__MsgPrefix%Restoring the OptimizationData Package
327 @call %__ProjectDir%\run.cmd sync -optdata
328 if not !errorlevel! == 0 (
329 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
334 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
335 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
336 if not exist "%DotNetCli%" (
337 echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
340 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
341 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
342 set __PgoOptDataVersion=%%s
344 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
345 set __IbcOptDataVersion=%%s
348 REM =========================================================================================
350 REM === Build the CLR VM
352 REM =========================================================================================
354 if %__BuildNative% EQU 1 (
355 REM Scope environment changes start {
358 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
360 set __NativePlatformArgs=-platform=%__BuildArch%
361 if not "%__ToolsetDir%" == "" ( set __NativePlatformArgs=-useEnv )
363 if not "%__ToolsetDir%" == "" (
364 rem arm64 builds currently use private toolset which has not been released yet
365 REM TODO, remove once the toolset is open.
370 :: Set the environment for the native build
371 set __VCBuildArch=x86_amd64
372 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
373 if /i "%__BuildArch%" == "arm" (
374 set __VCBuildArch=x86_arm
376 REM Make CMake pick the highest installed version in the 10.0.* range
377 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
379 if /i "%__BuildArch%" == "arm64" (
380 set __VCBuildArch=x86_arm64
382 REM Make CMake pick the highest installed version in the 10.0.* range
383 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
386 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
387 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
388 @if defined _echo @echo on
390 if not defined VSINSTALLDIR (
391 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
394 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
397 if defined __SkipConfigure goto SkipConfigure
399 echo %__MsgPrefix%Regenerating the Visual Studio solution
401 pushd "%__IntermediatesDir%"
402 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%"
403 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
404 @if defined _echo @echo on
408 if defined __ConfigureOnly goto SkipNativeBuild
410 if not exist "%__IntermediatesDir%\install.vcxproj" (
411 echo %__MsgPrefix%Error: failed to generate native component build project!
415 set __BuildLogRootName=CoreCLR
416 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
417 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
418 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
419 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
420 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
421 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
423 @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%
425 if not !errorlevel! == 0 (
426 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
434 REM } Scope environment changes end
438 REM =========================================================================================
440 REM === Build Cross-Architecture Native Components (if applicable)
442 REM =========================================================================================
444 if /i "%__BuildArch%"=="arm64" (
445 set __DoCrossArchBuild=1
448 if /i "%__BuildArch%"=="arm" (
449 set __DoCrossArchBuild=1
452 if /i "%__DoCrossArchBuild%"=="1" (
453 REM Scope environment changes start {
456 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
458 :: Set the environment for the native build
459 set __VCBuildArch=x86_amd64
460 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
462 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
463 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
464 @if defined _echo @echo on
466 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
467 if defined __SkipConfigure goto SkipConfigureCrossBuild
469 pushd "%__CrossCompIntermediatesDir%"
470 set __CMakeBinDir=%__CrossComponentBinDir%
471 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
472 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"
473 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
474 @if defined _echo @echo on
477 :SkipConfigureCrossBuild
478 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
479 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
483 if defined __ConfigureOnly goto SkipCrossCompBuild
485 set __BuildLogRootName=Cross
486 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
487 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
488 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
489 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
490 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
491 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
493 @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%
495 if not !errorlevel! == 0 (
496 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
504 REM } Scope environment changes end
508 REM =========================================================================================
510 REM === CoreLib and NuGet package build section.
512 REM =========================================================================================
514 if %__BuildCoreLib% EQU 1 (
515 REM Scope environment changes start {
518 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
519 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
522 set __ExtraBuildArgs=
523 if not defined __IbcTuning (
524 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
525 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
528 if "%__BuildSOS%" == "0" (
529 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
532 if /i "%__BuildArch%" == "arm64" (
533 set __nugetBuildArgs=-buildNugetPackage=false
534 ) else if "%__SkipNugetPackage%" == "1" (
535 set __nugetBuildArgs=-buildNugetPackage=false
537 set __nugetBuildArgs=-buildNugetPackage=true
540 set __BuildLogRootName=System.Private.CoreLib
541 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
542 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
543 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
544 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
545 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
546 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
548 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
550 if not !errorlevel! == 0 (
551 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
558 REM } Scope environment changes end
562 REM Scope environment changes start {
565 REM Need diasymreader.dll on your path for /CreatePdb
566 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
568 if %__BuildNativeCoreLib% EQU 1 (
569 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
571 REM Need VS native tools environment for the **target** arch when running instrumented binaries
572 if %__PgoInstrument% EQU 1 (
573 set __VCExecArch=%__BuildArch%
574 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
575 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
576 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
577 @if defined _echo @echo on
578 if NOT !errorlevel! == 0 (
579 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
583 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
585 for /f "tokens=*" %%f in ('where pgort*.dll') do (
586 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
588 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
589 copy /y "!__PgoRtPath!" "%__BinDir%" || (
590 echo %__MsgPrefix%Error: copy failed
596 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
597 echo %__MsgPrefix%!NEXTCMD!
598 !NEXTCMD! > "%__CrossGenCoreLibLog%" 2>&1
599 if NOT !errorlevel! == 0 (
600 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
601 :: Put it in the same log, helpful for Jenkins
602 type %__CrossGenCoreLibLog%
606 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
607 echo %__MsgPrefix%!NEXTCMD!
608 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
609 if NOT !errorlevel! == 0 (
610 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
611 :: Put it in the same log, helpful for Jenkins
612 type %__CrossGenCoreLibLog%
617 REM } Scope environment changes end
621 if %__BuildPackages% EQU 1 (
622 REM Scope environment changes start {
625 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
627 set __BuildLogRootName=Nuget
628 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
629 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
630 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
631 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
632 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
633 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
635 REM The conditions as to what to build are captured in the builds file.
636 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
638 if not !errorlevel! == 0 (
639 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
646 REM } Scope environment changes end
650 REM =========================================================================================
652 REM === Test build section
654 REM =========================================================================================
656 if %__BuildTests% EQU 1 (
657 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
659 REM Construct the arguments to pass to the test build script.
661 rem arm64 builds currently use private toolset which has not been released yet
662 REM TODO, remove once the toolset is open.
663 if not "%__ToolsetDir%" == "" call :PrivateToolSet
665 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
666 echo %__MsgPrefix%!NEXTCMD!
669 if not !errorlevel! == 0 (
670 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
675 REM =========================================================================================
677 REM === All builds complete!
679 REM =========================================================================================
681 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
682 echo %__MsgPrefix%Product binaries are available at !__BinDir!
683 if %__BuildTests% EQU 1 (
684 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
688 REM =========================================================================================
690 REM === Handle the "all" case.
692 REM =========================================================================================
698 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
699 if %__TotalSpecifiedBuildArch% EQU 0 (
700 REM Nothing specified means we want to build all architectures.
701 set __BuildArchList=x64 x86 arm arm64
704 REM Otherwise, add all the specified architectures to the list.
706 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
707 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
708 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
709 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
713 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
714 if %__TotalSpecifiedBuildType% EQU 0 (
715 REM Nothing specified means we want to build all build types.
716 set __BuildTypeList=Debug Checked Release
719 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
720 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
721 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
723 REM Create a temporary file to collect build results. We always build all flavors specified, and
724 REM report a summary of the results at the end.
726 set __AllBuildSuccess=true
727 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
728 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
730 for %%i in (%__BuildArchList%) do (
731 for %%j in (%__BuildTypeList%) do (
732 call :BuildOne %%i %%j
736 if %__AllBuildSuccess%==true (
737 echo %__MsgPrefix%All builds succeeded!
740 echo %__MsgPrefix%Builds failed:
741 type %__BuildResultFile%
742 del /f /q %__BuildResultFile%
746 REM This code is unreachable, but leaving it nonetheless, just in case things change.
752 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
753 echo %__MsgPrefix%Invoking: %__NextCmd%
755 if not !errorlevel! == 0 (
756 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
757 set __AllBuildSuccess=false
761 REM =========================================================================================
763 REM === Helper routines
765 REM =========================================================================================
772 echo Build the CoreCLR repo.
775 echo build.cmd [option1] [option2]
777 echo build.cmd all [option1] [option2] -- ...
779 echo All arguments are optional. The options are:
781 echo.-? -h -help --help: view this message.
782 echo -all: Builds all configurations and platforms.
783 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
784 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
785 echo -- ... : all arguments following this tag will be passed directly to msbuild.
786 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
787 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
788 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
790 echo add nativemscorlib to go further and build the native image for designated mscorlib.
791 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
792 echo -nopgooptimize: do not use profile guided optimizations.
793 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
794 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
795 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
796 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
797 echo -skipconfigure: skip CMake ^(default: CMake is run^)
798 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
799 echo -skipnative: skip building native components ^(default: native components are built^).
800 echo -skiptests: skip building tests ^(default: tests are built^).
801 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
802 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
803 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
804 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
805 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
806 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
807 echo -Rebuild: passes /t:rebuild to the build projects.
808 echo portable : build for portable RID.
810 echo If "all" is specified, then all build architectures and types are built. If, in addition,
811 echo one or more build architectures or types is specified, then only those build architectures
812 echo and types are built.
816 echo -- builds all architectures, and all build types per architecture
818 echo -- builds all build types for x86
819 echo build -all -x64 -x86 -Checked -Release
820 echo -- builds x64 and x86 architectures, Checked and Release build types for each
824 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
825 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
826 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
827 of the previous version to "%VSINSTALLDIR%" and then build.
828 :: DIA SDK not included in Express editions
829 echo Visual Studio Express does not include the DIA SDK. ^
830 You need Visual Studio 2015 or 2017 (Community is free).
831 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
836 echo %__MsgPrefix%Setting up the usage of __ToolsetDir:%__ToolsetDir%
838 if /i "%__ToolsetDir%" == "" (
839 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
843 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
844 call "%__ToolsetDir%"\buildenv_arm64.cmd
848 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
849 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
851 %__ToolsetDir%\VC_sdk\inc;^
852 %__ToolsetDir%\sdpublic\sdk\inc;^
853 %__ToolsetDir%\sdpublic\shared\inc;^
854 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
855 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
856 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
857 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
858 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
859 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
860 %__ToolsetDir%\diasdk\include