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