[WIP] Enable binding to CoreLib as NI image (#11040)
[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=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=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% "-DBUILD_JIT32=%__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     set PackageCompatJit=
434     if "%__BuildJit32%" == "1" (
435         set PackageCompatJit=1
436     )
437     @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
438     if not !errorlevel! == 0 (
439         echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
440         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
441         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
442         echo     "%__LogsDir%\System.Private.CoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
443         exit /b 1
444     )
445 )
446
447 REM Need diasymreader.dll on your path for /CreatePdb
448 set PATH=%PATH%;%WinDir%\Microsoft.Net\Framework64\V4.0.30319;%WinDir%\Microsoft.Net\Framework\V4.0.30319
449
450 if %__BuildNativeCoreLib% EQU 1 (
451     echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__BuildOS%.%__BuildArch%.%__BuildType%
452
453     if "%__CompatJitCrossgen%"=="1" (
454         set COMPlus_UseWindowsX86CoreLegacyJit=1
455     )
456
457     echo "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll"
458     "%__CrossgenExe%" %__IbcTuning% /Platform_Assemblies_Paths "%__BinDir%"\IL /out "%__BinDir%\System.Private.CoreLib.dll" "%__BinDir%\IL\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
459     if NOT !errorlevel! == 0 (
460         echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
461         :: Put it in the same log, helpful for Jenkins
462         type %__CrossGenCoreLibLog%
463         goto CrossgenFailure
464     )
465     "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /CreatePdb "%__BinDir%\PDB" "%__BinDir%\System.Private.CoreLib.dll" >> "%__CrossGenCoreLibLog%" 2>&1
466     if NOT !errorlevel! == 0 (
467         echo %__MsgPrefix%Error: CrossGen /CreatePdb System.Private.CoreLib build failed. Refer to %__CrossGenCoreLibLog%
468         :: Put it in the same log, helpful for Jenkins
469         type %__CrossGenCoreLibLog%
470         goto CrossgenFailure
471     )
472
473     if "%__CompatJitCrossgen%"=="1" (
474         set COMPlus_UseWindowsX86CoreLegacyJit=
475     )
476 )
477
478 if %__BuildPackages% EQU 1 (
479     echo %__MsgPrefix%Building Packages for %__BuildOS%.%__BuildArch%.%__BuildType%
480
481     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
482         set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
483         set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
484
485     REM The conditions as to what to build are captured in the builds file.
486     @call %__ProjectDir%\run.cmd build -Project=%__SourceDir%\.nuget\packages.builds %__IsPortableBuild% -platform=%__BuildArch% -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! %__RunArgs% %__UnprocessedBuildArgs%
487
488     if not !errorlevel! == 0 (
489         echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
490         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
491         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
492         echo     "%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
493         exit /b 1
494     )
495 )
496
497 REM =========================================================================================
498 REM ===
499 REM === Test build section
500 REM ===
501 REM =========================================================================================
502
503 if %__BuildTests% EQU 1 (
504     echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
505
506     REM Construct the arguments to pass to the test build script.
507
508     rem arm64 builds currently use private toolset which has not been released yet
509     REM TODO, remove once the toolset is open.
510     if /i "%__BuildArch%" == "arm64" call :PrivateToolSet 
511
512     echo "%__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%"
513     @call %__ProjectDir%\build-test.cmd %__BuildArch% %__BuildType% %__UnprocessedBuildArgs%
514
515     if not !errorlevel! == 0 (
516         REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
517         exit /b 1
518     )
519 )
520
521 REM =========================================================================================
522 REM ===
523 REM === All builds complete!
524 REM ===
525 REM =========================================================================================
526
527 echo %__MsgPrefix%Repo successfully built.  Finished at %TIME%
528 echo %__MsgPrefix%Product binaries are available at !__BinDir!
529 if %__BuildTests% EQU 1 (
530     echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
531 )
532 exit /b 0
533
534 REM =========================================================================================
535 REM ===
536 REM === Handle the "all" case.
537 REM ===
538 REM =========================================================================================
539
540 :BuildAll
541
542 set __BuildArchList=
543
544 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
545 if %__TotalSpecifiedBuildArch% EQU 0 (
546     REM Nothing specified means we want to build all architectures.
547     set __BuildArchList=x64 x86 arm arm64
548 )
549
550 REM Otherwise, add all the specified architectures to the list.
551
552 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
553 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
554 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
555 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
556
557 set __BuildTypeList=
558
559 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
560 if %__TotalSpecifiedBuildType% EQU 0 (
561     REM Nothing specified means we want to build all build types.
562     set __BuildTypeList=Debug Checked Release
563 )
564
565 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
566 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
567 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
568
569 REM Create a temporary file to collect build results. We always build all flavors specified, and
570 REM report a summary of the results at the end.
571
572 set __AllBuildSuccess=true
573 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
574 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
575
576 for %%i in (%__BuildArchList%) do (
577     for %%j in (%__BuildTypeList%) do (
578         call :BuildOne %%i %%j
579     )
580 )
581
582 if %__AllBuildSuccess%==true (
583     echo %__MsgPrefix%All builds succeeded!
584     exit /b 0
585 ) else (
586     echo %__MsgPrefix%Builds failed:
587     type %__BuildResultFile%
588     del /f /q %__BuildResultFile%
589     exit /b 1
590 )
591
592 REM This code is unreachable, but leaving it nonetheless, just in case things change.
593 exit /b 99
594
595 :BuildOne
596 set __BuildArch=%1
597 set __BuildType=%2
598 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
599 echo %__MsgPrefix%Invoking: %__NextCmd%
600 %__NextCmd%
601 if not !errorlevel! == 0 (
602     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
603     set __AllBuildSuccess=false
604 )
605 exit /b 0
606
607 REM =========================================================================================
608 REM ===
609 REM === Helper routines
610 REM ===
611 REM =========================================================================================
612
613 :CrossgenFailure
614 exit /b 1
615
616 :Usage
617 echo.
618 echo Build the CoreCLR repo.
619 echo.
620 echo Usage:
621 echo     build.cmd [option1] [option2]
622 echo or:
623 echo     build.cmd all [option1] [option2] -- ...
624 echo.
625 echo All arguments are optional. The options are:
626 echo.
627 echo.-? -h -help: view this message.
628 echo all: Builds all configurations and platforms.
629 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
630 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
631 echo -- ... : all arguments following this tag will be passed directly to msbuild.
632 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
633 echo     or windowsmscorlib. If one of these is passed, only System.Private.CoreLib is built,
634 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
635 echo     respectively^).
636 echo     add nativemscorlib to go further and build the native image for designated mscorlib.
637 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
638 echo pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.
639 echo ibcinstrument: generate IBC-tuning-enabled native images when invoking crossgen.
640 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
641 echo skipconfigure: skip CMake ^(default: CMake is run^)
642 echo skipmscorlib: skip building System.Private.CoreLib ^(default: System.Private.CoreLib is built^).
643 echo skipnative: skip building native components ^(default: native components are built^).
644 echo skiptests: skip building tests ^(default: tests are built^).
645 echo skipbuildpackages: skip building nuget packages ^(default: packages are built^).
646 echo skiprestoreoptdata: skip restoring optimization data used by profile-based optimizations.
647 echo buildstandalonegc: builds the GC in a standalone mode.
648 echo -skiprestore: skip restoring packages ^(default: packages are restored during build^).
649 echo -disableoss: Disable Open Source Signing for System.Private.CoreLib.
650 echo -priority=^<N^> : specify a set of test that will be built and run, with priority N.
651 echo -sequential: force a non-parallel build ^(default is to build in parallel
652 echo     using all processors^).
653 echo -officialbuildid=^<ID^>: specify the official build ID to be used by this build.
654 echo -Rebuild: passes /t:rebuild to the build projects.
655 echo portable : build for portable RID.
656 echo.
657 echo If "all" is specified, then all build architectures and types are built. If, in addition,
658 echo one or more build architectures or types is specified, then only those build architectures
659 echo and types are built.
660 echo.
661 echo For example:
662 echo     build all
663 echo        -- builds all architectures, and all build types per architecture
664 echo     build all x86
665 echo        -- builds all build types for x86
666 echo     build all x64 x86 Checked Release
667 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
668 exit /b 1
669
670 :NoDIA
671 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
672 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
673 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
674 of the previous version to "%VSINSTALLDIR%" and then build.
675 :: DIA SDK not included in Express editions
676 echo Visual Studio Express does not include the DIA SDK. ^
677 You need Visual Studio 2015 or 2017 (Community is free).
678 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
679 exit /b 1
680
681 :PrivateToolSet
682
683 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
684
685 if /i "%__ToolsetDir%" == "" (
686     echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
687     exit /b 1
688 )
689
690 if not exist "%__ToolsetDir%"\buildenv_arm64.cmd goto :Not_EWDK
691 call "%__ToolsetDir%"\buildenv_arm64.cmd
692 exit /b 0
693
694 :Not_EWDK
695 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
696 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
697 set INCLUDE=^
698 %__ToolsetDir%\VC_sdk\inc;^
699 %__ToolsetDir%\sdpublic\sdk\inc;^
700 %__ToolsetDir%\sdpublic\shared\inc;^
701 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
702 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
703 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
704 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
705 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
706 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
707 %__ToolsetDir%\diasdk\include
708 exit /b 0