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