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