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