ARM32: fix interface dispatch cell address transfer
[platform/upstream/coreclr.git] / build.cmd
1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
3
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
6
7 :: Default to highest Visual Studio version available
8 ::
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.
12 ::
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.
16 ::
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
21 :: can be found.
22 if defined VS150COMNTOOLS (
23   set "__VSToolsRoot=%VS150COMNTOOLS%"
24   set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
25   set __VSVersion=vs2017
26 ) else (
27   set "__VSToolsRoot=%VS140COMNTOOLS%"
28   set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
29   set __VSVersion=vs2015
30 )
31
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%\
41 ::      __IntermediatesDir
42 ::      __PackagesBinDir    -- default: %__BinDir%\.nuget
43 ::      __TestWorkingDir    -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
44 ::
45 :: Thus, these variables are not simply internal to this script!
46
47 :: Set the default arguments for build
48 set __BuildArch=x64
49 set __BuildType=Debug
50 set __BuildOS=Windows_NT
51
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: "
55
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="
67
68 set __BuildAll=
69
70 set __BuildArchX64=0
71 set __BuildArchX86=0
72 set __BuildArchArm=0
73 set __BuildArchArm64=0
74
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"
80
81 set __PgoInstrument=0
82 set __PgoOptimize=1
83 set __EnforcePgo=0
84 set __IbcTuning=
85
86 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
87 REM when using "all".
88 set __PassThroughArgs=
89
90 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
91 set "__args= %*"
92 set processedArgs=
93 set __UnprocessedBuildArgs=
94 set __RunArgs=
95
96 set __BuildCoreLib=1
97 set __BuildNative=1
98 set __BuildTests=1
99 set __BuildPackages=1
100 set __BuildNativeCoreLib=1
101 set __RestoreOptData=1
102
103 :Arg_Loop
104 if "%1" == "" goto ArgsDone
105
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
110
111
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)
117
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)
121
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)
129
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)
133
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
138 ) else (
139     set __PassThroughArgs=%__PassThroughArgs% %1
140 )
141
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
165     shift&goto Arg_Loop
166 )
167
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
193     shift&goto Arg_Loop
194 )
195
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)
198
199 if [!processedArgs!]==[] (
200   set __UnprocessedBuildArgs=%__args%
201 ) else (
202   set __UnprocessedBuildArgs=%__args%
203   for %%t in (!processedArgs!) do (
204     set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
205   )
206 )
207
208 :ArgsDone
209
210 if %__PgoOptimize%==0 set __RestoreOptData=0
211
212 if defined __BuildAll goto BuildAll
213
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.
217     goto Usage
218 )
219
220 if %__BuildArchX64%==1      set __BuildArch=x64
221 if %__BuildArchX86%==1      set __BuildArch=x86
222 if %__BuildArchArm%==1 (
223     set __BuildArch=arm
224     set __CrossArch=x86
225 )
226 if %__BuildArchArm64%==1 (
227     set __BuildArch=arm64
228     set __CrossArch=x64
229 )
230
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.
234     goto Usage
235 )
236
237 if %__BuildTypeDebug%==1    set __BuildType=Debug
238 if %__BuildTypeChecked%==1  set __BuildType=Checked
239 if %__BuildTypeRelease%==1  set __BuildType=Release
240
241 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
242
243 if %__EnforcePgo%==1 (
244     if %__BuildArchArm%==1 (
245         echo NOTICE: enforcepgo does nothing on arm architecture
246     )
247     if %__BuildArchArm64%==1 (
248         echo NOTICE: enforcepgo does nothing on arm64 architecture
249     )
250 )
251
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"
262
263
264 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
265 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
266 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
267
268 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
269 set "__CMakeBinDir=%__BinDir%"
270 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
271
272 if not exist "%__BinDir%"           md "%__BinDir%"
273 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
274 if not exist "%__LogsDir%"          md "%__LogsDir%"
275
276 REM It is convinient to have your Nuget search path include the location where the build
277 REM will plass 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 agressively creating the directory. 
279 if not exist "%__BinDir%\.nuget\pkg"           md "%__BinDir%\.nuget\pkg"
280
281 echo %__MsgPrefix%Commencing CoreCLR Repo build
282
283 :: Set the remaining variables based upon the determined build configuration
284
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
288
289 REM =========================================================================================
290 REM ===
291 REM === Start the build steps
292 REM ===
293 REM =========================================================================================
294
295 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
296 call                                 "%__VSToolsRoot%\VsDevCmd.bat"
297 @if defined _echo @echo on
298
299 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs% 
300
301 REM =========================================================================================
302 REM ===
303 REM === Restore optimization profile data
304 REM ===
305 REM =========================================================================================
306
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.
312         exit /b 1
313     )
314 )
315
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%"
320     exit /b 1
321 )
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
325 )
326 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
327     set __IbcOptDataVersion=%%s
328 )
329
330 REM =========================================================================================
331 REM ===
332 REM === Build the CLR VM
333 REM ===
334 REM =========================================================================================
335
336 if %__BuildNative% EQU 1 (
337     REM Scope environment changes start {
338     setlocal
339
340     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
341
342     set nativePlatfromArgs=-platform=%__BuildArch%
343     if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
344
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.
348         call :PrivateToolSet
349         goto GenVSSolution
350     )
351
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
357         
358         REM Make CMake pick the highest installed version in the 10.0.* range
359         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
360     )
361
362     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
363     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
364     @if defined _echo @echo on
365
366     if not defined VSINSTALLDIR (
367         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
368         exit /b 1
369     )
370     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
371
372 :GenVSSolution
373     if defined __SkipConfigure goto SkipConfigure
374
375     echo %__MsgPrefix%Regenerating the Visual Studio solution
376
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
381     popd
382
383 :SkipConfigure
384     if defined __ConfigureOnly goto SkipNativeBuild
385
386     if not exist "%__IntermediatesDir%\install.vcxproj" (
387         echo %__MsgPrefix%Error: failed to generate native component build project!
388         exit /b 1
389     )
390
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!
398
399     @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
400
401     if not !errorlevel! == 0 (
402         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
403         echo     !__BuildLog!
404         echo     !__BuildWrn!
405         echo     !__BuildErr!
406         exit /b 1
407     )
408
409 :SkipNativeBuild
410     REM } Scope environment changes end
411     endlocal
412 )
413
414 REM =========================================================================================
415 REM ===
416 REM === Build Cross-Architecture Native Components (if applicable)
417 REM ===
418 REM =========================================================================================
419
420 if /i "%__BuildArch%"=="arm64" (
421     set __DoCrossArchBuild=1
422     )
423
424 if /i "%__BuildArch%"=="arm" (
425     set __DoCrossArchBuild=1
426     )
427
428 if /i "%__DoCrossArchBuild%"=="1" (
429     REM Scope environment changes start {
430     setlocal
431
432     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
433
434     :: Set the environment for the native build
435     set __VCBuildArch=x86_amd64
436     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
437
438     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
439     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
440     @if defined _echo @echo on
441
442     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
443     if defined __SkipConfigure goto SkipConfigureCrossBuild
444
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
451     popd
452
453 :SkipConfigureCrossBuild
454     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
455         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
456         exit /b 1
457     )
458
459     if defined __ConfigureOnly goto SkipCrossCompBuild
460
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!
468
469     @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
470
471     if not !errorlevel! == 0 (
472         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
473         echo     !__BuildLog!
474         echo     !__BuildWrn!
475         echo     !__BuildErr!
476         exit /b 1
477     )    
478
479 :SkipCrossCompBuild
480     REM } Scope environment changes end
481     endlocal
482 )
483
484 REM =========================================================================================
485 REM ===
486 REM === CoreLib and NuGet package build section.
487 REM ===
488 REM =========================================================================================
489
490 if %__BuildCoreLib% EQU 1 (
491     REM Scope environment changes start {
492     setlocal
493
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
496     set Platform=
497
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
502     )
503
504     if /i "%__BuildArch%" == "arm64" (
505         set __nugetBuildArgs=-buildNugetPackage=false
506     ) else if "%__SkipNugetPackage%" == "1" (
507         set __nugetBuildArgs=-buildNugetPackage=false
508     ) else (
509         set __nugetBuildArgs=-buildNugetPackage=true
510     )
511
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!
519
520     @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
521
522     if not !errorlevel! == 0 (
523         echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
524         echo     !__BuildLog!
525         echo     !__BuildWrn!
526         echo     !__BuildErr!
527         exit /b 1
528     )
529
530     REM } Scope environment changes end
531     endlocal
532 )
533
534 REM Scope environment changes start {
535 setlocal
536
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
539
540 if %__BuildNativeCoreLib% EQU 1 (
541     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
542
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!
552             goto CrossgenFailure
553         )
554
555         REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
556         set __PgoRtPath=
557         for /f "tokens=*" %%f in ('where pgort*.dll') do (
558           if not defined __PgoRtPath set "__PgoRtPath=%%~f"
559         )
560         echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
561         copy /y "!__PgoRtPath!" "%__BinDir%" || (
562           echo %__MsgPrefix%Error: copy failed
563           goto CrossgenFailure
564         )
565         REM End HACK
566     )
567
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%
575         goto CrossgenFailure
576     )
577
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%
585         goto CrossgenFailure
586     )
587 )
588
589 REM } Scope environment changes end
590 endlocal
591
592
593 if %__BuildPackages% EQU 1 (
594     REM Scope environment changes start {
595     setlocal
596
597     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
598
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!
606
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%
609
610     if not !errorlevel! == 0 (
611         echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
612         echo     !__BuildLog!
613         echo     !__BuildWrn!
614         echo     !__BuildErr!
615         exit /b 1
616     )
617
618     REM } Scope environment changes end
619     endlocal
620 )
621
622 REM =========================================================================================
623 REM ===
624 REM === Test build section
625 REM ===
626 REM =========================================================================================
627
628 if %__BuildTests% EQU 1 (
629     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
630
631     REM Construct the arguments to pass to the test build script.
632
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 
636
637     set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
638     echo %__MsgPrefix%!NEXTCMD!
639     !NEXTCMD!
640
641     if not !errorlevel! == 0 (
642         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
643         exit /b 1
644     )
645
646
647 REM =========================================================================================
648 REM ===
649 REM === All builds complete!
650 REM ===
651 REM =========================================================================================
652
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!
657 )
658 exit /b 0
659
660 REM =========================================================================================
661 REM ===
662 REM === Handle the "all" case.
663 REM ===
664 REM =========================================================================================
665
666 :BuildAll
667
668 set __BuildArchList=
669
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
674 )
675
676 REM Otherwise, add all the specified architectures to the list.
677
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
682
683 set __BuildTypeList=
684
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
689 )
690
691 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
692 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
693 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
694
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.
697
698 set __AllBuildSuccess=true
699 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
700 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
701
702 for %%i in (%__BuildArchList%) do (
703     for %%j in (%__BuildTypeList%) do (
704         call :BuildOne %%i %%j
705     )
706 )
707
708 if %__AllBuildSuccess%==true (
709     echo %__MsgPrefix%All builds succeeded!
710     exit /b 0
711 ) else (
712     echo %__MsgPrefix%Builds failed:
713     type %__BuildResultFile%
714     del /f /q %__BuildResultFile%
715     exit /b 1
716 )
717
718 REM This code is unreachable, but leaving it nonetheless, just in case things change.
719 exit /b 99
720
721 :BuildOne
722 set __BuildArch=%1
723 set __BuildType=%2
724 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
725 echo %__MsgPrefix%Invoking: %__NextCmd%
726 %__NextCmd%
727 if not !errorlevel! == 0 (
728     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
729     set __AllBuildSuccess=false
730 )
731 exit /b 0
732
733 REM =========================================================================================
734 REM ===
735 REM === Helper routines
736 REM ===
737 REM =========================================================================================
738
739 :CrossgenFailure
740 exit /b 1
741
742 :Usage
743 echo.
744 echo Build the CoreCLR repo.
745 echo.
746 echo Usage:
747 echo     build.cmd [option1] [option2]
748 echo or:
749 echo     build.cmd all [option1] [option2] -- ...
750 echo.
751 echo All arguments are optional. The options are:
752 echo.
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,
761 echo     respectively^).
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.
782 echo.
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.
786 echo.
787 echo For example:
788 echo     build -all
789 echo        -- builds all architectures, and all build types per architecture
790 echo     build -all -x86
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
794 exit /b 1
795
796 :NoDIA
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
805 exit /b 1
806
807 :PrivateToolSet
808
809 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
810
811 if /i "%__ToolsetDir%" == "" (
812     echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
813     exit /b 1
814 )
815
816 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
817 call "%__ToolsetDir%"\buildenv_arm64.cmd
818 exit /b 0
819
820 :Not_EWDK
821 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
822 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
823 set INCLUDE=^
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
834 exit /b 0