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
126 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
128 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
129 @REM and allow the "-priority=1" syntax.
133 if "%1" == "" goto ArgsDone
135 if /i "%1" == "-?" goto Usage
136 if /i "%1" == "-h" goto Usage
137 if /i "%1" == "-help" goto Usage
138 if /i "%1" == "--help" goto Usage
141 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
142 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
149 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
151 REM TODO these are deprecated remove them eventually
152 REM don't add more, use the - syntax instead
153 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
154 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
155 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
156 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
157 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
159 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
160 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
161 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
163 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
165 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
166 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
167 if [!__PassThroughArgs!]==[] (
168 set __PassThroughArgs=%1
170 set __PassThroughArgs=%__PassThroughArgs% %1
173 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)
174 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)
175 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)
176 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)
177 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)
178 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)
179 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)
180 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
184 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
185 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 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)
187 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
189 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
193 REM TODO these are deprecated remove them eventually
194 REM don't add more, use the - syntax instead
195 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)
196 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)
197 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)
198 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)
199 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)
200 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)
201 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)
202 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 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)
209 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
210 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
211 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
212 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
213 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
215 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
216 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
218 if [!processedArgs!]==[] (
219 set __UnprocessedBuildArgs=%__args%
221 set __UnprocessedBuildArgs=%__args%
222 for %%t in (!processedArgs!) do (
223 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
229 @REM Special handling for -priority=N argument.
230 if defined __Priority (
231 if defined __PassThroughArgs (
232 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
234 set __PassThroughArgs=-priority=%__Priority%
236 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
239 if %__PgoOptimize%==0 set __RestoreOptData=0
241 if defined __BuildAll goto BuildAll
243 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
244 if %__TotalSpecifiedBuildArch% GTR 1 (
245 echo Error: more than one build architecture specified, but "all" not specified.
249 if %__BuildArchX64%==1 set __BuildArch=x64
250 if %__BuildArchX86%==1 set __BuildArch=x86
251 if %__BuildArchArm%==1 (
255 if %__BuildArchArm64%==1 (
256 set __BuildArch=arm64
260 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
261 if %__TotalSpecifiedBuildType% GTR 1 (
262 echo Error: more than one build type specified, but "all" not specified.
266 if %__BuildTypeDebug%==1 set __BuildType=Debug
267 if %__BuildTypeChecked%==1 set __BuildType=Checked
268 if %__BuildTypeRelease%==1 set __BuildType=Release
270 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
272 if %__EnforcePgo%==1 (
273 if %__BuildArchArm%==1 (
274 echo NOTICE: enforcepgo does nothing on arm architecture
276 if %__BuildArchArm64%==1 (
277 echo NOTICE: enforcepgo does nothing on arm64 architecture
281 :: Set the remaining variables based upon the determined build configuration
282 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
283 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
284 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
285 set "__PackagesBinDir=%__BinDir%\.nuget"
286 set "__TestRootDir=%__RootBinDir%\tests"
287 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
288 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
289 set "__CrossComponentBinDir=%__BinDir%"
290 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
293 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
294 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
295 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
297 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
298 set "__CMakeBinDir=%__BinDir%"
299 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
301 if not exist "%__BinDir%" md "%__BinDir%"
302 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
303 if not exist "%__LogsDir%" md "%__LogsDir%"
305 REM It is convenient to have your Nuget search path include the location where the build
306 REM will place packages. However nuget used during the build will fail if that directory
307 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
308 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
310 echo %__MsgPrefix%Commencing CoreCLR Repo build
312 :: Set the remaining variables based upon the determined build configuration
314 echo %__MsgPrefix%Checking prerequisites
315 :: Eval the output from probe-win1.ps1
316 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
318 REM NumberOfCores is an WMI property providing number of physical cores on machine
319 REM processor(s). It is used to set optimal level of CL parallelism during native build step
320 if not defined NumberOfCores (
321 REM Determine number of physical processor cores available on machine
322 for /f "tokens=*" %%I in (
323 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
326 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
328 REM =========================================================================================
330 REM === Start the build steps
332 REM =========================================================================================
334 @if defined _echo @echo on
336 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
338 REM =========================================================================================
340 REM === Restore optimization profile data
342 REM =========================================================================================
344 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
345 echo %__MsgPrefix%Restoring the OptimizationData Package
346 @call %__ProjectDir%\run.cmd sync -optdata
347 if not !errorlevel! == 0 (
348 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
353 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
354 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
355 if not exist "%DotNetCli%" (
356 echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
359 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
360 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
361 set __PgoOptDataVersion=%%s
363 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
364 set __IbcOptDataVersion=%%s
367 REM =========================================================================================
369 REM === Build the CLR VM
371 REM =========================================================================================
373 if %__BuildNative% EQU 1 (
374 REM Scope environment changes start {
377 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
379 set __NativePlatformArgs=-platform=%__BuildArch%
380 if not "%__ToolsetDir%" == "" ( set __NativePlatformArgs=-useEnv )
382 if not "%__ToolsetDir%" == "" (
383 rem arm64 builds currently use private toolset which has not been released yet
384 REM TODO, remove once the toolset is open.
389 :: Set the environment for the native build
390 set __VCBuildArch=x86_amd64
391 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
392 if /i "%__BuildArch%" == "arm" (
393 set __VCBuildArch=x86_arm
395 REM Make CMake pick the highest installed version in the 10.0.* range
396 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
398 if /i "%__BuildArch%" == "arm64" (
399 set __VCBuildArch=x86_arm64
401 REM Make CMake pick the highest installed version in the 10.0.* range
402 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
405 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
406 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
407 @if defined _echo @echo on
409 if not defined VSINSTALLDIR (
410 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
413 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
416 if defined __SkipConfigure goto SkipConfigure
418 echo %__MsgPrefix%Regenerating the Visual Studio solution
420 pushd "%__IntermediatesDir%"
421 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%"
422 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
423 @if defined _echo @echo on
427 if defined __ConfigureOnly goto SkipNativeBuild
429 if not exist "%__IntermediatesDir%\install.vcxproj" (
430 echo %__MsgPrefix%Error: failed to generate native component build project!
434 set __BuildLogRootName=CoreCLR
435 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
436 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
437 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
438 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
439 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
440 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
442 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %__NativePlatformArgs% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
444 if not !errorlevel! == 0 (
445 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
453 REM } Scope environment changes end
457 REM =========================================================================================
459 REM === Build Cross-Architecture Native Components (if applicable)
461 REM =========================================================================================
463 if /i "%__BuildArch%"=="arm64" (
464 set __DoCrossArchBuild=1
467 if /i "%__BuildArch%"=="arm" (
468 set __DoCrossArchBuild=1
471 if /i "%__DoCrossArchBuild%"=="1" (
472 REM Scope environment changes start {
475 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
477 :: Set the environment for the native build
478 set __VCBuildArch=x86_amd64
479 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
481 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
482 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
483 @if defined _echo @echo on
485 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
486 if defined __SkipConfigure goto SkipConfigureCrossBuild
488 pushd "%__CrossCompIntermediatesDir%"
489 set __CMakeBinDir=%__CrossComponentBinDir%
490 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
491 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"
492 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
493 @if defined _echo @echo on
496 :SkipConfigureCrossBuild
497 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
498 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
502 if defined __ConfigureOnly goto SkipCrossCompBuild
504 set __BuildLogRootName=Cross
505 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
506 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
507 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
508 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
509 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
510 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
512 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
514 if not !errorlevel! == 0 (
515 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
523 REM } Scope environment changes end
527 REM =========================================================================================
529 REM === CoreLib and NuGet package build section.
531 REM =========================================================================================
533 if %__BuildCoreLib% EQU 1 (
534 REM Scope environment changes start {
537 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
538 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
541 set __ExtraBuildArgs=
542 if not defined __IbcTuning (
543 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
544 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
547 if "%__BuildSOS%" == "0" (
548 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
551 if /i "%__BuildArch%" == "arm64" (
552 set __nugetBuildArgs=-buildNugetPackage=false
553 ) else if "%__SkipNugetPackage%" == "1" (
554 set __nugetBuildArgs=-buildNugetPackage=false
556 set __nugetBuildArgs=-buildNugetPackage=true
559 set __BuildLogRootName=System.Private.CoreLib
560 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
561 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
562 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
563 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
564 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
565 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
567 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
569 if not !errorlevel! == 0 (
570 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
577 REM } Scope environment changes end
581 REM Scope environment changes start {
584 REM Need diasymreader.dll on your path for /CreatePdb
585 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
587 if %__BuildNativeCoreLib% EQU 1 (
588 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
590 REM Need VS native tools environment for the **target** arch when running instrumented binaries
591 if %__PgoInstrument% EQU 1 (
592 set __VCExecArch=%__BuildArch%
593 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
594 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
595 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
596 @if defined _echo @echo on
597 if NOT !errorlevel! == 0 (
598 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
602 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
604 for /f "tokens=*" %%f in ('where pgort*.dll') do (
605 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
607 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
608 copy /y "!__PgoRtPath!" "%__BinDir%" || (
609 echo %__MsgPrefix%Error: copy failed
615 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
616 echo %__MsgPrefix%!NEXTCMD!
617 !NEXTCMD! > "%__CrossGenCoreLibLog%" 2>&1
618 if NOT !errorlevel! == 0 (
619 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
620 :: Put it in the same log, helpful for Jenkins
621 type %__CrossGenCoreLibLog%
625 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
626 echo %__MsgPrefix%!NEXTCMD!
627 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
628 if NOT !errorlevel! == 0 (
629 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
630 :: Put it in the same log, helpful for Jenkins
631 type %__CrossGenCoreLibLog%
636 REM } Scope environment changes end
640 if %__BuildPackages% EQU 1 (
641 REM Scope environment changes start {
644 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
646 set __BuildLogRootName=Nuget
647 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
648 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
649 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
650 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
651 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
652 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
654 REM The conditions as to what to build are captured in the builds file.
655 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
657 if not !errorlevel! == 0 (
658 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
665 REM } Scope environment changes end
669 REM =========================================================================================
671 REM === Test build section
673 REM =========================================================================================
675 if %__BuildTests% EQU 1 (
676 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
678 REM Construct the arguments to pass to the test build script.
680 rem arm64 builds currently use private toolset which has not been released yet
681 REM TODO, remove once the toolset is open.
682 if not "%__ToolsetDir%" == "" call :PrivateToolSet
684 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
685 echo %__MsgPrefix%!NEXTCMD!
688 if not !errorlevel! == 0 (
689 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
694 REM =========================================================================================
696 REM === All builds complete!
698 REM =========================================================================================
700 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
701 echo %__MsgPrefix%Product binaries are available at !__BinDir!
702 if %__BuildTests% EQU 1 (
703 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
707 REM =========================================================================================
709 REM === Handle the "all" case.
711 REM =========================================================================================
717 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
718 if %__TotalSpecifiedBuildArch% EQU 0 (
719 REM Nothing specified means we want to build all architectures.
720 set __BuildArchList=x64 x86 arm arm64
723 REM Otherwise, add all the specified architectures to the list.
725 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
726 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
727 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
728 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
732 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
733 if %__TotalSpecifiedBuildType% EQU 0 (
734 REM Nothing specified means we want to build all build types.
735 set __BuildTypeList=Debug Checked Release
738 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
739 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
740 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
742 REM Create a temporary file to collect build results. We always build all flavors specified, and
743 REM report a summary of the results at the end.
745 set __AllBuildSuccess=true
746 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
747 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
749 for %%i in (%__BuildArchList%) do (
750 for %%j in (%__BuildTypeList%) do (
751 call :BuildOne %%i %%j
755 if %__AllBuildSuccess%==true (
756 echo %__MsgPrefix%All builds succeeded!
759 echo %__MsgPrefix%Builds failed:
760 type %__BuildResultFile%
761 del /f /q %__BuildResultFile%
765 REM This code is unreachable, but leaving it nonetheless, just in case things change.
771 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
772 echo %__MsgPrefix%Invoking: %__NextCmd%
774 if not !errorlevel! == 0 (
775 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
776 set __AllBuildSuccess=false
780 REM =========================================================================================
782 REM === Helper routines
784 REM =========================================================================================
791 echo Build the CoreCLR repo.
794 echo build.cmd [option1] [option2]
796 echo build.cmd all [option1] [option2] -- ...
798 echo All arguments are optional. The options are:
800 echo.-? -h -help --help: view this message.
801 echo -all: Builds all configurations and platforms.
802 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
803 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
804 echo -- ... : all arguments following this tag will be passed directly to msbuild.
805 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
806 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
807 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
809 echo add nativemscorlib to go further and build the native image for designated mscorlib.
810 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
811 echo -nopgooptimize: do not use profile guided optimizations.
812 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
813 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
814 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
815 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
816 echo -skipconfigure: skip CMake ^(default: CMake is run^)
817 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
818 echo -skipnative: skip building native components ^(default: native components are built^).
819 echo -skiptests: skip building tests ^(default: tests are built^).
820 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
821 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
822 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
823 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
824 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
825 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
826 echo -Rebuild: passes /t:rebuild to the build projects.
827 echo portable : build for portable RID.
829 echo If "all" is specified, then all build architectures and types are built. If, in addition,
830 echo one or more build architectures or types is specified, then only those build architectures
831 echo and types are built.
835 echo -- builds all architectures, and all build types per architecture
837 echo -- builds all build types for x86
838 echo build -all -x64 -x86 -Checked -Release
839 echo -- builds x64 and x86 architectures, Checked and Release build types for each
843 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
844 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
845 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
846 of the previous version to "%VSINSTALLDIR%" and then build.
847 :: DIA SDK not included in Express editions
848 echo Visual Studio Express does not include the DIA SDK. ^
849 You need Visual Studio 2015 or 2017 (Community is free).
850 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
855 echo %__MsgPrefix%Setting up the usage of __ToolsetDir:%__ToolsetDir%
857 if /i "%__ToolsetDir%" == "" (
858 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
862 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
863 call "%__ToolsetDir%"\buildenv_arm64.cmd
867 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
868 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
870 %__ToolsetDir%\VC_sdk\inc;^
871 %__ToolsetDir%\sdpublic\sdk\inc;^
872 %__ToolsetDir%\sdpublic\shared\inc;^
873 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
874 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
875 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
876 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
877 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
878 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
879 %__ToolsetDir%\diasdk\include