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