Merge pull request #2931 from jkotas/glob-revert
[platform/upstream/coreclr.git] / build.cmd
1 @if not defined __echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
3
4 set __ThisScriptShort=%0
5 set __ThisScriptFull="%~f0"
6
7 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
8 ::      __BuildArch         -- default: x64
9 ::      __BuildType         -- default: Debug
10 ::      __BuildOS           -- default: Windows_NT
11 ::      __ProjectDir        -- default: directory of the dir.props file
12 ::      __SourceDir         -- default: %__ProjectDir%\src\
13 ::      __PackagesDir       -- default: %__ProjectDir%\packages\
14 ::      __RootBinDir        -- default: %__ProjectDir%\bin\
15 ::      __BinDir            -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
16 ::      __IntermediatesDir
17 ::      __PackagesBinDir    -- default: %__BinDir%\.nuget
18 ::      __TestWorkingDir    -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
19 ::
20 :: Thus, these variables are not simply internal to this script!
21 ::
22 :: The UseRoslynCompiler variable is used by src\mscorlib\GenerateCompilerResponseFile.targets.
23
24 :: Set the default arguments for build
25 set __BuildArch=x64
26 set __BuildType=Debug
27 set __BuildOS=Windows_NT
28
29 :: Default to highest Visual Studio version available
30 set __VSVersion=vs2015
31
32 if defined VS120COMNTOOLS set __VSVersion=vs2013
33 if defined VS140COMNTOOLS set __VSVersion=vs2015
34
35 :: Define a prefix for most output progress messages that come from this script. That makes
36 :: it easier to see where these are coming from. Note that there is a trailing space here.
37 set __MsgPrefix=BUILD: 
38
39 :: Set the various build properties here so that CMake and MSBuild can pick them up
40 set "__ProjectDir=%~dp0"
41 :: remove trailing slash
42 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
43 set "__ProjectFilesDir=%__ProjectDir%"
44 set "__SourceDir=%__ProjectDir%\src"
45 set "__PackagesDir=%__ProjectDir%\packages"
46 set "__RootBinDir=%__ProjectDir%\bin"
47 set "__LogsDir=%__RootBinDir%\Logs"
48
49 set __CleanBuild=
50 set __MscorlibOnly=
51 set __ConfigureOnly=
52 set __SkipConfigure=
53 set __SkipMscorlibBuild=
54 set __SkipNativeBuild=
55 set __SkipTestBuild=
56 set __DoCrossgen=
57 set __BuildSequential=
58 set __msbuildCleanBuildArgs=
59 set __msbuildExtraArgs=
60
61 set __BuildAll=
62
63 set __BuildArchX64=0
64 set __BuildArchX86=0
65 set __BuildArchArm=0
66 set __BuildArchArm64=0
67
68 set __BuildTypeDebug=0
69 set __BuildTypeChecked=0
70 set __BuildTypeRelease=0
71
72 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
73 REM when using "all".
74 set __PassThroughArgs=
75
76 :Arg_Loop
77 if "%1" == "" goto ArgsDone
78
79 if /i "%1" == "/?"    goto Usage
80 if /i "%1" == "-?"    goto Usage
81 if /i "%1" == "/h"    goto Usage
82 if /i "%1" == "-h"    goto Usage
83 if /i "%1" == "/help" goto Usage
84 if /i "%1" == "-help" goto Usage
85
86 if /i "%1" == "all"                 (set __BuildAll=1&shift&goto Arg_Loop)
87
88 if /i "%1" == "x64"                 (set __BuildArchX64=1&shift&goto Arg_Loop)
89 if /i "%1" == "x86"                 (set __BuildArchX86=1&shift&goto Arg_Loop)
90 if /i "%1" == "arm"                 (set __BuildArchArm=1&shift&goto Arg_Loop)
91 if /i "%1" == "arm64"               (set __BuildArchArm64=1&shift&goto Arg_Loop)
92
93 if /i "%1" == "debug"               (set __BuildTypeDebug=1&shift&goto Arg_Loop)
94 if /i "%1" == "checked"             (set __BuildTypeChecked=1&shift&goto Arg_Loop)
95 if /i "%1" == "release"             (set __BuildTypeRelease=1&shift&goto Arg_Loop)
96
97 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
98 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
99 set __PassThroughArgs=%__PassThroughArgs% %1
100
101 if /i "%1" == "clean"               (set __CleanBuild=1&shift&goto Arg_Loop)
102
103 if /i "%1" == "freebsdmscorlib"     (set __MscorlibOnly=1&set __BuildOS=FreeBSD&shift&goto Arg_Loop)
104 if /i "%1" == "linuxmscorlib"       (set __MscorlibOnly=1&set __BuildOS=Linux&shift&goto Arg_Loop)
105 if /i "%1" == "osxmscorlib"         (set __MscorlibOnly=1&set __BuildOS=OSX&shift&goto Arg_Loop)
106 if /i "%1" == "windowsmscorlib"     (set __MscorlibOnly=1&set __BuildOS=Windows_NT&shift&goto Arg_Loop)
107
108 if /i "%1" == "vs2013"              (set __VSVersion=%1&shift&goto Arg_Loop)
109 if /i "%1" == "vs2015"              (set __VSVersion=%1&shift&goto Arg_Loop)
110 if /i "%1" == "configureonly"       (set __ConfigureOnly=1&set __SkipMscorlibBuild=1&set __SkipTestBuild=1&shift&goto Arg_Loop)
111 if /i "%1" == "skipconfigure"       (set __SkipConfigure=1&shift&goto Arg_Loop)
112 if /i "%1" == "skipmscorlib"        (set __SkipMscorlibBuild=1&shift&goto Arg_Loop)
113 if /i "%1" == "skipnative"          (set __SkipNativeBuild=1&shift&goto Arg_Loop)
114 if /i "%1" == "skiptests"           (set __SkipTestBuild=1&shift&goto Arg_Loop)
115 if /i "%1" == "docrossgen"          (set __DoCrossgen=1&shift&goto Arg_Loop)
116 if /i "%1" == "sequential"          (set __BuildSequential=1&shift&goto Arg_Loop)
117 if /i "%1" == "priority"            (set __TestPriority=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
118
119 @REM For backwards compatibility, continue accepting "skiptestbuild", which was the original name of the option.
120 if /i "%1" == "skiptestbuild"       (set __SkipTestBuild=1&shift&goto Arg_Loop)
121
122 @REM It was initially /toolset_dir. Not sure why, since it doesn't match the other usage.
123 if /i "%1" == "/toolset_dir"        (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
124 if /i "%1" == "toolset_dir"         (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
125
126 if /i not "%1" == "msbuildargs" goto SkipMsbuildArgs
127 :: All the rest of the args will be collected and passed directly to msbuild.
128 :CollectMsbuildArgs
129 shift
130 if "%1"=="" goto ArgsDone
131 set __msbuildExtraArgs=%__msbuildExtraArgs% %1
132 set __PassThroughArgs=%__PassThroughArgs% %1
133 goto CollectMsbuildArgs
134 :SkipMsbuildArgs
135
136 echo Invalid command-line argument: %1
137 goto Usage
138
139 :ArgsDone
140
141 if defined __ConfigureOnly if defined __SkipConfigure (
142     echo "Error: option 'configureonly' is incompatible with 'skipconfigure'
143     goto Usage
144 )
145
146 if defined __SkipMscorlibBuild if defined __MscorlibOnly (
147     echo Error: option 'skipmscorlib' is incompatible with 'freebsdmscorlib', 'linuxmscorlib', 'osxmscorlib', and 'windowsmscorlib'.
148     goto Usage
149 )
150
151 if defined __BuildAll goto BuildAll
152
153 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
154 if %__TotalSpecifiedBuildArch% GTR 1 (
155     echo Error: more than one build architecture specified, but "all" not specified.
156     goto Usage
157 )
158
159 if %__BuildArchX64%==1      set __BuildArch=x64
160 if %__BuildArchX86%==1      set __BuildArch=x86
161 if %__BuildArchArm%==1      set __BuildArch=arm
162 if %__BuildArchArm64%==1    set __BuildArch=arm64
163
164 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
165 if %__TotalSpecifiedBuildType% GTR 1 (
166     echo Error: more than one build type specified, but "all" not specified.
167     goto Usage
168 )
169
170 if %__BuildTypeDebug%==1    set __BuildType=Debug
171 if %__BuildTypeChecked%==1  set __BuildType=Checked
172 if %__BuildTypeRelease%==1  set __BuildType=Release
173
174 echo %__MsgPrefix%Commencing CoreCLR Repo build
175
176 :: Set the remaining variables based upon the determined build configuration
177 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
178 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
179 set "__PackagesBinDir=%__BinDir%\.nuget"
180 set "__TestBinDir=%__RootBinDir%\tests\%__BuildOS%.%__BuildArch%.%__BuildType%"
181 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
182
183 :: Use this variable to locate dynamically generated files; the actual location though will be different.
184 set "__GeneratedIntermediatesDir=%__IntermediatesDir%\Generated_latest"
185
186 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
187 set "__CMakeBinDir=%__BinDir%"
188 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
189
190 :: Configure environment if we are doing a clean build.
191 if not defined __CleanBuild goto SkipCleanBuild
192 echo %__MsgPrefix%Doing a clean build
193
194 :: MSBuild projects would need a rebuild
195 set __msbuildCleanBuildArgs=/t:rebuild
196
197 :: Cleanup the previous output for the selected configuration
198 if exist "%__BinDir%"               rd /s /q "%__BinDir%"
199 if exist "%__IntermediatesDir%"     rd /s /q "%__IntermediatesDir%"
200 if exist "%__TestBinDir%"           rd /s /q "%__TestBinDir%"
201 if exist "%__TestIntermediatesDir%" rd /s /q "%__TestIntermediatesDir%"
202 if exist "%__LogsDir%"              del /f /q "%__LogsDir%\*_%__BuildOS%__%__BuildArch%__%__BuildType%.*"
203
204 :SkipCleanBuild
205
206 if not exist "%__BinDir%"           md "%__BinDir%"
207 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
208 if not exist "%__LogsDir%"          md "%__LogsDir%"
209
210 :: CMake isn't a requirement when building mscorlib only
211 if defined __MscorlibOnly goto CheckVS
212
213 echo %__MsgPrefix%Checking prerequisites
214
215 :: Eval the output from probe-win1.ps1
216 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy RemoteSigned "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
217
218 :CheckVS
219
220 set __VSProductVersion=
221 if /i "%__VSVersion%" == "vs2013" set __VSProductVersion=120
222 if /i "%__VSVersion%" == "vs2015" set __VSProductVersion=140
223
224 :: Check presence of VS
225 if not defined VS%__VSProductVersion%COMNTOOLS goto NoVS
226
227 set __VSToolsRoot=!VS%__VSProductVersion%COMNTOOLS!
228 if %__VSToolsRoot:~-1%==\ set "__VSToolsRoot=%__VSToolsRoot:~0,-1%"
229
230 :: Does VS really exist?
231 if not exist "%__VSToolsRoot%\..\IDE\devenv.exe"      goto NoVS
232 if not exist "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" goto NoVS
233 if not exist "%__VSToolsRoot%\VsDevCmd.bat"           goto NoVS
234
235 if /i "%__VSVersion%" =="vs2015" goto MSBuild14
236 set _msbuildexe="%ProgramFiles(x86)%\MSBuild\12.0\Bin\MSBuild.exe"
237 if not exist %_msbuildexe% set _msbuildexe="%ProgramFiles%\MSBuild\12.0\Bin\MSBuild.exe"
238 if not exist %_msbuildexe% set _msbuildexe="%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe"
239 goto :CheckMSBuild14
240 :MSBuild14
241 set _msbuildexe="%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe"
242 set UseRoslynCompiler=true
243 :CheckMSBuild14
244 if not exist %_msbuildexe% set _msbuildexe="%ProgramFiles%\MSBuild\14.0\Bin\MSBuild.exe"
245 if not exist %_msbuildexe% echo %__MsgPrefix%Error: Could not find MSBuild.exe.  Please see https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md for build instructions. && exit /b 1
246
247 :: Note: We've disabled node reuse because it causes file locking issues.
248 ::       The issue is that we extend the build with our own targets which
249 ::       means that that rebuilding cannot successfully delete the task
250 ::       assembly. 
251 set __msbuildCommonArgs=/nologo /nodeReuse:false %__msbuildCleanBuildArgs% %__msbuildExtraArgs%
252
253 if not defined __BuildSequential (
254     set __msbuildCommonArgs=%__msbuildCommonArgs% /maxcpucount
255 )
256
257 REM =========================================================================================
258 REM ===
259 REM === Restore Build Tools
260 REM ===
261 REM =========================================================================================
262 call %~dp0init-tools.cmd 
263
264 REM =========================================================================================
265 REM ===
266 REM === Start the build steps
267 REM ===
268 REM =========================================================================================
269
270 if defined __MscorlibOnly goto PerformMScorlibBuild
271
272 if defined __SkipNativeBuild (
273     echo %__MsgPrefix%Skipping native components build
274     goto SkipNativeBuild
275 )
276
277 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
278
279 REM Use setlocal to restrict environment changes form vcvarsall.bat and more to just this native components build section.
280 setlocal EnableDelayedExpansion EnableExtensions
281
282 if /i not "%__BuildArch%" == "arm64" goto NotArm64Build
283
284 rem arm64 builds currently use private toolset which has not been released yet
285 REM TODO, remove once the toolset is open.
286
287 if /i "%__ToolsetDir%" == "" (
288     echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
289     exit /b 1
290 )
291
292 set PATH=%PATH%;%__ToolsetDir%\cpp\bin
293 set LIB=%__ToolsetDir%\OS\lib;%__ToolsetDir%\cpp\lib
294 set INCLUDE=^
295 %__ToolsetDir%\cpp\inc;^
296 %__ToolsetDir%\OS\inc\Windows;^
297 %__ToolsetDir%\OS\inc\Windows\crt;^
298 %__ToolsetDir%\cpp\inc\vc;^
299 %__ToolsetDir%\OS\inc\win8
300
301 goto GenVSSolution
302
303 :NotArm64Build
304
305 :: Set the environment for the native build
306 set __VCBuildArch=x86_amd64
307 if /i "%__BuildArch%" == "x86" (set __VCBuildArch=x86)
308 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" %__VCBuildArch%
309 call                                 "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" %__VCBuildArch%
310 @if defined __echo @echo on
311
312 if not defined VSINSTALLDIR (
313     echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
314     exit /b 1
315 )
316 if not exist "%VSINSTALLDIR%DIA SDK" goto NoDIA
317
318 :GenVSSolution
319
320 if defined __SkipConfigure goto SkipConfigure
321
322 echo %__MsgPrefix%Regenerating the Visual Studio solution
323
324 pushd "%__IntermediatesDir%"
325 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch%
326 @if defined __echo @echo on
327 popd
328
329 :SkipConfigure
330
331 if not exist "%__IntermediatesDir%\install.vcxproj" (
332     echo %__MsgPrefix%Error: failed to generate native component build project!
333     exit /b 1
334 )
335
336 REM =========================================================================================
337 REM ===
338 REM === Build the CLR VM
339 REM ===
340 REM =========================================================================================
341
342 if defined __ConfigureOnly goto SkipNativeBuild
343
344 echo %__MsgPrefix%Invoking msbuild
345
346 set "__BuildLog=%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
347 set "__BuildWrn=%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
348 set "__BuildErr=%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
349 set __msbuildLogArgs=^
350 /fileloggerparameters:Verbosity=normal;LogFile="%__BuildLog%" ^
351 /fileloggerparameters1:WarningsOnly;LogFile="%__BuildWrn%" ^
352 /fileloggerparameters2:ErrorsOnly;LogFile="%__BuildErr%" ^
353 /consoleloggerparameters:Summary ^
354 /verbosity:minimal
355
356 set __msbuildArgs="%__IntermediatesDir%\install.vcxproj" %__msbuildCommonArgs% %__msbuildLogArgs% /p:Configuration=%__BuildType%
357
358 if /i "%__BuildArch%" == "arm64" (  
359     REM TODO, remove once we have msbuild support for this platform.
360     set __msbuildArgs=%__msbuildArgs% /p:UseEnv=true
361 ) else (
362     set __msbuildArgs=%__msbuildArgs% /p:Platform=%__BuildArch%
363 )
364
365 %_msbuildexe% %__msbuildArgs%
366 if errorlevel 1 (
367     echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
368     echo     %__BuildLog%
369     echo     %__BuildWrn%
370     echo     %__BuildErr%
371     exit /b 1
372 )
373
374 REM endlocal to rid us of environment changes from vcvarsall.bat
375 endlocal
376
377 :SkipNativeBuild
378
379 REM =========================================================================================
380 REM ===
381 REM === Mscorlib build section.
382 REM ===
383 REM =========================================================================================
384
385 :PerformMScorlibBuild
386 if defined __SkipMscorlibBuild (
387     echo %__MsgPrefix%Skipping Mscorlib build
388     goto SkipMscorlibBuild
389 )
390
391 echo %__MsgPrefix%Commencing build of mscorlib for %__BuildOS%.%__BuildArch%.%__BuildType%
392
393 REM setlocal to prepare for vsdevcmd.bat
394 setlocal EnableDelayedExpansion EnableExtensions
395
396 rem Explicitly set Platform causes conflicts in mscorlib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
397 set Platform=
398
399 :: Set the environment for the managed build
400 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
401 call                                 "%__VSToolsRoot%\VsDevCmd.bat"
402
403 set "__BuildLog=%__LogsDir%\MScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
404 set "__BuildWrn=%__LogsDir%\MScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
405 set "__BuildErr=%__LogsDir%\MScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
406 set __msbuildLogArgs=^
407 /fileloggerparameters:Verbosity=normal;LogFile="%__BuildLog%" ^
408 /fileloggerparameters1:WarningsOnly;LogFile="%__BuildWrn%" ^
409 /fileloggerparameters2:ErrorsOnly;LogFile="%__BuildErr%" ^
410 /consoleloggerparameters:Summary ^
411 /verbosity:minimal
412
413 set __msbuildArgs="%__ProjectFilesDir%\build.proj" %__msbuildCommonArgs% %__msbuildLogArgs%
414
415 set __BuildNugetPackage=true
416 if defined __MscorlibOnly       set __BuildNugetPackage=false
417 if /i "%__BuildArch%" =="arm64" set __BuildNugetPackage=false
418 if %__BuildNugetPackage%==false set __msbuildArgs=%__msbuildArgs% /p:BuildNugetPackage=false
419
420 %_msbuildexe% %__msbuildArgs%
421 if errorlevel 1 (
422     echo %__MsgPrefix%Error: MScorlib build failed. Refer to the build log files for details:
423     echo     %__BuildLog%
424     echo     %__BuildWrn%
425     echo     %__BuildErr%
426     exit /b 1
427 )
428
429 if defined __MscorlibOnly (
430     echo %__MsgPrefix%Mscorlib successfully built.
431     exit /b 0
432 )
433
434 REM Consider doing crossgen build of mscorlib.
435
436 if /i "%__BuildArch%" == "x86" (
437     if not defined __DoCrossgen (
438         echo %__MsgPrefix%Skipping Crossgen
439         goto SkipCrossGenBuild
440     )
441 )
442
443 if /i "%__BuildArch%" == "arm64" (
444     if not defined __DoCrossgen (
445         echo %__MsgPrefix%Skipping Crossgen
446         goto SkipCrossGenBuild
447     )
448 )
449
450 echo %__MsgPrefix%Generating native image of mscorlib for %__BuildOS%.%__BuildArch%.%__BuildType%
451
452 set "__CrossGenMScorlibLog=%__LogsDir%\CrossgenMScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
453 "%__BinDir%\crossgen.exe" "%__BinDir%\mscorlib.dll" > "%__CrossGenMScorlibLog%" 2>&1
454 if errorlevel 1 (
455     echo %__MsgPrefix%Error: CrossGen mscorlib build failed. Refer to the build log file for details:
456     echo     %__CrossGenMScorlibLog%
457     exit /b 1
458 )
459
460 :SkipCrossGenBuild
461
462 REM endlocal to rid us of environment changes from vsdevenv.bat
463 endlocal
464
465 :SkipMscorlibBuild
466
467 REM =========================================================================================
468 REM ===
469 REM === Test build section
470 REM ===
471 REM =========================================================================================
472
473 if defined __SkipTestBuild (
474     echo %__MsgPrefix%Skipping test build
475     goto SkipTestBuild
476 )
477
478 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
479
480 REM Construct the arguments to pass to the test build script.
481
482 set __BuildtestArgs=%__BuildArch% %__BuildType% %__VSVersion%
483
484 if defined __CleanBuild (
485     set "__BuildtestArgs=%__BuildtestArgs% clean"
486 )
487
488 if defined __BuildSequential (
489     set "__BuildtestArgs=%__BuildtestArgs% sequential"
490 )
491
492 if defined __TestPriority (
493     set "__BuildtestArgs=%__BuildtestArgs% Priority %__TestPriority%"
494 )
495
496 call %__ProjectDir%\tests\buildtest.cmd %__BuildtestArgs%
497
498 if errorlevel 1 (
499     REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
500     exit /b 1
501 )
502
503 :SkipTestBuild
504
505 REM =========================================================================================
506 REM ===
507 REM === All builds complete!
508 REM ===
509 REM =========================================================================================
510
511 echo %__MsgPrefix%Repo successfully built.
512 echo %__MsgPrefix%Product binaries are available at !__BinDir!
513 if not defined __SkipTestBuild (
514     echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
515 )
516 exit /b 0
517
518 REM =========================================================================================
519 REM ===
520 REM === Handle the "all" case.
521 REM ===
522 REM =========================================================================================
523
524 :BuildAll
525
526 set __BuildArchList=
527
528 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
529 if %__TotalSpecifiedBuildArch% EQU 0 (
530     REM Nothing specified means we want to build all architectures.
531     set __BuildArchList=x64 x86 arm arm64
532 )
533
534 REM Otherwise, add all the specified architectures to the list.
535
536 if %__BuildArchX64%==1      set __BuildArchList=%__BuildArchList% x64
537 if %__BuildArchX86%==1      set __BuildArchList=%__BuildArchList% x86
538 if %__BuildArchArm%==1      set __BuildArchList=%__BuildArchList% arm
539 if %__BuildArchArm64%==1    set __BuildArchList=%__BuildArchList% arm64
540
541 set __BuildTypeList=
542
543 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
544 if %__TotalSpecifiedBuildType% EQU 0 (
545     REM Nothing specified means we want to build all build types.
546     set __BuildTypeList=Debug Checked Release
547 )
548
549 if %__BuildTypeDebug%==1    set __BuildTypeList=%__BuildTypeList% Debug
550 if %__BuildTypeChecked%==1  set __BuildTypeList=%__BuildTypeList% Checked
551 if %__BuildTypeRelease%==1  set __BuildTypeList=%__BuildTypeList% Release
552
553 REM Create a temporary file to collect build results. We always build all flavors specified, and
554 REM report a summary of the results at the end.
555
556 set __AllBuildSuccess=true
557 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
558 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
559
560 for %%i in (%__BuildArchList%) do (
561     for %%j in (%__BuildTypeList%) do (
562         call :BuildOne %%i %%j
563     )
564 )
565
566 if %__AllBuildSuccess%==true (
567     echo %__MsgPrefix%All builds succeeded!
568     exit /b 0
569 ) else (
570     echo %__MsgPrefix%Builds failed:
571     type %__BuildResultFile%
572     del /f /q %__BuildResultFile%
573     exit /b 1
574 )
575
576 REM This code is unreachable, but leaving it nonetheless, just in case things change.
577 exit /b 99
578
579 :BuildOne
580 set __BuildArch=%1
581 set __BuildType=%2
582 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
583 echo %__MsgPrefix%Invoking: %__NextCmd%
584 %__NextCmd%
585 if errorlevel 1 (
586     echo %__MsgPrefix%    %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
587     set __AllBuildSuccess=false
588 )
589 exit /b 0
590
591 REM =========================================================================================
592 REM ===
593 REM === Helper routines
594 REM ===
595 REM =========================================================================================
596
597 :Usage
598 echo.
599 echo Build the CoreCLR repo.
600 echo.
601 echo Usage:
602 echo     %__ThisScriptShort% [option1] [option2] ...
603 echo or:
604 echo     %__ThisScriptShort% all [option1] [option2] ...
605 echo.
606 echo All arguments are optional. The options are:
607 echo.
608 echo./? -? /h -h /help -help: view this message.
609 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
610 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
611 echo Visual Studio version: one of VS2013 or VS2015 to force using a particular
612 echo     Visual Studio version ^(default: VS2015^).
613 echo clean: force a clean build ^(default is to perform an incremental build^).
614 echo docrossgen: do a crossgen build of mscorlib.
615 echo msbuildargs ... : all arguments following this tag will be passed directly to msbuild.
616 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, osxmscorlib,
617 echo     or windowsmscorlib. If one of these is passed, only mscorlib is built,
618 echo     for the specified platform ^(FreeBSD, Linux, OS X, or Windows,
619 echo     respectively^).
620 echo priority ^<N^> : specify a set of test that will be built and run, with priority N.
621 echo sequential: force a non-parallel build ^(default is to build in parallel
622 echo     using all processors^).
623 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
624 echo skipconfigure: skip CMake ^(default: CMake is run^)
625 echo skipmscorlib: skip building mscorlib ^(default: mscorlib is built^).
626 echo skipnative: skip building native components ^(default: native components are built^).
627 echo skiptests: skip building tests ^(default: tests are built^).
628 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
629 echo.
630 echo If "all" is specified, then all build architectures and types are built. If, in addition,
631 echo one or more build architectures or types is specified, then only those build architectures
632 echo and types are built.
633 echo.
634 echo For example:
635 echo     build all
636 echo        -- builds all architectures, and all build types per architecture
637 echo     build all x86
638 echo        -- builds all build types for x86
639 echo     build all x64 x86 Checked Release
640 echo        -- builds x64 and x86 architectures, Checked and Release build types for each
641 exit /b 1
642
643 :NoVS
644 echo Visual Studio 2013+ ^(Community is free^) is a prerequisite to build this repository.
645 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
646 exit /b 1
647
648 :NoDIA
649 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
650 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
651 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
652 of the previous version to "%VSINSTALLDIR%" and then build.
653 :: DIA SDK not included in Express editions
654 echo Visual Studio 2013 Express does not include the DIA SDK. ^
655 You need Visual Studio 2013+ (Community is free).
656 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
657 exit /b 1