:: Set the default arguments for build set __BuildArch=x64 set __BuildType=Debug set __BuildOS=Windows_NT :: Default to highest Visual Studio version available set __VSVersion=vs2015 if defined VS150COMNTOOLS set __VSVersion=vs2017 :: Set the various build properties here so that CMake and MSBuild can pick them up set "__ProjectDir=%~dp0.." :: remove trailing slash if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%" set "__SourceDir=%__ProjectDir%\src" set "__PackagesDir=%__ProjectDir%\packages" set "__RootBinDir=%__ProjectDir%\bin" set "__LogsDir=%__RootBinDir%\Logs" set __MSBCleanBuildArgs= set __SkipTestBuild= set __ToolchainMilestone=testing set "__DotNetCliPath=%__ProjectDir%\Tools\dotnetcli" :Arg_Loop if "%1" == "" goto ArgsDone if /i "%1" == "/?" goto Usage if /i "%1" == "-?" goto Usage if /i "%1" == "/h" goto Usage if /i "%1" == "-h" goto Usage if /i "%1" == "/help" goto Usage if /i "%1" == "-help" goto Usage if /i "%1" == "x64" (set __BuildArch=x64&&shift&goto Arg_Loop) if /i "%1" == "x86" (set __BuildArch=x86&&shift&goto Arg_Loop) if /i "%1" == "arm" (set __BuildArch=arm&&shift&goto Arg_Loop) if /i "%1" == "debug" (set __BuildType=Debug&shift&goto Arg_Loop) if /i "%1" == "release" (set __BuildType=Release&shift&goto Arg_Loop) if /i "%1" == "vs2017" (set __VSVersion=vs2017&shift&goto Arg_Loop) if /i "%1" == "vs2015" (set __VSVersion=vs2015&shift&goto Arg_Loop) if /i "%1" == "clean" (set __CleanBuild=1&shift&goto Arg_Loop) if /i "%1" == "skiptests" (set __SkipTests=1&shift&goto Arg_Loop) if /i "%1" == "skipvsdev" (set __SkipVsDev=1&shift&goto Arg_Loop) if /i "%1" == "/milestone" (set __ToolchainMilestone=%2&shift&shift&goto Arg_Loop) if /i "%1" == "/dotnetclipath" (set __DotNetCliPath=%2&shift&shift&goto Arg_Loop) if /i "%1" == "/officialbuildid" (set "__ExtraMsBuildParams=/p:OfficialBuildId=%2"&shift&shift&goto Arg_Loop) echo Invalid command line argument: %1 exit /b 1 :ArgsDone :: Set the remaining variables based upon the determined build configuration set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%" set "__ObjDir=%__RootBinDir%\obj\%__BuildOS%.%__BuildArch%.%__BuildType%" set "__IntermediatesDir=%__RootBinDir%\obj\Native\%__BuildOS%.%__BuildArch%.%__BuildType%\" set "__RelativeProductBinDir=bin\Product\%__BuildOS%.%__BuildArch%.%__BuildType%" set "__NativeBuildLog=%__LogsDir%\Native_%__BuildOS%__%__BuildArch%__%__BuildType%.log" set "__BuildLog=%__LogsDir%\msbuild_%__BuildOS%__%__BuildArch%__%__BuildType%.log" set "__ReproProjectDir=%__ProjectDir%\src\ILCompiler\repro" set "__ReproProjectBinDir=%__BinDir%\repro" set "__ReproProjectObjDir=%__ObjDir%\repro" :: Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash set "__CMakeBinDir=%__BinDir%" set "__CMakeBinDir=%__CMakeBinDir:\=/%" :: Configure environment if we are doing a clean build. if not defined __CleanBuild goto MakeDirs echo Doing a clean build echo. :: MSBuild projects would need a rebuild set __MSBCleanBuildArgs=/t:rebuild /p:CleanedTheBuild=1 :: Cleanup the previous output for the selected configuration if exist "%__BinDir%" rd /s /q "%__BinDir%" if exist "%__ObjDir%" rd /s /q "%__ObjDir%" if exist "%__IntermediatesDir%" rd /s /q "%__IntermediatesDir%" if exist "%__LogsDir%" del /f /q "%__LogsDir%\*_%__BuildOS%__%__BuildArch%__%__BuildType%.*" :MakeDirs if not exist "%__BinDir%" md "%__BinDir%" if not exist "%__ObjDir%" md "%__ObjDir%" if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%" if not exist "%__LogsDir%" md "%__LogsDir%" :CheckPrereqs :: Check prerequisites echo Checking pre-requisites... echo. :: Validate that PowerShell is accessibile. for %%X in (powershell.exe) do (set __PSDir=%%~$PATH:X) if defined __PSDir goto EvaluatePS echo PowerShell is a prerequisite to build this repository. echo See: https://github.com/dotnet/corert/blob/master/Documentation/prerequisites-for-building.md exit /b 1 :EvaluatePS :: Eval the output from probe-win1.ps1 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\Native\probe-win.ps1"""') do %%a set __VSProductVersion= if /i "%__VSVersion%" == "vs2015" set __VSProductVersion=140 if /i "%__VSVersion%" == "vs2017" set __VSProductVersion=150 :: Check presence of VS if defined VS%__VSProductVersion%COMNTOOLS goto CheckVSExistence echo Visual Studio 2015 or 2017 (Community is free) is a pre-requisite to build this repository. echo If you're using Visual Studio 2017, make sure to run build.cmd from the "Developer Command Prompt echo for VS 2017" (find it in the Start menu). echo See: https://github.com/dotnet/corert/blob/master/Documentation/prerequisites-for-building.md exit /b 1 :CheckVSExistence :: Does VS VS 2015 really exist? if exist "!VS%__VSProductVersion%COMNTOOLS!\..\IDE\devenv.exe" goto CheckMSBuild echo Visual Studio not installed in !VS%__VSProductVersion%COMNTOOLS!. echo See: https://github.com/dotnet/corert/blob/master/Documentation/prerequisites-for-building.md exit /b 1 :CheckMSBuild :: Note: We've disabled node reuse because it causes file locking issues. :: The issue is that we extend the build with our own targets which :: means that that rebuilding cannot successfully delete the task :: assembly. if /i "%__VSVersion%" == "vs2017" ( rem The MSBuild that is installed in the shared location is not compatible rem with VS2017 C++ projects. I must use the MSBuild located in rem C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe rem which is compatible. However, I don't know a good way to specify this rem path in a way that isn't specific to my system, so I am relying on the rem system PATH to locate this tool. set _msbuildexe=msbuild ) else ( set _msbuildexe="%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" if not exist !_msbuildexe! (set _msbuildexe="%ProgramFiles%\MSBuild\14.0\Bin\MSBuild.exe") if not exist !_msbuildexe! (echo Error: Could not find MSBuild.exe. Please see https://github.com/dotnet/corert/blob/master/Documentation/prerequisites-for-building.md for build instructions. && exit /b 1) ) rem Explicitly set Platform causes conflicts in managed project files. Clear it to allow building from VS x64 Native Tools Command Prompt set Platform= :: Set the environment for the native build set __VCBuildArch=x86_amd64 if /i "%__BuildArch%" == "x86" (set __VCBuildArch=x86) rem Tell nuget to always use repo-local nuget package cache. The "dotnet restore" invocations use the --packages rem argument, but there are a few commands in publish and tests that do not. set "NUGET_PACKAGES=%__PackagesDir%" set BUILDVARS_DONE=1 exit /b 0 :Usage echo. echo Build the CoreRT repo. echo. echo Usage: echo %__ThisScriptShort% [option1] [option2] ... echo. echo All arguments are optional. The options are: echo. echo./? -? /h -h /help -help: view this message. echo Build architecture: one of x64, x86, arm ^(default: x64^). echo Build type: one of Debug, Checked, Release ^(default: Debug^). echo Visual Studio version: vs2015, vs2017 ^(defaults to highest detected^). echo clean: force a clean build ^(default is to perform an incremental build^). echo skiptests: skip building tests ^(default: tests are built^). exit /b 1