1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
7 :: Default to highest Visual Studio version available
9 :: For VS2015 (and prior), only a single instance is allowed to be installed on a box
10 :: and VS140COMNTOOLS is set as a global environment variable by the installer. This
11 :: allows users to locate where the instance of VS2015 is installed.
13 :: For VS2017, multiple instances can be installed on the same box SxS and VS150COMNTOOLS
14 :: is no longer set as a global environment variable and is instead only set if the user
15 :: has launched the VS2017 Developer Command Prompt.
17 :: Following this logic, we will default to the VS2017 toolset if VS150COMNTOOLS tools is
18 :: set, as this indicates the user is running from the VS2017 Developer Command Prompt and
19 :: is already configured to use that toolset. Otherwise, we will fallback to using the VS2015
20 :: toolset if it is installed. Finally, we will fail the script if no supported VS instance
22 if defined VS150COMNTOOLS (
23 set "__VSToolsRoot=%VS150COMNTOOLS%"
24 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
25 set __VSVersion=vs2017
27 set "__VSToolsRoot=%VS140COMNTOOLS%"
28 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
29 set __VSVersion=vs2015
32 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
33 :: __BuildArch -- default: x64
34 :: __BuildType -- default: Debug
35 :: __BuildOS -- default: Windows_NT
36 :: __ProjectDir -- default: directory of the dir.props file
37 :: __SourceDir -- default: %__ProjectDir%\src\
38 :: __PackagesDir -- default: %__ProjectDir%\packages\
39 :: __RootBinDir -- default: %__ProjectDir%\bin\
40 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
42 :: __PackagesBinDir -- default: %__BinDir%\.nuget
43 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
45 :: Thus, these variables are not simply internal to this script!
47 :: Set the default arguments for build
50 set __BuildOS=Windows_NT
52 :: Define a prefix for most output progress messages that come from this script. That makes
53 :: it easier to see where these are coming from. Note that there is a trailing space here.
54 set "__MsgPrefix=BUILD: "
56 :: Set the various build properties here so that CMake and MSBuild can pick them up
57 set "__ProjectDir=%~dp0"
58 :: remove trailing slash
59 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
60 set "__ProjectFilesDir=%__ProjectDir%"
61 set "__SourceDir=%__ProjectDir%\src"
62 set "__PackagesDir=%__ProjectDir%\packages"
63 set "__RootBinDir=%__ProjectDir%\bin"
64 set "__LogsDir=%__RootBinDir%\Logs"
65 set "__PgoOptDataVersion="
66 set "__IbcOptDataVersion="
73 set __BuildArchArm64=0
75 set __BuildTypeDebug=0
76 set __BuildTypeChecked=0
77 set __BuildTypeRelease=0
78 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
79 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=0"
86 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
88 set __PassThroughArgs=
90 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
93 set __UnprocessedBuildArgs=
100 set __BuildNativeCoreLib=1
101 set __RestoreOptData=1
104 if "%1" == "" goto ArgsDone
106 if /i "%1" == "-?" goto Usage
107 if /i "%1" == "-h" goto Usage
108 if /i "%1" == "-help" goto Usage
109 if /i "%1" == "--help" goto Usage
112 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
113 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
118 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
119 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
120 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
122 REM TODO these are deprecated remove them eventually
123 REM don't add more, use the - syntax instead
124 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
125 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
126 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
127 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
128 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
130 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
131 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
135 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
136 if [!__PassThroughArgs!]==[] (
137 set __PassThroughArgs=%1
139 set __PassThroughArgs=%__PassThroughArgs% %1
142 if /i "%1" == "-freebsdmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143 if /i "%1" == "-linuxmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "-netbsdmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "-osxmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "-windowsmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 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)
148 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)
149 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
151 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
152 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
153 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
154 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
155 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)
156 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
157 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
158 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
159 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
160 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
161 if /i "%1" == "-buildstandalonegc" (
162 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"
163 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=1"
164 set processedArgs=!processedArgs! %1
168 REM TODO these are deprecated remove them eventually
169 REM don't add more, use the - syntax instead
170 if /i "%1" == "freebsdmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
171 if /i "%1" == "linuxmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "netbsdmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "osxmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "windowsmscorlib" (set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 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)
176 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)
177 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
180 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
182 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
183 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)
184 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
185 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
186 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
187 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
188 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
189 if /i "%1" == "buildstandalonegc" (
190 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"
191 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=1"
192 set processedArgs=!processedArgs! %1
196 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
197 if /i "%1" == "altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if [!processedArgs!]==[] (
200 set __UnprocessedBuildArgs=%__args%
202 set __UnprocessedBuildArgs=%__args%
203 for %%t in (!processedArgs!) do (
204 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
210 if %__PgoOptimize%==0 set __RestoreOptData=0
212 if defined __BuildAll goto BuildAll
214 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
215 if %__TotalSpecifiedBuildArch% GTR 1 (
216 echo Error: more than one build architecture specified, but "all" not specified.
220 if %__BuildArchX64%==1 set __BuildArch=x64
221 if %__BuildArchX86%==1 set __BuildArch=x86
222 if %__BuildArchArm%==1 (
226 if %__BuildArchArm64%==1 (
227 set __BuildArch=arm64
231 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
232 if %__TotalSpecifiedBuildType% GTR 1 (
233 echo Error: more than one build type specified, but "all" not specified.
237 if %__BuildTypeDebug%==1 set __BuildType=Debug
238 if %__BuildTypeChecked%==1 set __BuildType=Checked
239 if %__BuildTypeRelease%==1 set __BuildType=Release
241 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
243 if %__EnforcePgo%==1 (
244 if %__BuildArchArm%==1 (
245 echo NOTICE: enforcepgo does nothing on arm architecture
247 if %__BuildArchArm64%==1 (
248 echo NOTICE: enforcepgo does nothing on arm64 architecture
252 :: Set the remaining variables based upon the determined build configuration
253 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
254 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
255 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
256 set "__PackagesBinDir=%__BinDir%\.nuget"
257 set "__TestRootDir=%__RootBinDir%\tests"
258 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
259 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
260 set "__CrossComponentBinDir=%__BinDir%"
261 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
264 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
265 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
266 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
268 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
269 set "__CMakeBinDir=%__BinDir%"
270 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
272 if not exist "%__BinDir%" md "%__BinDir%"
273 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
274 if not exist "%__LogsDir%" md "%__LogsDir%"
276 REM It is convenient to have your Nuget search path include the location where the build
277 REM will place packages. However nuget used during the build will fail if that directory
278 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
279 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
281 echo %__MsgPrefix%Commencing CoreCLR Repo build
283 :: Set the remaining variables based upon the determined build configuration
285 echo %__MsgPrefix%Checking prerequisites
286 :: Eval the output from probe-win1.ps1
287 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
289 REM =========================================================================================
291 REM === Start the build steps
293 REM =========================================================================================
295 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
296 call "%__VSToolsRoot%\VsDevCmd.bat"
297 @if defined _echo @echo on
299 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
301 REM =========================================================================================
303 REM === Restore optimization profile data
305 REM =========================================================================================
307 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
308 echo %__MsgPrefix%Restoring the OptimizationData Package
309 @call %__ProjectDir%\run.cmd sync -optdata
310 if not !errorlevel! == 0 (
311 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
316 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
317 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
318 if not exist "%DotNetCli%" (
319 echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
322 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
323 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
324 set __PgoOptDataVersion=%%s
326 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
327 set __IbcOptDataVersion=%%s
330 REM =========================================================================================
332 REM === Build the CLR VM
334 REM =========================================================================================
336 if %__BuildNative% EQU 1 (
337 REM Scope environment changes start {
340 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
342 set nativePlatfromArgs=-platform=%__BuildArch%
343 if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
345 if /i "%__BuildArch%" == "arm64" (
346 rem arm64 builds currently use private toolset which has not been released yet
347 REM TODO, remove once the toolset is open.
352 :: Set the environment for the native build
353 set __VCBuildArch=x86_amd64
354 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
355 if /i "%__BuildArch%" == "arm" (
356 set __VCBuildArch=x86_arm
358 REM Make CMake pick the highest installed version in the 10.0.* range
359 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
362 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
363 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
364 @if defined _echo @echo on
366 if not defined VSINSTALLDIR (
367 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
370 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
373 if defined __SkipConfigure goto SkipConfigure
375 echo %__MsgPrefix%Regenerating the Visual Studio solution
377 pushd "%__IntermediatesDir%"
378 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%"
379 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildStandaloneGC% %__BuildStandaloneGCOnly% !__ExtraCmakeArgs!
380 @if defined _echo @echo on
384 if defined __ConfigureOnly goto SkipNativeBuild
386 if not exist "%__IntermediatesDir%\install.vcxproj" (
387 echo %__MsgPrefix%Error: failed to generate native component build project!
391 set __BuildLogRootName=CoreCLR
392 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
393 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
394 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
395 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
396 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
397 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
399 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
401 if not !errorlevel! == 0 (
402 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
410 REM } Scope environment changes end
414 REM =========================================================================================
416 REM === Build Cross-Architecture Native Components (if applicable)
418 REM =========================================================================================
420 if /i "%__BuildArch%"=="arm64" (
421 set __DoCrossArchBuild=1
424 if /i "%__BuildArch%"=="arm" (
425 set __DoCrossArchBuild=1
428 if /i "%__DoCrossArchBuild%"=="1" (
429 REM Scope environment changes start {
432 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
434 :: Set the environment for the native build
435 set __VCBuildArch=x86_amd64
436 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
438 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
439 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
440 @if defined _echo @echo on
442 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
443 if defined __SkipConfigure goto SkipConfigureCrossBuild
445 pushd "%__CrossCompIntermediatesDir%"
446 set __CMakeBinDir=%__CrossComponentBinDir%
447 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
448 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%"
449 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
450 @if defined _echo @echo on
453 :SkipConfigureCrossBuild
454 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
455 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
459 if defined __ConfigureOnly goto SkipCrossCompBuild
461 set __BuildLogRootName=Cross
462 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
463 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
464 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
465 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
466 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
467 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
469 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
471 if not !errorlevel! == 0 (
472 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
480 REM } Scope environment changes end
484 REM =========================================================================================
486 REM === CoreLib and NuGet package build section.
488 REM =========================================================================================
490 if %__BuildCoreLib% EQU 1 (
491 REM Scope environment changes start {
494 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
495 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
498 set __ExtraBuildArgs=
499 if not defined __IbcTuning (
500 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
501 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
504 if /i "%__BuildArch%" == "arm64" (
505 set __nugetBuildArgs=-buildNugetPackage=false
506 ) else if "%__SkipNugetPackage%" == "1" (
507 set __nugetBuildArgs=-buildNugetPackage=false
509 set __nugetBuildArgs=-buildNugetPackage=true
512 set __BuildLogRootName=System.Private.CoreLib
513 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
514 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
515 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
516 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
517 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
518 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
520 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
522 if not !errorlevel! == 0 (
523 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
530 REM } Scope environment changes end
534 REM Scope environment changes start {
537 REM Need diasymreader.dll on your path for /CreatePdb
538 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
540 if %__BuildNativeCoreLib% EQU 1 (
541 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
543 REM Need VS native tools environment for the **target** arch when running instrumented binaries
544 if %__PgoInstrument% EQU 1 (
545 set __VCExecArch=%__BuildArch%
546 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
547 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
548 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
549 @if defined _echo @echo on
550 if NOT !errorlevel! == 0 (
551 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
555 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
557 for /f "tokens=*" %%f in ('where pgort*.dll') do (
558 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
560 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
561 copy /y "!__PgoRtPath!" "%__BinDir%" || (
562 echo %__MsgPrefix%Error: copy failed
568 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
569 echo %__MsgPrefix%!NEXTCMD!
570 !NEXTCMD! > "%__CrossGenCoreLibLog%" 2>&1
571 if NOT !errorlevel! == 0 (
572 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
573 :: Put it in the same log, helpful for Jenkins
574 type %__CrossGenCoreLibLog%
578 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
579 echo %__MsgPrefix%!NEXTCMD!
580 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
581 if NOT !errorlevel! == 0 (
582 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
583 :: Put it in the same log, helpful for Jenkins
584 type %__CrossGenCoreLibLog%
589 REM } Scope environment changes end
593 if %__BuildPackages% EQU 1 (
594 REM Scope environment changes start {
597 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
599 set __BuildLogRootName=Nuget
600 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
601 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
602 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
603 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
604 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
605 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
607 REM The conditions as to what to build are captured in the builds file.
608 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
610 if not !errorlevel! == 0 (
611 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
618 REM } Scope environment changes end
622 REM =========================================================================================
624 REM === Test build section
626 REM =========================================================================================
628 if %__BuildTests% EQU 1 (
629 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
631 REM Construct the arguments to pass to the test build script.
633 rem arm64 builds currently use private toolset which has not been released yet
634 REM TODO, remove once the toolset is open.
635 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
637 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
638 echo %__MsgPrefix%!NEXTCMD!
641 if not !errorlevel! == 0 (
642 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
647 REM =========================================================================================
649 REM === All builds complete!
651 REM =========================================================================================
653 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
654 echo %__MsgPrefix%Product binaries are available at !__BinDir!
655 if %__BuildTests% EQU 1 (
656 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
660 REM =========================================================================================
662 REM === Handle the "all" case.
664 REM =========================================================================================
670 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
671 if %__TotalSpecifiedBuildArch% EQU 0 (
672 REM Nothing specified means we want to build all architectures.
673 set __BuildArchList=x64 x86 arm arm64
676 REM Otherwise, add all the specified architectures to the list.
678 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
679 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
680 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
681 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
685 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
686 if %__TotalSpecifiedBuildType% EQU 0 (
687 REM Nothing specified means we want to build all build types.
688 set __BuildTypeList=Debug Checked Release
691 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
692 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
693 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
695 REM Create a temporary file to collect build results. We always build all flavors specified, and
696 REM report a summary of the results at the end.
698 set __AllBuildSuccess=true
699 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
700 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
702 for %%i in (%__BuildArchList%) do (
703 for %%j in (%__BuildTypeList%) do (
704 call :BuildOne %%i %%j
708 if %__AllBuildSuccess%==true (
709 echo %__MsgPrefix%All builds succeeded!
712 echo %__MsgPrefix%Builds failed:
713 type %__BuildResultFile%
714 del /f /q %__BuildResultFile%
718 REM This code is unreachable, but leaving it nonetheless, just in case things change.
724 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
725 echo %__MsgPrefix%Invoking: %__NextCmd%
727 if not !errorlevel! == 0 (
728 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
729 set __AllBuildSuccess=false
733 REM =========================================================================================
735 REM === Helper routines
737 REM =========================================================================================
744 echo Build the CoreCLR repo.
747 echo build.cmd [option1] [option2]
749 echo build.cmd all [option1] [option2] -- ...
751 echo All arguments are optional. The options are:
753 echo.-? -h -help --help: view this message.
754 echo -all: Builds all configurations and platforms.
755 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
756 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
757 echo -- ... : all arguments following this tag will be passed directly to msbuild.
758 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
759 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
760 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
762 echo add nativemscorlib to go further and build the native image for designated mscorlib.
763 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
764 echo -nopgooptimize: do not use profile guided optimizations.
765 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
766 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
767 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
768 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
769 echo -skipconfigure: skip CMake ^(default: CMake is run^)
770 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
771 echo -skipnative: skip building native components ^(default: native components are built^).
772 echo -skiptests: skip building tests ^(default: tests are built^).
773 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
774 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
775 echo -buildstandalonegc: builds the GC in a standalone mode.
776 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
777 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
778 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
779 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
780 echo -Rebuild: passes /t:rebuild to the build projects.
781 echo portable : build for portable RID.
783 echo If "all" is specified, then all build architectures and types are built. If, in addition,
784 echo one or more build architectures or types is specified, then only those build architectures
785 echo and types are built.
789 echo -- builds all architectures, and all build types per architecture
791 echo -- builds all build types for x86
792 echo build -all -x64 -x86 -Checked -Release
793 echo -- builds x64 and x86 architectures, Checked and Release build types for each
797 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
798 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
799 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
800 of the previous version to "%VSINSTALLDIR%" and then build.
801 :: DIA SDK not included in Express editions
802 echo Visual Studio Express does not include the DIA SDK. ^
803 You need Visual Studio 2015 or 2017 (Community is free).
804 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
809 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
811 if /i "%__ToolsetDir%" == "" (
812 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
816 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
817 call "%__ToolsetDir%"\buildenv_arm64.cmd
821 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
822 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
824 %__ToolsetDir%\VC_sdk\inc;^
825 %__ToolsetDir%\sdpublic\sdk\inc;^
826 %__ToolsetDir%\sdpublic\shared\inc;^
827 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
828 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
829 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
830 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
831 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
832 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
833 %__ToolsetDir%\diasdk\include