Merge pull request #14496 from wtgodbe/WorkingDir
[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
23 if defined VisualStudioVersion goto :Run
24
25 set _VSWHERE="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
26 if exist %_VSWHERE% (
27   for /f "usebackq tokens=*" %%i in (`%_VSWHERE% -latest -property installationPath`) do set _VSCOMNTOOLS=%%i\Common7\Tools
28 )
29 if not exist "%_VSCOMNTOOLS%" set _VSCOMNTOOLS=%VS140COMNTOOLS%
30 if not exist "%_VSCOMNTOOLS%" (
31   echo Error: Visual Studio 2015 or 2017 required.
32   echo        Please see https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/developer-guide.md for build instructions.
33   exit /b 1
34 )
35
36 call "%_VSCOMNTOOLS%\VsDevCmd.bat"
37
38 :Run
39
40 if defined VS150COMNTOOLS (
41   set "__VSToolsRoot=%VS150COMNTOOLS%"
42   set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
43   set __VSVersion=vs2017
44 ) else (
45   set "__VSToolsRoot=%VS140COMNTOOLS%"
46   set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
47   set __VSVersion=vs2015
48 )
49
50 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
51 ::      __BuildArch         -- default: x64
52 ::      __BuildType         -- default: Debug
53 ::      __BuildOS           -- default: Windows_NT
54 ::      __ProjectDir        -- default: directory of the dir.props file
55 ::      __SourceDir         -- default: %__ProjectDir%\src\
56 ::      __PackagesDir       -- default: %__ProjectDir%\packages\
57 ::      __RootBinDir        -- default: %__ProjectDir%\bin\
58 ::      __BinDir            -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
59 ::      __IntermediatesDir
60 ::      __PackagesBinDir    -- default: %__BinDir%\.nuget
61 ::      __TestWorkingDir    -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
62 ::
63 :: Thus, these variables are not simply internal to this script!
64
65 :: Set the default arguments for build
66 set __BuildArch=x64
67 set __BuildType=Debug
68 set __BuildOS=Windows_NT
69
70 :: Define a prefix for most output progress messages that come from this script. That makes
71 :: it easier to see where these are coming from. Note that there is a trailing space here.
72 set "__MsgPrefix=BUILD: "
73
74 :: Set the various build properties here so that CMake and MSBuild can pick them up
75 set "__ProjectDir=%~dp0"
76 :: remove trailing slash
77 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
78 set "__ProjectFilesDir=%__ProjectDir%"
79 set "__SourceDir=%__ProjectDir%\src"
80 set "__PackagesDir=%__ProjectDir%\packages"
81 set "__RootBinDir=%__ProjectDir%\bin"
82 set "__LogsDir=%__RootBinDir%\Logs"
83 set "__PgoOptDataVersion="
84 set "__IbcOptDataVersion="
85
86 set __BuildAll=
87
88 set __BuildArchX64=0
89 set __BuildArchX86=0
90 set __BuildArchArm=0
91 set __BuildArchArm64=0
92
93 set __BuildTypeDebug=0
94 set __BuildTypeChecked=0
95 set __BuildTypeRelease=0
96 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
97 set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=0"
98
99 set __PgoInstrument=0
100 set __PgoOptimize=1
101 set __EnforcePgo=0
102 set __IbcTuning=
103
104 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
105 REM when using "all".
106 set __PassThroughArgs=
107
108 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
109 set "__args= %*"
110 set processedArgs=
111 set __UnprocessedBuildArgs=
112 set __RunArgs=
113
114 set __BuildCoreLib=1
115 set __BuildSOS=1
116 set __BuildNative=1
117 set __BuildTests=1
118 set __BuildPackages=1
119 set __BuildNativeCoreLib=1
120 set __RestoreOptData=1
121
122 :Arg_Loop
123 if "%1" == "" goto ArgsDone
124
125 if /i "%1" == "-?"    goto Usage
126 if /i "%1" == "-h"    goto Usage
127 if /i "%1" == "-help" goto Usage
128 if /i "%1" == "--help" goto Usage
129
130
131 if /i "%1" == "-all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
132 if /i "%1" == "-x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "-x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "-arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "-arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136
137 if /i "%1" == "-debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 if /i "%1" == "-checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
139 if /i "%1" == "-release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140
141 REM TODO these are deprecated remove them eventually
142 REM don't add more, use the - syntax instead
143 if /i "%1" == "all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
144 if /i "%1" == "x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
145 if /i "%1" == "x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146 if /i "%1" == "arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
147 if /i "%1" == "arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
148
149 if /i "%1" == "debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
150 if /i "%1" == "checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
151 if /i "%1" == "release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
152
153 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
154 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
155 if [!__PassThroughArgs!]==[] (
156     set __PassThroughArgs=%1
157 ) else (
158     set __PassThroughArgs=%__PassThroughArgs% %1
159 )
160
161 if /i "%1" == "-freebsdmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
162 if /i "%1" == "-linuxmscorlib"       (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
163 if /i "%1" == "-netbsdmscorlib"      (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
164 if /i "%1" == "-osxmscorlib"         (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
165 if /i "%1" == "-windowsmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
166 if /i "%1" == "-nativemscorlib"      (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
167 if /i "%1" == "-configureonly"       (set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
168 if /i "%1" == "-skipconfigure"       (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
169 if /i "%1" == "-skipmscorlib"        (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
170 if /i "%1" == "-skipnative"          (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
171 if /i "%1" == "-skiptests"           (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
172 if /i "%1" == "-skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
173 if /i "%1" == "-skiprestoreoptdata"  (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
174 if /i "%1" == "-usenmakemakefiles"   (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
175 if /i "%1" == "-pgoinstrument"       (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
176 if /i "%1" == "-enforcepgo"          (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
177 if /i "%1" == "-nopgooptimize"       (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
178 if /i "%1" == "-ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
179 if /i "%1" == "-toolset_dir"         (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
180 if /i "%1" == "-buildstandalonegc"   (
181     set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"
182     set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=1"
183     set processedArgs=!processedArgs! %1
184     shift&goto Arg_Loop
185 )
186
187 REM TODO these are deprecated remove them eventually
188 REM don't add more, use the - syntax instead
189 if /i "%1" == "freebsdmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=FreeBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
190 if /i "%1" == "linuxmscorlib"       (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Linux&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
191 if /i "%1" == "netbsdmscorlib"      (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=NetBSD&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
192 if /i "%1" == "osxmscorlib"         (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=OSX&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
193 if /i "%1" == "windowsmscorlib"     (set __BuildSOS=0&set __BuildNativeCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set __BuildOS=Windows_NT&set __SkipNugetPackage=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
194 if /i "%1" == "nativemscorlib"      (set __BuildNativeCoreLib=1&set __BuildCoreLib=0&set __BuildNative=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
195 if /i "%1" == "configureonly"       (set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
196 if /i "%1" == "skipconfigure"       (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
197 if /i "%1" == "skipmscorlib"        (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
198 if /i "%1" == "skipnative"          (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
199 if /i "%1" == "skiptests"           (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
200 if /i "%1" == "skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
201 if /i "%1" == "skiprestoreoptdata"  (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
202 if /i "%1" == "usenmakemakefiles"   (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
203 if /i "%1" == "pgoinstrument"       (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
204 if /i "%1" == "nopgooptimize"       (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
205 if /i "%1" == "enforcepgo"          (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
206 if /i "%1" == "ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
207 if /i "%1" == "toolset_dir"         (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
208 if /i "%1" == "buildstandalonegc"   (
209     set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"
210     set __BuildStandaloneGCOnly="-DFEATURE_STANDALONE_GC_ONLY=1"
211     set processedArgs=!processedArgs! %1
212     shift&goto Arg_Loop
213 )
214
215 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
216 if /i "%1" == "altjitcrossgen"      (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
217
218 if [!processedArgs!]==[] (
219   set __UnprocessedBuildArgs=%__args%
220 ) else (
221   set __UnprocessedBuildArgs=%__args%
222   for %%t in (!processedArgs!) do (
223     set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
224   )
225 )
226
227 :ArgsDone
228
229 if %__PgoOptimize%==0 set __RestoreOptData=0
230
231 if defined __BuildAll goto BuildAll
232
233 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
234 if %__TotalSpecifiedBuildArch% GTR 1 (
235     echo Error: more than one build architecture specified, but "all" not specified.
236     goto Usage
237 )
238
239 if %__BuildArchX64%==1      set __BuildArch=x64
240 if %__BuildArchX86%==1      set __BuildArch=x86
241 if %__BuildArchArm%==1 (
242     set __BuildArch=arm
243     set __CrossArch=x86
244 )
245 if %__BuildArchArm64%==1 (
246     set __BuildArch=arm64
247     set __CrossArch=x64
248 )
249
250 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
251 if %__TotalSpecifiedBuildType% GTR 1 (
252     echo Error: more than one build type specified, but "all" not specified.
253     goto Usage
254 )
255
256 if %__BuildTypeDebug%==1    set __BuildType=Debug
257 if %__BuildTypeChecked%==1  set __BuildType=Checked
258 if %__BuildTypeRelease%==1  set __BuildType=Release
259
260 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
261
262 if %__EnforcePgo%==1 (
263     if %__BuildArchArm%==1 (
264         echo NOTICE: enforcepgo does nothing on arm architecture
265     )
266     if %__BuildArchArm64%==1 (
267         echo NOTICE: enforcepgo does nothing on arm64 architecture
268     )
269 )
270
271 :: Set the remaining variables based upon the determined build configuration
272 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
273 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
274 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
275 set "__PackagesBinDir=%__BinDir%\.nuget"
276 set "__TestRootDir=%__RootBinDir%\tests"
277 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
278 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
279 set "__CrossComponentBinDir=%__BinDir%"
280 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
281
282
283 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
284 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
285 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
286
287 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
288 set "__CMakeBinDir=%__BinDir%"
289 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
290
291 if not exist "%__BinDir%"           md "%__BinDir%"
292 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
293 if not exist "%__LogsDir%"          md "%__LogsDir%"
294
295 REM It is convenient to have your Nuget search path include the location where the build
296 REM will place packages.  However nuget used during the build will fail if that directory
297 REM does not exist.   Avoid this in at least one case by aggressively creating the directory.
298 if not exist "%__BinDir%\.nuget\pkg"           md "%__BinDir%\.nuget\pkg"
299
300 echo %__MsgPrefix%Commencing CoreCLR Repo build
301
302 :: Set the remaining variables based upon the determined build configuration
303
304 echo %__MsgPrefix%Checking prerequisites
305 :: Eval the output from probe-win1.ps1
306 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
307
308 REM =========================================================================================
309 REM ===
310 REM === Start the build steps
311 REM ===
312 REM =========================================================================================
313
314 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
315 call                                 "%__VSToolsRoot%\VsDevCmd.bat"
316 @if defined _echo @echo on
317
318 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs%
319
320 REM =========================================================================================
321 REM ===
322 REM === Restore optimization profile data
323 REM ===
324 REM =========================================================================================
325
326 if %__RestoreOptData% EQU 1 if %__BuildTypeRelease% EQU 1 (
327     echo %__MsgPrefix%Restoring the OptimizationData Package
328     @call %__ProjectDir%\run.cmd sync -optdata
329     if not !errorlevel! == 0 (
330         echo %__MsgPrefix%Error: Failed to restore the optimization data package.
331         exit /b 1
332     )
333 )
334
335 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
336 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
337 if not exist "%DotNetCli%" (
338     echo %__MsgPrefix%Assertion failed: dotnet.exe not found at path "%DotNetCli%"
339     exit /b 1
340 )
341 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
342 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
343     set __PgoOptDataVersion=%%s
344 )
345 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
346     set __IbcOptDataVersion=%%s
347 )
348
349 REM =========================================================================================
350 REM ===
351 REM === Build the CLR VM
352 REM ===
353 REM =========================================================================================
354
355 if %__BuildNative% EQU 1 (
356     REM Scope environment changes start {
357     setlocal
358
359     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
360
361     set nativePlatfromArgs=-platform=%__BuildArch%
362     if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
363
364     if /i "%__BuildArch%" == "arm64" (
365         rem arm64 builds currently use private toolset which has not been released yet
366         REM TODO, remove once the toolset is open.
367         call :PrivateToolSet
368         goto GenVSSolution
369     )
370
371     :: Set the environment for the native build
372     set __VCBuildArch=x86_amd64
373     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
374     if /i "%__BuildArch%" == "arm" (
375         set __VCBuildArch=x86_arm
376
377         REM Make CMake pick the highest installed version in the 10.0.* range
378         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
379     )
380
381     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
382     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
383     @if defined _echo @echo on
384
385     if not defined VSINSTALLDIR (
386         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
387         exit /b 1
388     )
389     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
390
391 :GenVSSolution
392     if defined __SkipConfigure goto SkipConfigure
393
394     echo %__MsgPrefix%Regenerating the Visual Studio solution
395
396     pushd "%__IntermediatesDir%"
397     set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%"
398     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildStandaloneGC% %__BuildStandaloneGCOnly% !__ExtraCmakeArgs!
399     @if defined _echo @echo on
400     popd
401
402 :SkipConfigure
403     if defined __ConfigureOnly goto SkipNativeBuild
404
405     if not exist "%__IntermediatesDir%\install.vcxproj" (
406         echo %__MsgPrefix%Error: failed to generate native component build project!
407         exit /b 1
408     )
409
410     set __BuildLogRootName=CoreCLR
411     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
412     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
413     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
414     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
415     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
416     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
417
418     @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
419
420     if not !errorlevel! == 0 (
421         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
422         echo     !__BuildLog!
423         echo     !__BuildWrn!
424         echo     !__BuildErr!
425         exit /b 1
426     )
427
428 :SkipNativeBuild
429     REM } Scope environment changes end
430     endlocal
431 )
432
433 REM =========================================================================================
434 REM ===
435 REM === Build Cross-Architecture Native Components (if applicable)
436 REM ===
437 REM =========================================================================================
438
439 if /i "%__BuildArch%"=="arm64" (
440     set __DoCrossArchBuild=1
441     )
442
443 if /i "%__BuildArch%"=="arm" (
444     set __DoCrossArchBuild=1
445     )
446
447 if /i "%__DoCrossArchBuild%"=="1" (
448     REM Scope environment changes start {
449     setlocal
450
451     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
452
453     :: Set the environment for the native build
454     set __VCBuildArch=x86_amd64
455     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
456
457     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
458     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
459     @if defined _echo @echo on
460
461     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
462     if defined __SkipConfigure goto SkipConfigureCrossBuild
463
464     pushd "%__CrossCompIntermediatesDir%"
465     set __CMakeBinDir=%__CrossComponentBinDir%
466     set "__CMakeBinDir=!__CMakeBinDir:\=/!"
467     set __ExtraCmakeArgs="-DCLR_CROSS_COMPONENTS_BUILD=1" "-DCLR_CMAKE_TARGET_ARCH=%__BuildArch%" "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%"
468     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
469     @if defined _echo @echo on
470     popd
471
472 :SkipConfigureCrossBuild
473     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
474         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
475         exit /b 1
476     )
477
478     if defined __ConfigureOnly goto SkipCrossCompBuild
479
480     set __BuildLogRootName=Cross
481     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
482     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
483     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
484     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
485     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
486     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
487
488     @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
489
490     if not !errorlevel! == 0 (
491         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
492         echo     !__BuildLog!
493         echo     !__BuildWrn!
494         echo     !__BuildErr!
495         exit /b 1
496     )
497
498 :SkipCrossCompBuild
499     REM } Scope environment changes end
500     endlocal
501 )
502
503 REM =========================================================================================
504 REM ===
505 REM === CoreLib and NuGet package build section.
506 REM ===
507 REM =========================================================================================
508
509 if %__BuildCoreLib% EQU 1 (
510     REM Scope environment changes start {
511     setlocal
512
513     echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
514     rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
515     set Platform=
516
517     set __ExtraBuildArgs=
518     if not defined __IbcTuning (
519       set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
520       set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
521     )
522
523     if "%__BuildSOS%" == "0" (
524         set __ExtraBuildArgs=!__ExtraBuildArgs! -SkipSOS=true
525     )
526
527     if /i "%__BuildArch%" == "arm64" (
528         set __nugetBuildArgs=-buildNugetPackage=false
529     ) else if "%__SkipNugetPackage%" == "1" (
530         set __nugetBuildArgs=-buildNugetPackage=false
531     ) else (
532         set __nugetBuildArgs=-buildNugetPackage=true
533     )
534
535     set __BuildLogRootName=System.Private.CoreLib
536     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
537     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
538     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
539     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
540     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
541     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
542
543     @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
544
545     if not !errorlevel! == 0 (
546         echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
547         echo     !__BuildLog!
548         echo     !__BuildWrn!
549         echo     !__BuildErr!
550         exit /b 1
551     )
552
553     REM } Scope environment changes end
554     endlocal
555 )
556
557 REM Scope environment changes start {
558 setlocal
559
560 REM Need diasymreader.dll on your path for /CreatePdb
561 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
562
563 if %__BuildNativeCoreLib% EQU 1 (
564     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
565
566     REM Need VS native tools environment for the **target** arch when running instrumented binaries
567     if %__PgoInstrument% EQU 1 (
568         set __VCExecArch=%__BuildArch%
569         if /i [%__BuildArch%] == [x64] set __VCExecArch=amd64
570         echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
571         call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCExecArch!
572         @if defined _echo @echo on
573         if NOT !errorlevel! == 0 (
574             echo %__MsgPrefix%Error: Failed to load native tools environment for !__VCExecArch!
575             goto CrossgenFailure
576         )
577
578         REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
579         set __PgoRtPath=
580         for /f "tokens=*" %%f in ('where pgort*.dll') do (
581           if not defined __PgoRtPath set "__PgoRtPath=%%~f"
582         )
583         echo %__MsgPrefix%Copying "!__PgoRtPath!" into "%__BinDir%"
584         copy /y "!__PgoRtPath!" "%__BinDir%" || (
585           echo %__MsgPrefix%Error: copy failed
586           goto CrossgenFailure
587         )
588         REM End HACK
589     )
590
591     set NEXTCMD="%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
592     echo %__MsgPrefix%!NEXTCMD!
593     !NEXTCMD! > "%__CrossGenCoreLibLog%" 2>&1
594     if NOT !errorlevel! == 0 (
595         echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
596         :: Put it in the same log, helpful for Jenkins
597         type %__CrossGenCoreLibLog%
598         goto CrossgenFailure
599     )
600
601     set NEXTCMD="%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll"
602     echo %__MsgPrefix%!NEXTCMD!
603     !NEXTCMD! >> "%__CrossGenCoreLibLog%" 2>&1
604     if NOT !errorlevel! == 0 (
605         echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
606         :: Put it in the same log, helpful for Jenkins
607         type %__CrossGenCoreLibLog%
608         goto CrossgenFailure
609     )
610 )
611
612 REM } Scope environment changes end
613 endlocal
614
615
616 if %__BuildPackages% EQU 1 (
617     REM Scope environment changes start {
618     setlocal
619
620     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
621
622     set __BuildLogRootName=Nuget
623     set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
624     set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
625     set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
626     set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
627     set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
628     set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
629
630     REM The conditions as to what to build are captured in the builds file.
631     @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
632
633     if not !errorlevel! == 0 (
634         echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
635         echo     !__BuildLog!
636         echo     !__BuildWrn!
637         echo     !__BuildErr!
638         exit /b 1
639     )
640
641     REM } Scope environment changes end
642     endlocal
643 )
644
645 REM =========================================================================================
646 REM ===
647 REM === Test build section
648 REM ===
649 REM =========================================================================================
650
651 if %__BuildTests% EQU 1 (
652     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
653
654     REM Construct the arguments to pass to the test build script.
655
656     rem arm64 builds currently use private toolset which has not been released yet
657     REM TODO, remove once the toolset is open.
658     if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
659
660     set NEXTCMD=call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
661     echo %__MsgPrefix%!NEXTCMD!
662     !NEXTCMD!
663
664     if not !errorlevel! == 0 (
665         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
666         exit /b 1
667     )
668 )
669
670 REM =========================================================================================
671 REM ===
672 REM === All builds complete!
673 REM ===
674 REM =========================================================================================
675
676 echo %__MsgPrefix%Repo successfully built.  Finished at %TIME%
677 echo %__MsgPrefix%Product binaries are available at !__BinDir!
678 if %__BuildTests% EQU 1 (
679     echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
680 )
681 exit /b 0
682
683 REM =========================================================================================
684 REM ===
685 REM === Handle the "all" case.
686 REM ===
687 REM =========================================================================================
688
689 :BuildAll
690
691 set __BuildArchList=
692
693 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
694 if %__TotalSpecifiedBuildArch% EQU 0 (
695     REM Nothing specified means we want to build all architectures.
696     set __BuildArchList=x64 x86 arm arm64
697 )
698
699 REM Otherwise, add all the specified architectures to the list.
700
701 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
702 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
703 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
704 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
705
706 set __BuildTypeList=
707
708 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
709 if %__TotalSpecifiedBuildType% EQU 0 (
710     REM Nothing specified means we want to build all build types.
711     set __BuildTypeList=Debug Checked Release
712 )
713
714 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
715 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
716 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
717
718 REM Create a temporary file to collect build results. We always build all flavors specified, and
719 REM report a summary of the results at the end.
720
721 set __AllBuildSuccess=true
722 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
723 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
724
725 for %%i in (%__BuildArchList%) do (
726     for %%j in (%__BuildTypeList%) do (
727         call :BuildOne %%i %%j
728     )
729 )
730
731 if %__AllBuildSuccess%==true (
732     echo %__MsgPrefix%All builds succeeded!
733     exit /b 0
734 ) else (
735     echo %__MsgPrefix%Builds failed:
736     type %__BuildResultFile%
737     del /f /q %__BuildResultFile%
738     exit /b 1
739 )
740
741 REM This code is unreachable, but leaving it nonetheless, just in case things change.
742 exit /b 99
743
744 :BuildOne
745 set __BuildArch=%1
746 set __BuildType=%2
747 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
748 echo %__MsgPrefix%Invoking: %__NextCmd%
749 %__NextCmd%
750 if not !errorlevel! == 0 (
751     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
752     set __AllBuildSuccess=false
753 )
754 exit /b 0
755
756 REM =========================================================================================
757 REM ===
758 REM === Helper routines
759 REM ===
760 REM =========================================================================================
761
762 :CrossgenFailure
763 exit /b 1
764
765 :Usage
766 echo.
767 echo Build the CoreCLR repo.
768 echo.
769 echo Usage:
770 echo     build.cmd [option1] [option2]
771 echo or:
772 echo     build.cmd all [option1] [option2] -- ...
773 echo.
774 echo All arguments are optional. The options are:
775 echo.
776 echo.-? -h -help --help: view this message.
777 echo -all: Builds all configurations and platforms.
778 echo Build architecture: one of -x64, -x86, -arm, -arm64 ^(default: -x64^).
779 echo Build type: one of -Debug, -Checked, -Release ^(default: -Debug^).
780 echo -- ... : all arguments following this tag will be passed directly to msbuild.
781 echo mscorlib version: one of -freebsdmscorlib, -linuxmscorlib, -netbsdmscorlib, -osxmscorlib,
782 echo     or -windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
783 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
784 echo     respectively^).
785 echo     add nativemscorlib to go further and build the native image for designated mscorlib.
786 echo -toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
787 echo -nopgooptimize: do not use profile guided optimizations.
788 echo -enforcepgo: verify after the build that PGO was used for key DLLs, and fail the build if not
789 echo -pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
790 echo -ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
791 echo -configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
792 echo -skipconfigure: skip CMake ^(default: CMake is run^)
793 echo -skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
794 echo -skipnative: skip building native components ^(default: native components are built^).
795 echo -skiptests: skip building tests ^(default: tests are built^).
796 echo -skipbuildpackages: skip building nuget packages ^(default: packages are built^).
797 echo -skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
798 echo -buildstandalonegc: builds the GC in a standalone mode.
799 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
800 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
801 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
802 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
803 echo -Rebuild: passes /t:rebuild to the build projects.
804 echo portable : build for portable RID.
805 echo.
806 echo If "all" is specified, then all build architectures and types are built. If, in addition,
807 echo one or more build architectures or types is specified, then only those build architectures
808 echo and types are built.
809 echo.
810 echo For example:
811 echo     build -all
812 echo        -- builds all architectures, and all build types per architecture
813 echo     build -all -x86
814 echo        -- builds all build types for x86
815 echo     build -all -x64 -x86 -Checked -Release
816 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
817 exit /b 1
818
819 :NoDIA
820 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
821 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
822 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
823 of the previous version to "%VSINSTALLDIR%" and then build.
824 :: DIA SDK not included in Express editions
825 echo Visual Studio Express does not include the DIA SDK. ^
826 You need Visual Studio 2015 or 2017 (Community is free).
827 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
828 exit /b 1
829
830 :PrivateToolSet
831
832 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
833
834 if /i "%__ToolsetDir%" == "" (
835     echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
836     exit /b 1
837 )
838
839 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
840 call "%__ToolsetDir%"\buildenv_arm64.cmd
841 exit /b 0
842
843 :Not_EWDK
844 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
845 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
846 set INCLUDE=^
847 %__ToolsetDir%\VC_sdk\inc;^
848 %__ToolsetDir%\sdpublic\sdk\inc;^
849 %__ToolsetDir%\sdpublic\shared\inc;^
850 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
851 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
852 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
853 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
854 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
855 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
856 %__ToolsetDir%\diasdk\include
857 exit /b 0