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 REM Make the work-around to a bug in the microsoft.dotnet.buildtools.coreclr package until it is fixed.
50 reg query HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{3BFCEA48-620F-4B6B-81F7-B9AF75454C7D}\InprocServer32 > NUL: 2>&1
51 if NOT '%ERRORLEVEL%' == '0' (
53 echo.**********************************************************************************
54 echo.Error: We have detected that the msdia120.dll is not registered.
55 echo.This is necessary for the build to complete without a Class_Not_Registered error.
57 echo.You can fix this by
58 echo. 1. Launching the "Developer Command Prompt for VS2017" with Administrative privileges
59 echo. 2. Running regsvr32.exe "%%VSINSTALLDIR%%\Common7\IDE\msdia120.dll"
61 echo.This will only need to be done once for the lifetime of the machine.
62 echo.For more details see: https://github.com/dotnet/coreclr/issues/11305
66 if defined VS150COMNTOOLS (
67 set "__VSToolsRoot=%VS150COMNTOOLS%"
68 set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
69 set __VSVersion=vs2017
71 set "__VSToolsRoot=%VS140COMNTOOLS%"
72 set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
73 set __VSVersion=vs2015
76 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
77 :: __BuildArch -- default: x64
78 :: __BuildType -- default: Debug
79 :: __BuildOS -- default: Windows_NT
80 :: __ProjectDir -- default: directory of the dir.props file
81 :: __SourceDir -- default: %__ProjectDir%\src\
82 :: __PackagesDir -- default: %__ProjectDir%\packages\
83 :: __RootBinDir -- default: %__ProjectDir%\bin\
84 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
86 :: __PackagesBinDir -- default: %__BinDir%\.nuget
87 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
89 :: Thus, these variables are not simply internal to this script!
91 :: Set the default arguments for build
94 set __BuildOS=Windows_NT
96 :: Set the various build properties here so that CMake and MSBuild can pick them up
97 set "__ProjectDir=%~dp0"
98 :: remove trailing slash
99 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
100 set "__ProjectFilesDir=%__ProjectDir%"
101 set "__SourceDir=%__ProjectDir%\src"
102 set "__PackagesDir=%DotNetRestorePackagesPath%"
103 if [%__PackagesDir%]==[] set "__PackagesDir=%__ProjectDir%\packages"
104 set "__RootBinDir=%__ProjectDir%\bin"
105 set "__LogsDir=%__RootBinDir%\Logs"
106 set "__PgoOptDataVersion="
107 set "__IbcOptDataVersion="
114 set __BuildArchArm64=0
116 set __BuildTypeDebug=0
117 set __BuildTypeChecked=0
118 set __BuildTypeRelease=0
120 set __PgoInstrument=0
125 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
126 REM when using "all".
127 set __PassThroughArgs=
129 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
132 set __UnprocessedBuildArgs=
139 set __BuildPackages=1
140 set __BuildNativeCoreLib=1
141 set __RestoreOptData=1
142 set __CrossgenAltJit=
144 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
146 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
147 @REM and allow the "-priority=1" syntax.
151 if "%1" == "" goto ArgsDone
153 if /i "%1" == "-?" goto Usage
154 if /i "%1" == "-h" goto Usage
155 if /i "%1" == "-help" goto Usage
156 if /i "%1" == "--help" goto Usage
159 if /i "%1" == "-all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
160 if /i "%1" == "-x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
161 if /i "%1" == "-x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
162 if /i "%1" == "-arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
163 if /i "%1" == "-arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
165 if /i "%1" == "-debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
166 if /i "%1" == "-checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
167 if /i "%1" == "-release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
169 REM TODO these are deprecated remove them eventually
170 REM don't add more, use the - syntax instead
171 if /i "%1" == "all" (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "x64" (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "x86" (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "arm" (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "arm64" (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "debug" (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "checked" (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "release" (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
181 if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
183 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
184 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
185 if [!__PassThroughArgs!]==[] (
186 set __PassThroughArgs=%1
188 set __PassThroughArgs=%__PassThroughArgs% %1
191 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)
192 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)
193 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)
194 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)
195 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)
196 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)
197 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)
198 if /i "%1" == "-skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if /i "%1" == "-skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "-skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "-skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 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)
205 if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
208 if /i "%1" == "-ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
209 if /i "%1" == "-toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
210 if /i "%1" == "-crossgenaltjit" (set __CrossgenAltJit=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
212 REM Temporarily eat old -altjitcrossgen flag until CI system is updated.
213 if /i "%1" == "-altjitcrossgen" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
215 REM TODO these are deprecated remove them eventually
216 REM don't add more, use the - syntax instead
217 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)
218 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)
219 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)
220 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)
221 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)
222 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)
223 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)
224 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
225 if /i "%1" == "skipmscorlib" (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
226 if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
227 if /i "%1" == "skiptests" (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
228 if /i "%1" == "skipbuildpackages" (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
229 if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
230 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)
231 if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
232 if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
233 if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
234 if /i "%1" == "ibcinstrument" (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
235 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
237 if [!processedArgs!]==[] (
238 set __UnprocessedBuildArgs=%__args%
240 set __UnprocessedBuildArgs=%__args%
241 for %%t in (!processedArgs!) do (
242 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
248 @REM Special handling for -priority=N argument.
249 if defined __Priority (
250 if defined __PassThroughArgs (
251 set __PassThroughArgs=%__PassThroughArgs% -priority=%__Priority%
253 set __PassThroughArgs=-priority=%__Priority%
255 set __UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%
258 if %__PgoOptimize%==0 set __RestoreOptData=0
260 if defined __BuildAll goto BuildAll
262 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
263 if %__TotalSpecifiedBuildArch% GTR 1 (
264 echo Error: more than one build architecture specified, but "all" not specified.
268 if %__BuildArchX64%==1 set __BuildArch=x64
269 if %__BuildArchX86%==1 set __BuildArch=x86
270 if %__BuildArchArm%==1 (
274 if %__BuildArchArm64%==1 (
275 set __BuildArch=arm64
279 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
280 if %__TotalSpecifiedBuildType% GTR 1 (
281 echo Error: more than one build type specified, but "all" not specified.
285 if %__BuildTypeDebug%==1 set __BuildType=Debug
286 if %__BuildTypeChecked%==1 set __BuildType=Checked
287 if %__BuildTypeRelease%==1 set __BuildType=Release
289 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
291 if %__EnforcePgo%==1 (
292 if %__BuildArchArm%==1 (
293 echo NOTICE: enforcepgo does nothing on arm architecture
295 if %__BuildArchArm64%==1 (
296 echo NOTICE: enforcepgo does nothing on arm64 architecture
300 :: Set the remaining variables based upon the determined build configuration
301 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
302 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
303 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
304 set "__PackagesBinDir=%__BinDir%\.nuget"
305 set "__TestRootDir=%__RootBinDir%\tests"
306 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
307 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
308 set "__CrossComponentBinDir=%__BinDir%"
309 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
312 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
313 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
314 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
316 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
317 set "__CMakeBinDir=%__BinDir%"
318 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
320 if not exist "%__BinDir%" md "%__BinDir%"
321 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
322 if not exist "%__LogsDir%" md "%__LogsDir%"
324 REM It is convenient to have your Nuget search path include the location where the build
325 REM will place packages. However nuget used during the build will fail if that directory
326 REM does not exist. Avoid this in at least one case by aggressively creating the directory.
327 if not exist "%__BinDir%\.nuget\pkg" md "%__BinDir%\.nuget\pkg"
329 echo %__MsgPrefix%Commencing CoreCLR Repo build
331 :: Set the remaining variables based upon the determined build configuration
333 echo %__MsgPrefix%Checking prerequisites
334 :: Eval the output from probe-win1.ps1
335 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
337 REM NumberOfCores is an WMI property providing number of physical cores on machine
338 REM processor(s). It is used to set optimal level of CL parallelism during native build step
339 if not defined NumberOfCores (
340 REM Determine number of physical processor cores available on machine
341 for /f "tokens=*" %%I in (
342 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
345 echo %__MsgPrefix%Number of processor cores %NumberOfCores%
347 REM =========================================================================================
349 REM === Start the build steps
351 REM =========================================================================================
353 @if defined _echo @echo on
355 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
357 REM =========================================================================================
359 REM === Restore optimization profile data
361 REM =========================================================================================
363 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
364 echo %__MsgPrefix%Restoring the OptimizationData Package
365 @call %__ProjectDir%\run.cmd sync -optdata
366 if not !errorlevel! == 0 (
367 echo %__MsgPrefix%Error: Failed to restore the optimization data package.
372 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
373 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
374 if not exist "%DotNetCli%" (
375 echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
378 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
379 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
380 set __PgoOptDataVersion=%%s
382 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
383 set __IbcOptDataVersion=%%s
386 REM =========================================================================================
388 REM === Build the CLR VM
390 REM =========================================================================================
392 if %__BuildNative% EQU 1 (
393 REM Scope environment changes start {
396 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
398 set __NativePlatformArgs=-platform=%__BuildArch%
399 if not "%__ToolsetDir%" == "" ( set __NativePlatformArgs=-useEnv )
401 if not "%__ToolsetDir%" == "" (
402 rem arm64 builds currently use private toolset which has not been released yet
403 REM TODO, remove once the toolset is open.
408 :: Set the environment for the native build
409 set __VCBuildArch=x86_amd64
410 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
411 if /i "%__BuildArch%" == "arm" (
412 set __VCBuildArch=x86_arm
414 REM Make CMake pick the highest installed version in the 10.0.* range
415 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
417 if /i "%__BuildArch%" == "arm64" (
418 set __VCBuildArch=x86_arm64
420 REM Make CMake pick the highest installed version in the 10.0.* range
421 set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
424 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
425 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
426 @if defined _echo @echo on
428 if not defined VSINSTALLDIR (
429 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
432 if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
435 if defined __SkipConfigure goto SkipConfigure
437 echo %__MsgPrefix%Regenerating the Visual Studio solution
439 pushd "%__IntermediatesDir%"
440 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%"
441 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
442 @if defined _echo @echo on
446 if defined __ConfigureOnly goto SkipNativeBuild
448 if not exist "%__IntermediatesDir%\install.vcxproj" (
449 echo %__MsgPrefix%Error: failed to generate native component build project!
453 set __BuildLogRootName=CoreCLR
454 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
455 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
456 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
457 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
458 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
459 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
461 @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %__NativePlatformArgs% %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
463 if not !errorlevel! == 0 (
464 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
472 REM } Scope environment changes end
476 REM =========================================================================================
478 REM === Build Cross-Architecture Native Components (if applicable)
480 REM =========================================================================================
482 if /i "%__BuildArch%"=="arm64" (
483 set __DoCrossArchBuild=1
486 if /i "%__BuildArch%"=="arm" (
487 set __DoCrossArchBuild=1
490 if /i "%__DoCrossArchBuild%"=="1" (
491 REM Scope environment changes start {
494 echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
496 :: Set the environment for the native build
497 set __VCBuildArch=x86_amd64
498 if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
500 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
501 call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
502 @if defined _echo @echo on
504 if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
505 if defined __SkipConfigure goto SkipConfigureCrossBuild
507 pushd "%__CrossCompIntermediatesDir%"
508 set __CMakeBinDir=%__CrossComponentBinDir%
509 set "__CMakeBinDir=!__CMakeBinDir:\=/!"
510 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"
511 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
512 @if defined _echo @echo on
515 :SkipConfigureCrossBuild
516 if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
517 echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
521 if defined __ConfigureOnly goto SkipCrossCompBuild
523 set __BuildLogRootName=Cross
524 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
525 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
526 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
527 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
528 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
529 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
531 @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% -MSBuildNodeCount="/m:2" %__UnprocessedBuildArgs%
533 if not !errorlevel! == 0 (
534 echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
542 REM } Scope environment changes end
546 REM =========================================================================================
548 REM === CoreLib and NuGet package build section.
550 REM =========================================================================================
552 if %__BuildCoreLib% EQU 1 (
553 REM Scope environment changes start {
556 echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
557 rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
560 set __ExtraBuildArgs=
561 if not defined __IbcTuning (
562 set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
563 set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
566 if "%__BuildSOS%" == "0" (
567 set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
570 if /i "%__BuildArch%" == "arm64" (
571 set __nugetBuildArgs=-buildNugetPackage=false
572 ) else if "%__SkipNugetPackage%" == "1" (
573 set __nugetBuildArgs=-buildNugetPackage=false
575 set __nugetBuildArgs=-buildNugetPackage=true
578 set __BuildLogRootName=System.Private.CoreLib
579 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
580 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
581 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
582 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
583 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
584 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
586 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
588 if not !errorlevel! == 0 (
589 echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
596 REM } Scope environment changes end
600 REM Scope environment changes start {
603 REM Need diasymreader.dll on your path for /CreatePdb
604 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
606 if %__BuildNativeCoreLib% EQU 1 (
607 echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%. Logging to "%__CrossGenCoreLibLog%".
608 if exist "%__CrossGenCoreLibLog%" del "%__CrossGenCoreLibLog%"
610 REM Need VS native tools environment for the **target** arch when running instrumented binaries
611 if %__PgoInstrument% EQU 1 (
612 set __VCExecArch=%__BuildArch%
613 if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
614 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
615 call "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
616 @if defined _echo @echo on
617 if NOT !errorlevel! == 0 (
618 echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
622 REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
624 for /f "tokens=*" %%f in ('where pgort*.dll') do (
625 if not defined __PgoRtPath set "__PgoRtPath=%%~f"
627 echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
628 copy /y "!__PgoRtPath!" "%__BinDir%" || (
629 echo %__MsgPrefix%Error: copy failed
635 if defined __CrossgenAltJit (
636 REM Set altjit flags for the crossgen run. Note that this entire crossgen section is within a setlocal/endlocal scope,
637 REM so we don't need to save or unset these afterwards.
638 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%.
639 echo %__MsgPrefix%Setting altjit environment variables for %__CrossgenAltJit%. >> "%__CrossGenCoreLibLog%"
641 set COMPlus_AltJitNgen=*
642 set COMPlus_AltJitName=%__CrossgenAltJit%
643 set COMPlus_AltJitAssertOnNYI=1
644 set COMPlus_NoGuiOnAssert=1
645 set COMPlus_ContinueOnAssert=0
648 set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
649 echo %__MsgPrefix%!NEXTCMD!
650 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
651 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
652 if NOT !errorlevel! == 0 (
653 echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
654 :: Put it in the same log, helpful for Jenkins
655 type %__CrossGenCoreLibLog%
659 set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
660 echo %__MsgPrefix%!NEXTCMD!
661 echo %__MsgPrefix%!NEXTCMD! >> "%__CrossGenCoreLibLog%"
662 !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
663 if NOT !errorlevel! == 0 (
664 echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
665 :: Put it in the same log, helpful for Jenkins
666 type %__CrossGenCoreLibLog%
671 REM } Scope environment changes end
675 if %__BuildPackages% EQU 1 (
676 REM Scope environment changes start {
679 echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
681 set __BuildLogRootName=Nuget
682 set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
683 set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
684 set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
685 set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
686 set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
687 set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
689 REM The conditions as to what to build are captured in the builds file.
690 @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
692 if not !errorlevel! == 0 (
693 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
700 REM } Scope environment changes end
704 REM =========================================================================================
706 REM === Test build section
708 REM =========================================================================================
710 if %__BuildTests% EQU 1 (
711 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
713 REM Construct the arguments to pass to the test build script.
715 rem arm64 builds currently use private toolset which has not been released yet
716 REM TODO, remove once the toolset is open.
717 if not "%__ToolsetDir%" == "" call :PrivateToolSet
719 set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
720 echo %__MsgPrefix%!NEXTCMD!
723 if not !errorlevel! == 0 (
724 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
729 REM =========================================================================================
731 REM === All builds complete!
733 REM =========================================================================================
735 echo %__MsgPrefix%Repo successfully built. Finished at %TIME%
736 echo %__MsgPrefix%Product binaries are available at !__BinDir!
737 if %__BuildTests% EQU 1 (
738 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
742 REM =========================================================================================
744 REM === Handle the "all" case.
746 REM =========================================================================================
752 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
753 if %__TotalSpecifiedBuildArch% EQU 0 (
754 REM Nothing specified means we want to build all architectures.
755 set __BuildArchList=x64 x86 arm arm64
758 REM Otherwise, add all the specified architectures to the list.
760 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
761 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
762 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
763 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
767 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
768 if %__TotalSpecifiedBuildType% EQU 0 (
769 REM Nothing specified means we want to build all build types.
770 set __BuildTypeList=Debug Checked Release
773 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
774 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
775 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
777 REM Create a temporary file to collect build results. We always build all flavors specified, and
778 REM report a summary of the results at the end.
780 set __AllBuildSuccess=true
781 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
782 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
784 for %%i in (%__BuildArchList%) do (
785 for %%j in (%__BuildTypeList%) do (
786 call :BuildOne %%i %%j
790 if %__AllBuildSuccess%==true (
791 echo %__MsgPrefix%All builds succeeded!
794 echo %__MsgPrefix%Builds failed:
795 type %__BuildResultFile%
796 del /f /q %__BuildResultFile%
800 REM This code is unreachable, but leaving it nonetheless, just in case things change.
806 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
807 echo %__MsgPrefix%Invoking: %__NextCmd%
809 if not !errorlevel! == 0 (
810 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
811 set __AllBuildSuccess=false
815 REM =========================================================================================
817 REM === Helper routines
819 REM =========================================================================================
826 echo Build the CoreCLR repo.
829 echo build.cmd [option1] [option2]
831 echo build.cmd all [option1] [option2] -- ...
833 echo All arguments are optional. The options are:
835 echo.-? -h -help --help: view this message.
836 echo -all: Builds all configurations and platforms.
837 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
838 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
839 echo -- ... : all arguments following this tag will be passed directly to msbuild.
840 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
841 echo or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
842 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
844 echo add nativemscorlib to go further and build the native image for designated mscorlib.
845 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
846 echo -nopgooptimize: do not use profile guided optimizations.
847 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
848 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
849 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
850 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
851 echo -skipconfigure: skip CMake ^(default: CMake is run^)
852 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
853 echo -skipnative: skip building native components ^(default: native components are built^).
854 echo -skiptests: skip building tests ^(default: tests are built^).
855 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
856 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
857 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
858 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
859 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
860 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
861 echo -Rebuild: passes /t:rebuild to the build projects.
862 echo -crossgenaltjit ^<JIT dll^>: run crossgen using specified altjit ^(used for JIT testing^).
863 echo portable : build for portable RID.
865 echo If "all" is specified, then all build architectures and types are built. If, in addition,
866 echo one or more build architectures or types is specified, then only those build architectures
867 echo and types are built.
871 echo -- builds all architectures, and all build types per architecture
873 echo -- builds all build types for x86
874 echo build -all -x64 -x86 -Checked -Release
875 echo -- builds x64 and x86 architectures, Checked and Release build types for each
879 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
880 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
881 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
882 of the previous version to "%VSINSTALLDIR%" and then build.
883 :: DIA SDK not included in Express editions
884 echo Visual Studio Express does not include the DIA SDK. ^
885 You need Visual Studio 2015 or 2017 (Community is free).
886 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
891 echo %__MsgPrefix%Setting up the usage of __ToolsetDir:%__ToolsetDir%
893 if /i "%__ToolsetDir%" == "" (
894 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
898 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
899 call "%__ToolsetDir%"\buildenv_arm64.cmd
903 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
904 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
906 %__ToolsetDir%\VC_sdk\inc;^
907 %__ToolsetDir%\sdpublic\sdk\inc;^
908 %__ToolsetDir%\sdpublic\shared\inc;^
909 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
910 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
911 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
912 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
913 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
914 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
915 %__ToolsetDir%\diasdk\include