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