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