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