1 @if not defined __echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
4 set __ThisScriptShort=%0
5 set __ThisScriptFull="%~f0"
6 set __ThisScriptPath="%~dp0"
8 :: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
9 :: __BuildArch -- default: x64
10 :: __BuildType -- default: Debug
11 :: __BuildOS -- default: Windows_NT
12 :: __ProjectDir -- default: directory of the dir.props file
13 :: __SourceDir -- default: %__ProjectDir%\src\
14 :: __PackagesDir -- default: %__ProjectDir%\packages\
15 :: __RootBinDir -- default: %__ProjectDir%\bin\
16 :: __BinDir -- default: %__RootBinDir%\%__BuildOS%.%__BuildArch.%__BuildType%\
18 :: __PackagesBinDir -- default: %__BinDir%\.nuget
19 :: __TestWorkingDir -- default: %__RootBinDir%\tests\%__BuildOS%.%__BuildArch.%__BuildType%\
21 :: Thus, these variables are not simply internal to this script!
23 :: Set the default arguments for build
26 set __BuildOS=Windows_NT
28 :: Default to highest Visual Studio version available
29 set __VSVersion=vs2015
31 if defined VS140COMNTOOLS set __VSVersion=vs2015
33 :: Define a prefix for most output progress messages that come from this script. That makes
34 :: it easier to see where these are coming from. Note that there is a trailing space here.
35 set __MsgPrefix=BUILD:
37 :: Set the various build properties here so that CMake and MSBuild can pick them up
38 set "__ProjectDir=%~dp0"
39 :: remove trailing slash
40 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
41 set "__ProjectFilesDir=%__ProjectDir%"
42 set "__SourceDir=%__ProjectDir%\src"
43 set "__PackagesDir=%__ProjectDir%\packages"
44 set "__RootBinDir=%__ProjectDir%\bin"
45 set "__LogsDir=%__RootBinDir%\Logs"
51 set __SkipMscorlibBuild=
52 set __SkipNativeBuild=
54 set __BuildSequential=
55 set __msbuildCleanBuildArgs=
56 set __msbuildExtraArgs=
58 set __OfficialBuildIdArg=
65 set __BuildArchArm64=0
67 set __BuildTypeDebug=0
68 set __BuildTypeChecked=0
69 set __BuildTypeRelease=0
71 set __BuildJit32="-DBUILD_JIT32=0"
73 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
75 set __PassThroughArgs=
78 if "%1" == "" goto ArgsDone
80 if /i "%1" == "/?" goto Usage
81 if /i "%1" == "-?" goto Usage
82 if /i "%1" == "/h" goto Usage
83 if /i "%1" == "-h" goto Usage
84 if /i "%1" == "/help" goto Usage
85 if /i "%1" == "-help" goto Usage
87 if /i "%1" == "all" (set __BuildAll=1&shift&goto Arg_Loop)
89 if /i "%1" == "x64" (set __BuildArchX64=1&shift&goto Arg_Loop)
90 if /i "%1" == "x86" (set __BuildArchX86=1&shift&goto Arg_Loop)
91 if /i "%1" == "arm" (set __BuildArchArm=1&shift&goto Arg_Loop)
92 if /i "%1" == "arm64" (set __BuildArchArm64=1&shift&goto Arg_Loop)
94 if /i "%1" == "debug" (set __BuildTypeDebug=1&shift&goto Arg_Loop)
95 if /i "%1" == "checked" (set __BuildTypeChecked=1&shift&goto Arg_Loop)
96 if /i "%1" == "release" (set __BuildTypeRelease=1&shift&goto Arg_Loop)
98 REM All arguments after this point will be passed through directly to build.cmd on nested invocations
99 REM using the "all" argument, and must be added to the __PassThroughArgs variable.
100 set __PassThroughArgs=%__PassThroughArgs% %1
102 if /i "%1" == "clean" (set __CleanBuild=1&shift&goto Arg_Loop)
104 if /i "%1" == "freebsdmscorlib" (set __MscorlibOnly=1&set __BuildOS=FreeBSD&shift&goto Arg_Loop)
105 if /i "%1" == "linuxmscorlib" (set __MscorlibOnly=1&set __BuildOS=Linux&shift&goto Arg_Loop)
106 if /i "%1" == "netbsdmscorlib" (set __MscorlibOnly=1&set __BuildOS=NetBSD&shift&goto Arg_Loop)
107 if /i "%1" == "osxmscorlib" (set __MscorlibOnly=1&set __BuildOS=OSX&shift&goto Arg_Loop)
108 if /i "%1" == "windowsmscorlib" (set __MscorlibOnly=1&set __BuildOS=Windows_NT&shift&goto Arg_Loop)
110 if /i "%1" == "vs2015" (set __VSVersion=%1&shift&goto Arg_Loop)
111 if /i "%1" == "configureonly" (set __ConfigureOnly=1&set __SkipMscorlibBuild=1&set __SkipTestBuild=1&shift&goto Arg_Loop)
112 if /i "%1" == "skipconfigure" (set __SkipConfigure=1&shift&goto Arg_Loop)
113 if /i "%1" == "skipmscorlib" (set __SkipMscorlibBuild=1&shift&goto Arg_Loop)
114 if /i "%1" == "skipnative" (set __SkipNativeBuild=1&shift&goto Arg_Loop)
115 if /i "%1" == "skiptests" (set __SkipTestBuild=1&shift&goto Arg_Loop)
116 if /i "%1" == "sequential" (set __BuildSequential=1&shift&goto Arg_Loop)
117 if /i "%1" == "disableoss" (set __SignTypeReal="/p:SignType=real"&shift&goto Arg_Loop)
118 if /i "%1" == "priority" (set __TestPriority=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
119 if /i "%1" == "gcstresslevel" (set __GCStressLevel=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
120 if /i "%1" == "buildjit32" (set __BuildJit32="-DBUILD_JIT32=1"&shift&goto Arg_Loop)
122 @REM For backwards compatibility, continue accepting "skiptestbuild", which was the original name of the option.
123 if /i "%1" == "skiptestbuild" (set __SkipTestBuild=1&shift&goto Arg_Loop)
125 @REM It was initially /toolset_dir. Not sure why, since it doesn't match the other usage.
126 if /i "%1" == "/toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
127 if /i "%1" == "toolset_dir" (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
129 if /i not "%1" == "msbuildargs" goto SkipMsbuildArgs
130 :: All the rest of the args will be collected and passed directly to msbuild.
133 if "%1"=="" goto ArgsDone
134 if /i [%1] == [/p:OfficialBuildId] (
136 echo Error: /p:OfficialBuildId arg should have a value
139 set __OfficialBuildIdArg=/p:OfficialBuildId=%2
141 goto CollectMsbuildArgs
143 set __msbuildExtraArgs=%__msbuildExtraArgs% %1
144 set __PassThroughArgs=%__PassThroughArgs% %1
145 goto CollectMsbuildArgs
148 echo Invalid command-line argument: %1
153 if defined __ConfigureOnly if defined __SkipConfigure (
154 echo "Error: option 'configureonly' is incompatible with 'skipconfigure'"
158 if defined __SkipMscorlibBuild if defined __MscorlibOnly (
159 echo Error: option 'skipmscorlib' is incompatible with 'freebsdmscorlib', 'linuxmscorlib', 'netbsdmscorlib', 'osxmscorlib' and 'windowsmscorlib'.
163 if defined __BuildAll goto BuildAll
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.
171 if %__BuildArchX64%==1 set __BuildArch=x64
172 if %__BuildArchX86%==1 set __BuildArch=x86
173 if %__BuildArchArm%==1 set __BuildArch=arm
174 if %__BuildArchArm64%==1 (
175 set __BuildArch=arm64
179 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
180 if %__TotalSpecifiedBuildType% GTR 1 (
181 echo Error: more than one build type specified, but "all" not specified.
185 if %__BuildTypeDebug%==1 set __BuildType=Debug
186 if %__BuildTypeChecked%==1 set __BuildType=Checked
187 if %__BuildTypeRelease%==1 set __BuildType=Release
189 echo %__MsgPrefix%Commencing CoreCLR Repo build
191 :: Set the remaining variables based upon the determined build configuration
192 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
193 set "__IntermediatesDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
194 set "__PackagesBinDir=%__BinDir%\.nuget"
195 set "__TestRootDir=%__RootBinDir%\tests"
196 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
197 set "__TestIntermediatesDir=%__RootBinDir%\tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
198 set "__CrossComponentBinDir=%__BinDir%"
199 if defined __CrossArch set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
201 :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
202 set "__CMakeBinDir=%__BinDir%"
203 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
205 :: Configure environment if we are doing a clean build.
206 if not defined __CleanBuild goto SkipCleanBuild
207 echo %__MsgPrefix%Doing a clean build
209 :: MSBuild projects would need a rebuild
210 set __msbuildCleanBuildArgs=/t:rebuild
212 :: Cleanup the previous output for the selected configuration
213 if exist "%__BinDir%" rd /s /q "%__BinDir%"
214 if exist "%__IntermediatesDir%" rd /s /q "%__IntermediatesDir%"
215 if exist "%__TestBinDir%" rd /s /q "%__TestBinDir%"
216 if exist "%__TestIntermediatesDir%" rd /s /q "%__TestIntermediatesDir%"
217 if exist "%__LogsDir%" del /f /q "%__LogsDir%\*_%__BuildOS%__%__BuildArch%__%__BuildType%.*"
218 if exist "%__ProjectDir%\Tools" rd /s /q "%__ProjectDir%\Tools"
222 if not exist "%__BinDir%" md "%__BinDir%"
223 if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
224 if not exist "%__LogsDir%" md "%__LogsDir%"
226 :: CMake isn't a requirement when building mscorlib only
227 if defined __MscorlibOnly goto CheckVS
229 echo %__MsgPrefix%Checking prerequisites
231 :: Validate that PowerShell is accessibile.
232 for %%X in (powershell.exe) do (set __PSDir=%%~$PATH:X)
233 if not defined __PSDir goto :NoPS
235 :: Validate Powershell version
236 set "PS_VERSION_LOG=%__LogsDir%\ps-version.log"
237 powershell -NoProfile -ExecutionPolicy unrestricted -Command "$PSVersionTable.PSVersion.Major" > %PS_VERSION_LOG%
238 set /P PS_VERSION=< %PS_VERSION_LOG%
239 if %PS_VERSION% LEQ 2 (
243 :: Eval the output from probe-win1.ps1
244 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy RemoteSigned "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
248 set __VSProductVersion=
249 if /i "%__VSVersion%" == "vs2015" set __VSProductVersion=140
251 :: Check presence of VS
252 if not defined VS%__VSProductVersion%COMNTOOLS goto NoVS
254 set __VSToolsRoot=!VS%__VSProductVersion%COMNTOOLS!
255 if %__VSToolsRoot:~-1%==\ set "__VSToolsRoot=%__VSToolsRoot:~0,-1%"
257 :: Does VS really exist?
258 if not exist "%__VSToolsRoot%\..\IDE\devenv.exe" goto NoVS
259 if not exist "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" goto NoVS
260 if not exist "%__VSToolsRoot%\VsDevCmd.bat" goto NoVS
263 set _msbuildexe="%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe"
265 if not exist %_msbuildexe% set _msbuildexe="%ProgramFiles%\MSBuild\14.0\Bin\MSBuild.exe"
266 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
268 :: Note: We've disabled node reuse because it causes file locking issues.
269 :: The issue is that we extend the build with our own targets which
270 :: means that that rebuilding cannot successfully delete the task
272 set __msbuildCommonArgs=/nologo /nodeReuse:false %__msbuildCleanBuildArgs% %__msbuildExtraArgs%
274 if not defined __BuildSequential (
275 set __msbuildCommonArgs=%__msbuildCommonArgs% /maxcpucount
278 REM =========================================================================================
280 REM === Restore Build Tools
282 REM =========================================================================================
283 call %__ThisScriptPath%init-tools.cmd
285 echo ERROR: Could not restore build tools.
289 REM =========================================================================================
291 REM === Start the build steps
293 REM =========================================================================================
295 :: Generate _version.h
296 if exist "%__RootBinDir%\obj\_version.h" del "%__RootBinDir%\obj\_version.h"
297 %_msbuildexe% "%__ProjectFilesDir%\build.proj" /t:GenerateVersionHeader /v:minimal /p:NativeVersionHeaderFile="%__RootBinDir%\obj\_version.h" /p:GenerateVersionHeader=true %__OfficialBuildIdArg%
298 if defined __MscorlibOnly goto PerformMScorlibBuild
300 if defined __SkipNativeBuild (
301 echo %__MsgPrefix%Skipping native components build
305 echo %__MsgPrefix%Commencing build of native components for %__BuildOS%.%__BuildArch%.%__BuildType%
307 REM Use setlocal to restrict environment changes form vcvarsall.bat and more to just this native components build section.
308 setlocal EnableDelayedExpansion EnableExtensions
310 if /i "%__BuildArch%" == "arm64" (
311 rem arm64 builds currently use private toolset which has not been released yet
312 REM TODO, remove once the toolset is open.
318 :: Set the environment for the native build
319 set __VCBuildArch=x86_amd64
320 if /i "%__BuildArch%" == "x86" (set __VCBuildArch=x86)
321 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" %__VCBuildArch%
322 call "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" %__VCBuildArch%
323 @if defined __echo @echo on
325 if not defined VSINSTALLDIR (
326 echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
329 if not exist "%VSINSTALLDIR%DIA SDK" goto NoDIA
333 if defined __SkipConfigure goto SkipConfigure
335 echo %__MsgPrefix%Regenerating the Visual Studio solution
337 pushd "%__IntermediatesDir%"
338 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32%
339 @if defined __echo @echo on
344 if not exist "%__IntermediatesDir%\install.vcxproj" (
345 echo %__MsgPrefix%Error: failed to generate native component build project!
349 REM =========================================================================================
351 REM === Build the CLR VM
353 REM =========================================================================================
355 if defined __ConfigureOnly goto SkipNativeBuild
357 echo %__MsgPrefix%Invoking msbuild
359 set "__BuildLog=%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
360 set "__BuildWrn=%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
361 set "__BuildErr=%__LogsDir%\CoreCLR_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
362 set __msbuildLogArgs=^
363 /fileloggerparameters:Verbosity=normal;LogFile="%__BuildLog%" ^
364 /fileloggerparameters1:WarningsOnly;LogFile="%__BuildWrn%" ^
365 /fileloggerparameters2:ErrorsOnly;LogFile="%__BuildErr%" ^
366 /consoleloggerparameters:Summary ^
369 set __msbuildArgs="%__IntermediatesDir%\install.vcxproj" %__msbuildCommonArgs% %__msbuildLogArgs% /p:Configuration=%__BuildType%
371 if /i "%__BuildArch%" == "arm64" (
372 REM TODO, remove once we have msbuild support for this platform.
373 set __msbuildArgs=%__msbuildArgs% /p:UseEnv=true
375 set __msbuildArgs=%__msbuildArgs% /p:Platform=%__BuildArch%
378 %_msbuildexe% %__msbuildArgs%
380 echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details:
387 REM endlocal to rid us of environment changes from vcvarsall.bat
392 REM =========================================================================================
394 REM === Mscorlib and NuGet package build section.
396 REM =========================================================================================
398 :PerformMScorlibBuild
400 REM setlocal to prepare for vsdevcmd.bat
401 setlocal EnableDelayedExpansion EnableExtensions
403 rem Explicitly set Platform causes conflicts in mscorlib project files. Clear it to allow building from VS x64 Native Tools Command Prompt
406 :: Set the environment for the managed build
407 echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\VsDevCmd.bat"
408 call "%__VSToolsRoot%\VsDevCmd.bat"
410 if defined __SkipMscorlibBuild (
411 echo %__MsgPrefix%Skipping Mscorlib build
412 goto SkipMscorlibBuild
415 echo %__MsgPrefix%Commencing build of mscorlib for %__BuildOS%.%__BuildArch%.%__BuildType%
417 set "__BuildLog=%__LogsDir%\MScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
418 set "__BuildWrn=%__LogsDir%\MScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
419 set "__BuildErr=%__LogsDir%\MScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
420 set __msbuildLogArgs=^
421 /fileloggerparameters:Verbosity=normal;LogFile="%__BuildLog%" ^
422 /fileloggerparameters1:WarningsOnly;LogFile="%__BuildWrn%" ^
423 /fileloggerparameters2:ErrorsOnly;LogFile="%__BuildErr%" ^
424 /consoleloggerparameters:Summary ^
427 set __msbuildArgs="%__ProjectFilesDir%\build.proj" %__msbuildCommonArgs% %__msbuildLogArgs% %__SignTypeReal%
429 set __BuildNugetPackage=true
430 if defined __MscorlibOnly set __BuildNugetPackage=false
431 if /i "%__BuildArch%" =="arm64" set __BuildNugetPackage=false
432 if %__BuildNugetPackage%==false set __msbuildArgs=%__msbuildArgs% /p:BuildNugetPackage=false
434 %_msbuildexe% %__msbuildArgs%
436 echo %__MsgPrefix%Error: MScorlib build failed. Refer to the build log files for details:
443 if defined __MscorlibOnly (
444 echo %__MsgPrefix%Mscorlib successfully built.
448 echo %__MsgPrefix%Generating native image of mscorlib for %__BuildOS%.%__BuildArch%.%__BuildType%
450 set "__CrossGenMScorlibLog=%__LogsDir%\CrossgenMScorlib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
451 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
452 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\mscorlib.ni.dll" "%__BinDir%\mscorlib.dll" > "%__CrossGenMScorlibLog%" 2>&1
453 if NOT errorlevel 0 (
454 echo %__MsgPrefix%Error: CrossGen mscorlib build failed. Refer to the build log file for details:
455 echo %__CrossGenMScorlibLog%
462 if /i "%__BuildArch%" =="arm64" goto :SkipNuget
464 set "__BuildLog=%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
465 set "__BuildWrn=%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
466 set "__BuildErr=%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
467 set __msbuildLogArgs=^
468 /fileloggerparameters:Verbosity=normal;LogFile="%__BuildLog%" ^
469 /fileloggerparameters1:WarningsOnly;LogFile="%__BuildWrn%" ^
470 /fileloggerparameters2:ErrorsOnly;LogFile="%__BuildErr%" ^
471 /consoleloggerparameters:Summary ^
474 if not defined __SkipMscorlibBuild (
475 set __msbuildArgs="%__ProjectFilesDir%\src\.nuget\Microsoft.NETCore.Runtime.CoreClr\Microsoft.NETCore.Runtime.CoreCLR.builds" /p:Platform=%__BuildArch%
476 %_msbuildexe% !__msbuildArgs! %__msbuildLogArgs%
478 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
486 if not defined __SkipNativeBuild (
487 set __msbuildArgs="%__ProjectFilesDir%\src\.nuget\Microsoft.NETCore.Jit\Microsoft.NETCore.Jit.builds" /p:Platform=%__BuildArch%
488 %_msbuildexe% !__msbuildArgs! %__msbuildLogArgs%
490 echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
500 REM endlocal to rid us of environment changes from vsdevenv.bat
503 REM =========================================================================================
505 REM === Test build section
507 REM =========================================================================================
509 if defined __SkipTestBuild (
510 echo %__MsgPrefix%Skipping test build
514 echo %__MsgPrefix%Commencing build of tests for %__BuildOS%.%__BuildArch%.%__BuildType%
516 REM Construct the arguments to pass to the test build script.
518 set __BuildtestArgs=%__BuildArch% %__BuildType% %__VSVersion%
520 if defined __CleanBuild (
521 set "__BuildtestArgs=%__BuildtestArgs% clean"
524 if defined __BuildSequential (
525 set "__BuildtestArgs=%__BuildtestArgs% sequential"
528 if defined __TestPriority (
529 set "__BuildtestArgs=%__BuildtestArgs% Priority %__TestPriority%"
532 if %__GCStressLevel% GTR 0 (
533 set "__BuildtestArgs=%__BuildtestArgs% gcstresslevel %__GCStressLevel%"
536 rem arm64 builds currently use private toolset which has not been released yet
537 REM TODO, remove once the toolset is open.
538 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet
540 call %__ProjectDir%\tests\buildtest.cmd %__BuildtestArgs%
543 REM buildtest.cmd has already emitted an error message and mentioned the build log file to examine.
549 REM =========================================================================================
551 REM === All builds complete!
553 REM =========================================================================================
555 echo %__MsgPrefix%Repo successfully built.
556 echo %__MsgPrefix%Product binaries are available at !__BinDir!
557 if not defined __SkipTestBuild (
558 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
562 REM =========================================================================================
564 REM === Handle the "all" case.
566 REM =========================================================================================
572 set /A __TotalSpecifiedBuildArch=__BuildArchX64 + __BuildArchX86 + __BuildArchArm + __BuildArchArm64
573 if %__TotalSpecifiedBuildArch% EQU 0 (
574 REM Nothing specified means we want to build all architectures.
575 set __BuildArchList=x64 x86 arm arm64
578 REM Otherwise, add all the specified architectures to the list.
580 if %__BuildArchX64%==1 set __BuildArchList=%__BuildArchList% x64
581 if %__BuildArchX86%==1 set __BuildArchList=%__BuildArchList% x86
582 if %__BuildArchArm%==1 set __BuildArchList=%__BuildArchList% arm
583 if %__BuildArchArm64%==1 set __BuildArchList=%__BuildArchList% arm64
587 set /A __TotalSpecifiedBuildType=__BuildTypeDebug + __BuildTypeChecked + __BuildTypeRelease
588 if %__TotalSpecifiedBuildType% EQU 0 (
589 REM Nothing specified means we want to build all build types.
590 set __BuildTypeList=Debug Checked Release
593 if %__BuildTypeDebug%==1 set __BuildTypeList=%__BuildTypeList% Debug
594 if %__BuildTypeChecked%==1 set __BuildTypeList=%__BuildTypeList% Checked
595 if %__BuildTypeRelease%==1 set __BuildTypeList=%__BuildTypeList% Release
597 REM Create a temporary file to collect build results. We always build all flavors specified, and
598 REM report a summary of the results at the end.
600 set __AllBuildSuccess=true
601 set __BuildResultFile=%TEMP%\build-all-summary-%RANDOM%.txt
602 if exist %__BuildResultFile% del /f /q %__BuildResultFile%
604 for %%i in (%__BuildArchList%) do (
605 for %%j in (%__BuildTypeList%) do (
606 call :BuildOne %%i %%j
610 if %__AllBuildSuccess%==true (
611 echo %__MsgPrefix%All builds succeeded!
614 echo %__MsgPrefix%Builds failed:
615 type %__BuildResultFile%
616 del /f /q %__BuildResultFile%
620 REM This code is unreachable, but leaving it nonetheless, just in case things change.
626 set __NextCmd=call %__ThisScriptFull% %__BuildArch% %__BuildType% %__PassThroughArgs%
627 echo %__MsgPrefix%Invoking: %__NextCmd%
630 echo %__MsgPrefix% %__BuildArch% %__BuildType% %__PassThroughArgs% >> %__BuildResultFile%
631 set __AllBuildSuccess=false
635 REM =========================================================================================
637 REM === Helper routines
639 REM =========================================================================================
643 echo Build the CoreCLR repo.
646 echo %__ThisScriptShort% [option1] [option2] ...
648 echo %__ThisScriptShort% all [option1] [option2] ...
650 echo All arguments are optional. The options are:
652 echo./? -? /h -h /help -help: view this message.
653 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
654 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
655 echo Visual Studio version: ^(default: VS2015^).
656 echo clean: force a clean build ^(default is to perform an incremental build^).
657 echo msbuildargs ... : all arguments following this tag will be passed directly to msbuild.
658 echo mscorlib version: one of freebsdmscorlib, linuxmscorlib, netbsdmscorlib, osxmscorlib,
659 echo or windowsmscorlib. If one of these is passed, only mscorlib is built,
660 echo for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
662 echo priority ^<N^> : specify a set of test that will be built and run, with priority N.
663 echo gcstresslevel ^<N^> : specify the GCStress level the tests should run under.
664 echo sequential: force a non-parallel build ^(default is to build in parallel
665 echo using all processors^).
666 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
667 echo skipconfigure: skip CMake ^(default: CMake is run^)
668 echo skipmscorlib: skip building mscorlib ^(default: mscorlib is built^).
669 echo skipnative: skip building native components ^(default: native components are built^).
670 echo skiptests: skip building tests ^(default: tests are built^).
671 echo disableoss: Disable Open Source Signing for mscorlib.
672 echo toolset_dir ^<dir^> : set the toolset directory -- Arm64 use only. Required for Arm64 builds.
674 echo If "all" is specified, then all build architectures and types are built. If, in addition,
675 echo one or more build architectures or types is specified, then only those build architectures
676 echo and types are built.
680 echo -- builds all architectures, and all build types per architecture
682 echo -- builds all build types for x86
683 echo build all x64 x86 Checked Release
684 echo -- builds x64 and x86 architectures, Checked and Release build types for each
688 echo PowerShell v3.0 or later is a prerequisite to build this repository, but it is not accessible.
689 echo Ensure that it is defined in the PATH environment variable.
690 echo Typically it should be %%SYSTEMROOT%%\System32\WindowsPowerShell\v1.0\.
694 echo PowerShell v3.0 or later is a prerequisite to build this repository.
695 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/building/windows-instructions.md
696 echo Download via https://www.microsoft.com/en-us/download/details.aspx?id=40855
700 echo Visual Studio 2015+ ^(Community is free^) is a prerequisite to build this repository.
701 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/building/windows-instructions.md
705 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
706 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
707 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
708 of the previous version to "%VSINSTALLDIR%" and then build.
709 :: DIA SDK not included in Express editions
710 echo Visual Studio Express does not include the DIA SDK. ^
711 You need Visual Studio 2015+ (Community is free).
712 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
717 echo %__MsgPrefix% Setting Up the usage of __ToolsetDir:%__ToolsetDir%
719 if /i "%__ToolsetDir%" == "" (
720 echo %__MsgPrefix%Error: A toolset directory is required for the Arm64 Windows build. Use the toolset_dir argument.
724 set PATH=%__ToolsetDir%\VC_sdk\bin;%PATH%
725 set LIB=%__ToolsetDir%\VC_sdk\lib\arm64;%__ToolsetDir%\sdpublic\sdk\lib\arm64
727 %__ToolsetDir%\VC_sdk\inc;^
728 %__ToolsetDir%\sdpublic\sdk\inc;^
729 %__ToolsetDir%\sdpublic\shared\inc;^
730 %__ToolsetDir%\sdpublic\shared\inc\minwin;^
731 %__ToolsetDir%\sdpublic\sdk\inc\ucrt;^
732 %__ToolsetDir%\sdpublic\sdk\inc\minwin;^
733 %__ToolsetDir%\sdpublic\sdk\inc\mincore;^
734 %__ToolsetDir%\sdpublic\sdk\inc\abi;^
735 %__ToolsetDir%\sdpublic\sdk\inc\clientcore;^
736 %__ToolsetDir%\diasdk\include