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