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