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