@echo off setlocal :: Description of command line arguments (disabled by default): :: "debug" The target is intended to run in a debugger with debug info and optimizations disabled :: "developer" The target will include all developer tooling :: "profiling" The target will be compiled with profiling markup :: "asan" The target will compile with address sanitizer enabled :: "msvc" Compile with MSVC instead of Clang for %%a in (%*) do set "%%a=1" :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Verify environment :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: if "%Platform%" neq "x64" ( echo ERROR: Platform is not "x64" - please run this from the MSVC x64 native tools command prompt. exit /b 1 ) if "%msvc%" == "1" ( where /q cl.exe || ( echo ERROR: "cl.exe" not found. exit /b 1 ) ) else ( where /q clang.exe || ( echo ERROR: "clang.exe" not found. exit /b 1 ) where /q lld-link || ( echo ERROR: "lld-link.exe" not found. exit /b 1 ) ) where /q ninja.exe || ( echo ERROR: "ninja.exe" not found. exit /b 1 ) where /q cmake || ( echo ERROR: "cmake.exe" not found. exit /b 1 ) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Choose configuration from args :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Must explicitly pass disabled CMake options or else missing options are :: assumed to be equal to the value from the last build set cmake_options_zero=-DRTC=0 -DASAN=0 -DCRTLIB=0 -DDEBINFO=0 -DDEVELOPER=0 -DPROFILING=0 -DUNOPTIMIZED=0 -DMSVC=0 set cmake_options_enabled= echo ======================================== if "%msvc%" == "1" ( echo [Msvc] set cmake_options_enabled=%cmake_options_enabled% -DMSVC=1 ) else ( echo [Clang] ) if "%debug%" == "1" ( echo [Debug build] set cmake_options_enabled=%cmake_options_enabled% -DRTC=1 -DCRTLIB=1 -DDEBINFO=1 -DUNOPTIMIZED=1 ) else ( echo [Release build] ) if "%developer%" == "1" ( echo [Developer build] set cmake_options_enabled=%cmake_options_enabled% -DDEVELOPER=1 ) else ( echo [User build] ) if "%profiling%" == "1" ( echo [Profiling enabled] set cmake_options_enabled=%cmake_options_enabled% -DPROFILING=1 -DCRTLIB=1 -DDEBINFO=1 ) if "%asan%" == "1" ( echo [Address sanitizer enabled] set cmake_options_enabled=%cmake_options_enabled% -DASAN=1 -DCRTLIB=1 -DDEBINFO=1 ) echo ======================================== :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Build :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: if not exist "build" mkdir build if "%msvc%" == "1" ( cmake -H. -G Ninja -B build %cmake_options_zero% %cmake_options_enabled%^ -DCMAKE_C_COMPILER:PATH="cl.exe"^ -DCMAKE_CXX_COMPILER:PATH="cl.exe"^ -DPLATFORM_WIN32=1 ) else ( cmake -H. -G Ninja -B build %cmake_options_zero% %cmake_options_enabled%^ -DCMAKE_C_COMPILER:PATH="clang.exe"^ -DCMAKE_CXX_COMPILER:PATH="clang.exe"^ -DCMAKE_C_COMPILER_ID="Clang"^ -DCMAKE_CXX_COMPILER_ID="Clang"^ -DCMAKE_SYSTEM_NAME="Generic"^ -DPLATFORM_WIN32=1 ) if NOT %errorlevel% == 0 ( echo. echo ERROR: Configuration failed exit /b 1 ) cmake --build build :: cmake --build build -v if NOT %errorlevel% == 0 ( echo. echo ERROR: Build failed exit /b 1 )