Merge pull request #11957 from sjsinju/spill_temp_size
[platform/upstream/coreclr.git] / build.cmd
1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
3
4 echo Starting Build at %TIME%
5 set __ThisScriptFull="%~f0"
6
7 :: Default to highest Visual Studio version available
8 ::
9 :: For VS2015 (and prior), only a single instance is allowed to be installed on a box
10 :: and VS140COMNTOOLS is set as a global environment variable by the installer. This
11 :: allows users to locate where the instance of VS2015 is installed.
12 ::
13 :: For VS2017, multiple instances can be installed on the same box SxS and VS150COMNTOOLS
14 :: is no longer set as a global environment variable and is instead only set if the user
15 :: has launched the VS2017 Developer Command Prompt.
16 ::
17 :: Following this logic, we will default to the VS2017 toolset if VS150COMNTOOLS tools is
18 :: set, as this indicates the user is running from the VS2017 Developer Command Prompt and
19 :: is already configured to use that toolset. Otherwise, we will fallback to using the VS2015
20 :: toolset if it is installed. Finally, we will fail the script if no supported VS instance
21 :: can be found.
22 if defined VS150COMNTOOLS (
23   set "__VSToolsRoot=%VS150COMNTOOLS%"
24   set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
25   set __VSVersion=vs2017
26 ) else (
27   set "__VSToolsRoot=%VS140COMNTOOLS%"
28   set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
29   set __VSVersion=vs2015
30 )
31
32 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
33 ::      __BuildArch         -- default: x64
34 ::      __BuildType         -- default: Debug
35 ::      __BuildOS           -- default: Windows_NT
36 ::      __ProjectDir        -- default: directory of the dir.props file
37 ::      __SourceDir         -- default: %__ProjectDir%\src\
38 ::      __PackagesDir       -- default: %__ProjectDir%\packages\
39 ::      __RootBinDir        -- default: %__ProjectDir%\bin\
40 ::      __BinDir            -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
41 ::      __IntermediatesDir
42 ::      __PackagesBinDir    -- default: %__BinDir%\.nuget
43 ::      __TestWorkingDir    -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
44 ::
45 :: Thus, these variables are not simply internal to this script!
46
47 :: Set the default arguments for build
48 set __BuildArch=x64
49 set __BuildType=Debug
50 set __BuildOS=Windows_NT
51
52 :: Define a prefix for most output progress messages that come from this script. That makes
53 :: it easier to see where these are coming from. Note that there is a trailing space here.
54 set "__MsgPrefix=BUILD: "
55
56 :: Set the various build properties here so that CMake and MSBuild can pick them up
57 set "__ProjectDir=%~dp0"
58 :: remove trailing slash
59 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
60 set "__ProjectFilesDir=%__ProjectDir%"
61 set "__SourceDir=%__ProjectDir%\src"
62 set "__PackagesDir=%__ProjectDir%\packages"
63 set "__RootBinDir=%__ProjectDir%\bin"
64 set "__LogsDir=%__RootBinDir%\Logs"
65 set "__PgoOptDataVersion="
66 set "__IbcOptDataVersion="
67
68 set __BuildAll=
69
70 set __BuildArchX64=0
71 set __BuildArchX86=0
72 set __BuildArchArm=0
73 set __BuildArchArm64=0
74
75 set __BuildTypeDebug=0
76 set __BuildTypeChecked=0
77 set __BuildTypeRelease=0
78 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
79
80 set __PgoInstrument=0
81 set __IbcTuning=
82
83 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
84 REM when using "all".
85 set __PassThroughArgs=
86
87 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
88 set "__args= %*"
89 set processedArgs=
90 set __UnprocessedBuildArgs=
91 set __RunArgs=
92
93 set __BuildCoreLib=1
94 set __BuildNative=1
95 set __BuildTests=1
96 set __BuildPackages=1
97 set __BuildNativeCoreLib=1
98 set __RestoreOptData=1
99
100 :Arg_Loop
101 if "%1" == "" goto ArgsDone
102
103 if /i "%1" == "-?"    goto Usage
104 if /i "%1" == "-h"    goto Usage
105 if /i "%1" == "-help" goto Usage
106
107 if /i "%1" == "all"                 (set __BuildAll=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
108 if /i "%1" == "x64"                 (set __BuildArchX64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
109 if /i "%1" == "x86"                 (set __BuildArchX86=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
110 if /i "%1" == "arm"                 (set __BuildArchArm=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
111 if /i "%1" == "arm64"               (set __BuildArchArm64=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
112
113 if /i "%1" == "debug"               (set __BuildTypeDebug=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
114 if /i "%1" == "checked"             (set __BuildTypeChecked=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
115 if /i "%1" == "release"             (set __BuildTypeRelease=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
116
117 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
118 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
119 if [!__PassThroughArgs!]==[] (
120     set __PassThroughArgs=%1
121 ) else (
122     set __PassThroughArgs=%__PassThroughArgs% %1
123 )
124
125 if /i "%1" == "freebsdmscorlib"     (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)
126 if /i "%1" == "linuxmscorlib"       (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)
127 if /i "%1" == "netbsdmscorlib"      (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)
128 if /i "%1" == "osxmscorlib"         (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)
129 if /i "%1" == "windowsmscorlib"     (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)
130 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)
131 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)
132 if /i "%1" == "skipconfigure"       (set __SkipConfigure=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
133 if /i "%1" == "skipmscorlib"        (set __BuildCoreLib=0&set __BuildNativeCoreLib=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
134 if /i "%1" == "skipnative"          (set __BuildNative=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
135 if /i "%1" == "skiptests"           (set __BuildTests=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
136 if /i "%1" == "skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
137 if /i "%1" == "skiprestoreoptdata"  (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
138 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)
139 if /i "%1" == "pgoinstrument"       (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
140 if /i "%1" == "ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
141 if /i "%1" == "toolset_dir"         (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
142 if /i "%1" == "buildstandalonegc"   (set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
143
144 @REM The following can be deleted once the CI system that passes it is updated to not pass it.
145 if /i "%1" == "altjitcrossgen"      (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
146
147 if [!processedArgs!]==[] (
148   call set __UnprocessedBuildArgs=!__args!
149 ) else (
150   call set __UnprocessedBuildArgs=%%__args:*!processedArgs!=%%
151 )
152
153 :ArgsDone
154
155 if defined __BuildAll goto BuildAll
156
157 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
158 if %__TotalSpecifiedBuildArch% GTR 1 (
159     echo Error: more than one build architecture specified, but "all" not specified.
160     goto Usage
161 )
162
163 if %__BuildArchX64%==1      set __BuildArch=x64
164 if %__BuildArchX86%==1      set __BuildArch=x86
165 if %__BuildArchArm%==1 (
166     set __BuildArch=arm
167     set __CrossArch=x86
168 )
169 if %__BuildArchArm64%==1 (
170     set __BuildArch=arm64
171     set __CrossArch=x64
172 )
173
174 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
175 if %__TotalSpecifiedBuildType% GTR 1 (
176     echo Error: more than one build type specified, but "all" not specified.
177     goto Usage
178 )
179
180 if %__BuildTypeDebug%==1    set __BuildType=Debug
181 if %__BuildTypeChecked%==1  set __BuildType=Checked
182 if %__BuildTypeRelease%==1  set __BuildType=Release
183
184 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
185
186 :: Set the remaining variables based upon the determined build configuration
187 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
188 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
189 if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__BuildOS%.%__BuildArch%.%__BuildType%")
190 set "__PackagesBinDir=%__BinDir%\.nuget"
191 set "__TestRootDir=%__RootBinDir%\tests"
192 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
193 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
194 set "__CrossComponentBinDir=%__BinDir%"
195 set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
196
197 if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
198 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
199 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
200
201 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
202 set "__CMakeBinDir=%__BinDir%"
203 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
204
205 if not exist "%__BinDir%"           md "%__BinDir%"
206 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
207 if not exist "%__LogsDir%"          md "%__LogsDir%"
208
209 REM It is convinient to have your Nuget search path include the location where the build
210 REM will plass packages.  However nuget used during the build will fail if that directory 
211 REM does not exist.   Avoid this in at least one case by agressively creating the directory. 
212 if not exist "%__BinDir%\.nuget\pkg"           md "%__BinDir%\.nuget\pkg"
213
214 echo %__MsgPrefix%Commencing CoreCLR Repo build
215
216 :: Set the remaining variables based upon the determined build configuration
217
218 echo %__MsgPrefix%Checking prerequisites
219 :: Eval the output from probe-win1.ps1
220 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
221
222 REM =========================================================================================
223 REM ===
224 REM === Start the build steps
225 REM ===
226 REM =========================================================================================
227
228 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
229 call                                 "%__VSToolsRoot%\VsDevCmd.bat"
230
231 @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -generateHeaderWindows -NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" %__RunArgs% %__UnprocessedBuildArgs% 
232
233 REM =========================================================================================
234 REM ===
235 REM === Restore optimization profile data
236 REM ===
237 REM =========================================================================================
238
239 if %__RestoreOptData% EQU 1 (
240     echo %__MsgPrefix%Restoring the OptimizationData Package
241     @call %__ProjectDir%\run.cmd sync -optdata
242     if not !errorlevel! == 0 (
243         echo %__MsgPrefix%Error: Failed to restore the optimization data package.
244         exit /b 1
245     )
246 )
247
248 REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
249 set DotNetCli=%__ProjectDir%\Tools\dotnetcli\dotnet.exe
250 if not exist "%DotNetCli%" (
251     echo Assertion failed: dotnet.exe not found at path "%DotNetCli%"
252     exit /b 1
253 )
254 set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
255 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpPgoDataPackageVersion /nologo') do @(
256     set __PgoOptDataVersion=%%s
257 )
258 for /f "tokens=*" %%s in ('%DotNetCli% msbuild "%OptDataProjectFilePath%" /t:DumpIbcDataPackageVersion /nologo') do @(
259     set __IbcOptDataVersion=%%s
260 )
261
262 REM =========================================================================================
263 REM ===
264 REM === Build the CLR VM
265 REM ===
266 REM =========================================================================================
267
268 if %__BuildNative% EQU 1 ( 
269     echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
270
271         set nativePlatfromArgs=-platform=%__BuildArch%
272     if /i "%__BuildArch%" == "arm64" ( set nativePlatfromArgs=-useEnv )
273
274     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
275     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
276     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
277
278     if /i "%__BuildArch%" == "arm64" ( 
279         rem arm64 builds currently use private toolset which has not been released yet
280         REM TODO, remove once the toolset is open.
281         call :PrivateToolSet
282         goto GenVSSolution
283     )
284
285     :: Set the environment for the native build
286     set __VCBuildArch=x86_amd64
287     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
288     if /i "%__BuildArch%" == "arm" (
289         set __VCBuildArch=x86_arm
290         
291         REM Make CMake pick the highest installed version in the 10.0.* range
292         set ___SDKVersion="-DCMAKE_SYSTEM_VERSION=10.0"
293     )
294
295     echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
296     call                                 "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
297         @if defined _echo @echo on
298
299     if not defined VSINSTALLDIR (
300         echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
301         exit /b 1
302     )
303     if not exist "!VSINSTALLDIR!DIA SDK" goto NoDIA
304
305 :GenVSSolution
306     if defined __SkipConfigure goto SkipConfigure
307
308     echo %__MsgPrefix%Regenerating the Visual Studio solution
309
310     pushd "%__IntermediatesDir%"
311     set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%"
312     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildStandaloneGC% !__ExtraCmakeArgs!
313         @if defined _echo @echo on
314     popd
315 :SkipConfigure
316     if defined __ConfigureOnly goto SkipNativeBuild
317
318     if not exist "%__IntermediatesDir%\install.vcxproj" (
319         echo %__MsgPrefix%Error: failed to generate native component build project!
320         exit /b 1
321     )
322
323     @call %__ProjectDir%\run.cmd build -Project=%__IntermediatesDir%\install.vcxproj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! -configuration=%__BuildType% %nativePlatfromArgs% %__RunArgs% %__UnprocessedBuildArgs%
324
325     if not !errorlevel! == 0 (
326         echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
327         echo     "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
328         echo     "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
329         echo     "%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
330         exit /b 1
331     )   
332 )
333 :SkipNativeBuild
334
335 REM =========================================================================================
336 REM ===
337 REM === Build Cross-Architecture Native Components (if applicable)
338 REM ===
339 REM =========================================================================================
340
341 if /i "%__BuildArch%"=="arm64" (
342     set __DoCrossArchBuild=1
343     )
344
345 if /i "%__BuildArch%"=="arm" (
346     set __DoCrossArchBuild=1
347     )
348
349 if /i "%__DoCrossArchBuild%"=="1" (
350
351     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
352
353     :: Set the environment for the native build
354     set __VCBuildArch=x86_amd64
355     if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
356     @call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
357     @if defined _echo @echo on
358
359     if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%"
360     if defined __SkipConfigure goto SkipConfigureCrossBuild
361
362     pushd "%__CrossCompIntermediatesDir%"
363     set __CMakeBinDir=%__CrossComponentBinDir%
364     set "__CMakeBinDir=!__CMakeBinDir:\=/!"
365     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%"
366     call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
367     @if defined _echo @echo on
368     popd
369 :SkipConfigureCrossBuild
370     if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" (
371         echo %__MsgPrefix%Error: failed to generate cross-arch components build project!
372         exit /b 1
373     )
374
375     if defined __ConfigureOnly goto SkipCrossCompBuild
376
377     echo %__MsgPrefix%Invoking msbuild
378
379     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
380     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
381     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
382     @call %__ProjectDir%\run.cmd build -Project=%__CrossCompIntermediatesDir%\install.vcxproj -configuration=%__BuildType% -platform=%__CrossArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
383     if not !errorlevel! == 0 (
384         echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details:
385         echo     "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
386         echo     "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
387         echo     "%__LogsDir%\Cross_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
388         exit /b 1
389     )    
390 )
391
392 :SkipCrossCompBuild
393
394 REM =========================================================================================
395 REM ===
396 REM === CoreLib and NuGet package build section.
397 REM ===
398 REM =========================================================================================
399
400 if %__BuildCoreLib% EQU 1 (  
401         
402         echo %__MsgPrefix%Commencing build of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
403     rem Explicitly set Platform causes conflicts in CoreLib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
404     set Platform=
405
406     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
407     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
408     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
409
410     set __ExtraBuildArgs=
411     if not defined __IbcTuning (
412       set __ExtraBuildArgs=!__ExtraBuildArgs! -OptimizationDataDir="%__PackagesDir%/optimization.%__BuildOS%-%__BuildArch%.IBC.CoreCLR/%__IbcOptDataVersion%/data/"
413       set __ExtraBuildArgs=!__ExtraBuildArgs! -EnableProfileGuidedOptimization=true
414     )
415
416     if /i "%__BuildArch%" == "arm64" (
417                 set __nugetBuildArgs=-buildNugetPackage=false
418     ) else if "%__SkipNugetPackage%" == "1" (
419                 set __nugetBuildArgs=-buildNugetPackage=false
420     ) else (
421                 set __nugetBuildArgs=-buildNugetPackage=true
422         )
423
424     @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
425     if not !errorlevel! == 0 (
426         echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
427         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
428         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
429         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
430         exit /b 1
431     )
432 )
433
434 REM Need diasymreader.dll on your path for /CreatePdb
435 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
436
437 if %__BuildNativeCoreLib% EQU 1 (
438     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
439
440     echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
441     "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
442     if NOT !errorlevel! == 0 (
443         echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
444         :: Put it in the same log, helpful for Jenkins
445         type %__CrossGenCoreLibLog%
446         goto CrossgenFailure
447     )
448     "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll" >> "%__CrossGenCoreLibLog%" 2>&1
449     if NOT !errorlevel! == 0 (
450         echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
451         :: Put it in the same log, helpful for Jenkins
452         type %__CrossGenCoreLibLog%
453         goto CrossgenFailure
454     )
455 )
456
457 if %__BuildPackages% EQU 1 (
458     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
459
460     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
461         set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
462         set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
463
464     REM The conditions as to what to build are captured in the builds file.
465     @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
466
467     if not !errorlevel! == 0 (
468         echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
469         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
470         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
471         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
472         exit /b 1
473     )
474 )
475
476 REM =========================================================================================
477 REM ===
478 REM === Test build section
479 REM ===
480 REM =========================================================================================
481
482 if %__BuildTests% EQU 1 (
483     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
484
485     REM Construct the arguments to pass to the test build script.
486
487     rem arm64 builds currently use private toolset which has not been released yet
488     REM TODO, remove once the toolset is open.
489     if /i "%__BuildArch%" == "arm64" call :PrivateToolSet 
490
491     echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
492     @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
493
494     if not !errorlevel! == 0 (
495         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
496         exit /b 1
497     )
498 )
499
500 REM =========================================================================================
501 REM ===
502 REM === All builds complete!
503 REM ===
504 REM =========================================================================================
505
506 echo %__MsgPrefix%Repo successfully built.  Finished at %TIME%
507 echo %__MsgPrefix%Product binaries are available at !__BinDir!
508 if %__BuildTests% EQU 1 (
509     echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
510 )
511 exit /b 0
512
513 REM =========================================================================================
514 REM ===
515 REM === Handle the "all" case.
516 REM ===
517 REM =========================================================================================
518
519 :BuildAll
520
521 set __BuildArchList=
522
523 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
524 if %__TotalSpecifiedBuildArch% EQU 0 (
525     REM Nothing specified means we want to build all architectures.
526     set __BuildArchList=x64 x86 arm arm64
527 )
528
529 REM Otherwise, add all the specified architectures to the list.
530
531 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
532 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
533 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
534 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
535
536 set __BuildTypeList=
537
538 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
539 if %__TotalSpecifiedBuildType% EQU 0 (
540     REM Nothing specified means we want to build all build types.
541     set __BuildTypeList=Debug Checked Release
542 )
543
544 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
545 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
546 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
547
548 REM Create a temporary file to collect build results. We always build all flavors specified, and
549 REM report a summary of the results at the end.
550
551 set __AllBuildSuccess=true
552 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
553 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
554
555 for %%i in (%__BuildArchList%) do (
556     for %%j in (%__BuildTypeList%) do (
557         call :BuildOne %%i %%j
558     )
559 )
560
561 if %__AllBuildSuccess%==true (
562     echo %__MsgPrefix%All builds succeeded!
563     exit /b 0
564 ) else (
565     echo %__MsgPrefix%Builds failed:
566     type %__BuildResultFile%
567     del /f /q %__BuildResultFile%
568     exit /b 1
569 )
570
571 REM This code is unreachable, but leaving it nonetheless, just in case things change.
572 exit /b 99
573
574 :BuildOne
575 set __BuildArch=%1
576 set __BuildType=%2
577 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
578 echo %__MsgPrefix%Invoking: %__NextCmd%
579 %__NextCmd%
580 if not !errorlevel! == 0 (
581     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
582     set __AllBuildSuccess=false
583 )
584 exit /b 0
585
586 REM =========================================================================================
587 REM ===
588 REM === Helper routines
589 REM ===
590 REM =========================================================================================
591
592 :CrossgenFailure
593 exit /b 1
594
595 :Usage
596 echo.
597 echo Build the CoreCLR repo.
598 echo.
599 echo Usage:
600 echo     build.cmd [option1] [option2]
601 echo or:
602 echo     build.cmd all [option1] [option2] -- ...
603 echo.
604 echo All arguments are optional. The options are:
605 echo.
606 echo.-? -h -help: view this message.
607 echo all: Builds all configurations and platforms.
608 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
609 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
610 echo -- ... : all arguments following this tag will be passed directly to msbuild.
611 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
612 echo     or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
613 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
614 echo     respectively^).
615 echo     add nativemscorlib to go further and build the native image for designated mscorlib.
616 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
617 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
618 echo ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
619 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
620 echo skipconfigure: skip CMake ^(default: CMake is run^)
621 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
622 echo skipnative: skip building native components ^(default: native components are built^).
623 echo skiptests: skip building tests ^(default: tests are built^).
624 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
625 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
626 echo buildstandalonegc: builds the GC in a standalone mode.
627 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
628 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
629 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
630 echo -sequential: force a non-parallel build ^(default is to build in parallel
631 echo     using all processors^).
632 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
633 echo -Rebuild: passes /t:rebuild to the build projects.
634 echo portable : build for portable RID.
635 echo.
636 echo If "all" is specified, then all build architectures and types are built. If, in addition,
637 echo one or more build architectures or types is specified, then only those build architectures
638 echo and types are built.
639 echo.
640 echo For example:
641 echo     build all
642 echo        -- builds all architectures, and all build types per architecture
643 echo     build all x86
644 echo        -- builds all build types for x86
645 echo     build all x64 x86 Checked Release
646 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
647 exit /b 1
648
649 :NoDIA
650 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
651 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
652 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
653 of the previous version to "%VSINSTALLDIR%" and then build.
654 :: DIA SDK not included in Express editions
655 echo Visual Studio Express does not include the DIA SDK. ^
656 You need Visual Studio 2015 or 2017 (Community is free).
657 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
658 exit /b 1
659
660 :PrivateToolSet
661
662 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
663
664 if /i "%__ToolsetDir%" == "" (
665     echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
666     exit /b 1
667 )
668
669 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
670 call "%__ToolsetDir%"\buildenv_arm64.cmd
671 exit /b 0
672
673 :Not_EWDK
674 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
675 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
676 set INCLUDE=^
677 %__ToolsetDir%\VC_sdk\inc;^
678 %__ToolsetDir%\sdpublic\sdk\inc;^
679 %__ToolsetDir%\sdpublic\shared\inc;^
680 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
681 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
682 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
683 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
684 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
685 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
686 %__ToolsetDir%\diasdk\include
687 exit /b 0