1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
7 :: Default to highest Visual Studio version available
9 :: For VS2015 (and prior), only a single instance is allowed to be installed on a box
10 :: and VS140COMNTOOLS is set as a global environment variable by the installer. This
11 :: allows users to locate where the instance of VS2015 is installed.
13 :: For VS2017, multiple instances can be installed on the same box SxS and VS150COMNTOOLS
14 :: is no longer set as a global environment variable and is instead only set if the user
15 :: has launched the VS2017 Developer Command Prompt.
17 :: Following this logic, we will default to the VS2017 toolset if VS150COMNTOOLS tools is
18 :: set, as this indicates the user is running from the VS2017 Developer Command Prompt and
19 :: is already configured to use that toolset. Otherwise, we will fallback to using the VS2015
20 :: toolset if it is installed. Finally, we will fail the script if no supported VS instance
23 if defined VisualStudioVersion goto :Run
25 set _VSWHERE="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
27 for /f "usebackq tokens=*" %%i in (`%_VSWHERE% -latest -property installationPath`) do set _VSCOMNTOOLS=%%i\Common7\Tools
29 if not exist "%_VSCOMNTOOLS%" set _VSCOMNTOOLS=%VS140COMNTOOLS%
30 if not exist "%_VSCOMNTOOLS%" (
31 echo Error: Visual Studio 2015 or 2017 required.
32 echo Please see https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/developer-guide.md for build instructions.
36 call "%_VSCOMNTOOLS%\VsDevCmd.bat"
40 if defined VS150COMNTOOLS (
41 set "__VSToolsRoot=%VS150COMNTOOLS%"
42 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
43 set __VSVersion=vs2017
45 set "__VSToolsRoot=%VS140COMNTOOLS%"
46 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
47 set __VSVersion=vs2015
50 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
51 :: __BuildArch -- default: x64
52 :: __BuildType -- default: Debug
53 :: __BuildOS -- default: Windows_NT
54 :: __ProjectDir -- default: directory of the dir.props file
55 :: __SourceDir -- default: %__ProjectDir%\src\
56 :: __PackagesDir -- default: %__ProjectDir%\packages\
57 :: __RootBinDir -- default: %__ProjectDir%\bin\
58 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
60 :: __PackagesBinDir -- default: %__BinDir%\.nuget
61 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
63 :: Thus, these variables are not simply internal to this script!
65 :: Set the default arguments for build
68 set __BuildOS=Windows_NT
70 :: Define a prefix for most output progress messages that come from this script. That makes
71 :: it easier to see where these are coming from. Note that there is a trailing space here.
72 set "__MsgPrefix=BUILD: "
74 :: Set the various build properties here so that CMake and MSBuild can pick them up
75 set "__ProjectDir=%~dp0"
76 :: remove trailing slash
77 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
78 set "__ProjectFilesDir=%__ProjectDir%"
79 set "__SourceDir=%__ProjectDir%\src"
80 set "__PackagesDir=%__ProjectDir%\packages"
81 set "__RootBinDir=%__ProjectDir%\bin"
82 set "__LogsDir=%__RootBinDir%\Logs"
83 set "__PgoOptDataVersion="
84 set "__IbcOptDataVersion="
91 set __BuildArchArm64=0
93 set __BuildTypeDebug=0
94 set __BuildTypeChecked=0
95 set __BuildTypeRelease=0
96 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
97 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=0"
104 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
105 REM when using "all".
106 set __PassThroughArgs=
108 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
111 set __UnprocessedBuildArgs=
118 set __BuildPackages=1
119 set __BuildNativeCoreLib=1
120 set __RestoreOptData=1
123 if "%1" == "" goto ArgsDone
125 if /i "%1" == "-?" goto Usage
126 if /i "%1" == "-h" goto Usage
127 if /i "%1" == "-help" goto Usage
128 if /i "%1" == "--help" goto Usage
131 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 REM TODO these are deprecated remove them eventually
142 REM don't add more, use the - syntax instead
143 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
149 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
151 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
153 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
154 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
155 if [!__PassThroughArgs!]==[] (
156 set __PassThroughArgs=%1
158 set __PassThroughArgs=%__PassThroughArgs% %1
161 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)
162 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)
163 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)
164 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)
165 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)
166 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)
167 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)
168 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
169 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
170 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
171 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 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)
175 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
180 if /i "%1" == "-buildstandalonegc" (
181 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"
182 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=1"
183 set processedArgs=!processedArgs! %1
187 REM TODO these are deprecated remove them eventually
188 REM don't add more, use the - syntax instead
189 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)
190 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)
191 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)
192 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)
193 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)
194 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)
195 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)
196 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
197 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
198 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 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)
203 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
208 if /i "%1" == "buildstandalonegc" (
209 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"
210 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=1"
211 set processedArgs=!processedArgs! %1
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 if %__PgoOptimize%==0 set __RestoreOptData=0
231 if defined __BuildAll goto BuildAll
233 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
234 if %__TotalSpecifiedBuildArch% GTR 1 (
235 echo Error: more than one build architecture specified, but "all" not specified.
239 if %__BuildArchX64%==1 set __BuildArch=x64
240 if %__BuildArchX86%==1 set __BuildArch=x86
241 if %__BuildArchArm%==1 (
245 if %__BuildArchArm64%==1 (
246 set __BuildArch=arm64
250 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
251 if %__TotalSpecifiedBuildType% GTR 1 (
252 echo Error: more than one build type specified, but "all" not specified.
256 if %__BuildTypeDebug%==1 set __BuildType=Debug
257 if %__BuildTypeChecked%==1 set __BuildType=Checked
258 if %__BuildTypeRelease%==1 set __BuildType=Release
260 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
262 if %__EnforcePgo%==1 (
263 if %__BuildArchArm%==1 (
264 echo NOTICE: enforcepgo does nothing on arm architecture
266 if %__BuildArchArm64%==1 (
267 echo NOTICE: enforcepgo does nothing on arm64 architecture
271 :: Set the remaining variables based upon the determined build configuration
272 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
273 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
274 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
275 set "__PackagesBinDir=%__BinDir%\.nuget"
276 set "__TestRootDir=%__RootBinDir%\tests"
277 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
278 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
279 set "__CrossComponentBinDir=%__BinDir%"
280 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
283 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
284 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
285 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
287 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
288 set "__CMakeBinDir=%__BinDir%"
289 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
291 if not exist "%__BinDir%" md "%__BinDir%"
292 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
293 if not exist "%__LogsDir%" md "%__LogsDir%"
295 REM It is convenient to have your Nuget search path include the location where the build
296 REM will place packages. However nuget used during the build will fail if that directory
297 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
298 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
300 echo %__MsgPrefix%Commencing CoreCLR Repo build
302 :: Set the remaining variables based upon the determined build configuration
304 echo %__MsgPrefix%Checking prerequisites
305 :: Eval the output from probe-win1.ps1
306 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
308 REM =========================================================================================
310 REM === Start the build steps
312 REM =========================================================================================
314 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
315 call "%__VSToolsRoot%\VsDevCmd.bat"
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 nativePlatfromArgs=-platform=%__BuildArch%
362 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
364 if /i "%__BuildArch%" == "arm64" (
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"
381 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
382 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
383 @if defined _echo @echo on
385 if not defined VSINSTALLDIR (
386 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
389 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
392 if defined __SkipConfigure goto SkipConfigure
394 echo %__MsgPrefix%Regenerating the Visual Studio solution
396 pushd "%__IntermediatesDir%"
397 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%"
398 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildStandaloneGC% %__BuildStandaloneGCOnly% !__ExtraCmakeArgs!
399 @if defined _echo @echo on
403 if defined __ConfigureOnly goto SkipNativeBuild
405 if not exist "%__IntermediatesDir%\install.vcxproj" (
406 echo %__MsgPrefix%Error: failed to generate native component build project!
410 set __BuildLogRootName=CoreCLR
411 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
412 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
413 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
414 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
415 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
416 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
418 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
420 if not !errorlevel! == 0 (
421 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
429 REM } Scope environment changes end
433 REM =========================================================================================
435 REM === Build Cross-Architecture Native Components (if applicable)
437 REM =========================================================================================
439 if /i "%__BuildArch%"=="arm64" (
440 set __DoCrossArchBuild=1
443 if /i "%__BuildArch%"=="arm" (
444 set __DoCrossArchBuild=1
447 if /i "%__DoCrossArchBuild%"=="1" (
448 REM Scope environment changes start {
451 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
453 :: Set the environment for the native build
454 set __VCBuildArch=x86_amd64
455 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
457 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
458 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
459 @if defined _echo @echo on
461 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
462 if defined __SkipConfigure goto SkipConfigureCrossBuild
464 pushd "%__CrossCompIntermediatesDir%"
465 set __CMakeBinDir=%__CrossComponentBinDir%
466 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
467 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%"
468 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
469 @if defined _echo @echo on
472 :SkipConfigureCrossBuild
473 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
474 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
478 if defined __ConfigureOnly goto SkipCrossCompBuild
480 set __BuildLogRootName=Cross
481 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
482 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
483 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
484 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
485 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
486 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
488 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
490 if not !errorlevel! == 0 (
491 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
499 REM } Scope environment changes end
503 REM =========================================================================================
505 REM === CoreLib and NuGet package build section.
507 REM =========================================================================================
509 if %__BuildCoreLib% EQU 1 (
510 REM Scope environment changes start {
513 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
514 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
517 set __ExtraBuildArgs=
518 if not defined __IbcTuning (
519 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
520 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
523 if "%__BuildSOS%" == "0" (
524 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
527 if /i "%__BuildArch%" == "arm64" (
528 set __nugetBuildArgs=-buildNugetPackage=false
529 ) else if "%__SkipNugetPackage%" == "1" (
530 set __nugetBuildArgs=-buildNugetPackage=false
532 set __nugetBuildArgs=-buildNugetPackage=true
535 set __BuildLogRootName=System.Private.CoreLib
536 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
537 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
538 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
539 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
540 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
541 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
543 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
545 if not !errorlevel! == 0 (
546 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
553 REM } Scope environment changes end
557 REM Scope environment changes start {
560 REM Need diasymreader.dll on your path for /CreatePdb
561 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
563 if %__BuildNativeCoreLib% EQU 1 (
564 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
566 REM Need VS native tools environment for the **target** arch when running instrumented binaries
567 if %__PgoInstrument% EQU 1 (
568 set __VCExecArch=%__BuildArch%
569 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
570 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
571 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
572 @if defined _echo @echo on
573 if NOT !errorlevel! == 0 (
574 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
578 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
580 for /f "tokens=*" %%f in ('where pgort*.dll') do (
581 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
583 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
584 copy /y "!__PgoRtPath!" "%__BinDir%" || (
585 echo %__MsgPrefix%Error: copy failed
591 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
592 echo %__MsgPrefix%!NEXTCMD!
593 !NEXTCMD! > "%__CrossGenCoreLibLog%" 2>&1
594 if NOT !errorlevel! == 0 (
595 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
596 :: Put it in the same log, helpful for Jenkins
597 type %__CrossGenCoreLibLog%
601 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
602 echo %__MsgPrefix%!NEXTCMD!
603 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
604 if NOT !errorlevel! == 0 (
605 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
606 :: Put it in the same log, helpful for Jenkins
607 type %__CrossGenCoreLibLog%
612 REM } Scope environment changes end
616 if %__BuildPackages% EQU 1 (
617 REM Scope environment changes start {
620 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
622 set __BuildLogRootName=Nuget
623 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
624 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
625 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
626 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
627 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
628 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
630 REM The conditions as to what to build are captured in the builds file.
631 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
633 if not !errorlevel! == 0 (
634 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
641 REM } Scope environment changes end
645 REM =========================================================================================
647 REM === Test build section
649 REM =========================================================================================
651 if %__BuildTests% EQU 1 (
652 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
654 REM Construct the arguments to pass to the test build script.
656 rem arm64 builds currently use private toolset which has not been released yet
657 REM TODO, remove once the toolset is open.
658 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
660 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
661 echo %__MsgPrefix%!NEXTCMD!
664 if not !errorlevel! == 0 (
665 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
670 REM =========================================================================================
672 REM === All builds complete!
674 REM =========================================================================================
676 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
677 echo %__MsgPrefix%Product binaries are available at !__BinDir!
678 if %__BuildTests% EQU 1 (
679 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
683 REM =========================================================================================
685 REM === Handle the "all" case.
687 REM =========================================================================================
693 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
694 if %__TotalSpecifiedBuildArch% EQU 0 (
695 REM Nothing specified means we want to build all architectures.
696 set __BuildArchList=x64 x86 arm arm64
699 REM Otherwise, add all the specified architectures to the list.
701 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
702 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
703 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
704 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
708 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
709 if %__TotalSpecifiedBuildType% EQU 0 (
710 REM Nothing specified means we want to build all build types.
711 set __BuildTypeList=Debug Checked Release
714 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
715 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
716 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
718 REM Create a temporary file to collect build results. We always build all flavors specified, and
719 REM report a summary of the results at the end.
721 set __AllBuildSuccess=true
722 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
723 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
725 for %%i in (%__BuildArchList%) do (
726 for %%j in (%__BuildTypeList%) do (
727 call :BuildOne %%i %%j
731 if %__AllBuildSuccess%==true (
732 echo %__MsgPrefix%All builds succeeded!
735 echo %__MsgPrefix%Builds failed:
736 type %__BuildResultFile%
737 del /f /q %__BuildResultFile%
741 REM This code is unreachable, but leaving it nonetheless, just in case things change.
747 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
748 echo %__MsgPrefix%Invoking: %__NextCmd%
750 if not !errorlevel! == 0 (
751 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
752 set __AllBuildSuccess=false
756 REM =========================================================================================
758 REM === Helper routines
760 REM =========================================================================================
767 echo Build the CoreCLR repo.
770 echo build.cmd [option1] [option2]
772 echo build.cmd all [option1] [option2] -- ...
774 echo All arguments are optional. The options are:
776 echo.-? -h -help --help: view this message.
777 echo -all: Builds all configurations and platforms.
778 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
779 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
780 echo -- ... : all arguments following this tag will be passed directly to msbuild.
781 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
782 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
783 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
785 echo add nativemscorlib to go further and build the native image for designated mscorlib.
786 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
787 echo -nopgooptimize: do not use profile guided optimizations.
788 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
789 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
790 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
791 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
792 echo -skipconfigure: skip CMake ^(default: CMake is run^)
793 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
794 echo -skipnative: skip building native components ^(default: native components are built^).
795 echo -skiptests: skip building tests ^(default: tests are built^).
796 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
797 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
798 echo -buildstandalonegc: builds the GC in a standalone mode.
799 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
800 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
801 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
802 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
803 echo -Rebuild: passes /t:rebuild to the build projects.
804 echo portable : build for portable RID.
806 echo If "all" is specified, then all build architectures and types are built. If, in addition,
807 echo one or more build architectures or types is specified, then only those build architectures
808 echo and types are built.
812 echo -- builds all architectures, and all build types per architecture
814 echo -- builds all build types for x86
815 echo build -all -x64 -x86 -Checked -Release
816 echo -- builds x64 and x86 architectures, Checked and Release build types for each
820 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
821 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
822 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
823 of the previous version to "%VSINSTALLDIR%" and then build.
824 :: DIA SDK not included in Express editions
825 echo Visual Studio Express does not include the DIA SDK. ^
826 You need Visual Studio 2015 or 2017 (Community is free).
827 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
832 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
834 if /i "%__ToolsetDir%" == "" (
835 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
839 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
840 call "%__ToolsetDir%"\buildenv_arm64.cmd
844 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
845 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
847 %__ToolsetDir%\VC_sdk\inc;^
848 %__ToolsetDir%\sdpublic\sdk\inc;^
849 %__ToolsetDir%\sdpublic\shared\inc;^
850 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
851 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
852 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
853 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
854 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
855 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
856 %__ToolsetDir%\diasdk\include