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