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