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