Add a build system
This commit is contained in:
120
build.bat
Normal file
120
build.bat
Normal file
@@ -0,0 +1,120 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
:: ============================================================================
|
||||
:: build.bat - Build script with compiler preference: clang-cl > gcc > clang
|
||||
:: Usage: build [Release|Debug] [clean]
|
||||
:: ============================================================================
|
||||
|
||||
set BUILD_TYPE=Release
|
||||
set CLEAN_BUILD=0
|
||||
|
||||
:: Parse arguments
|
||||
:parse_args
|
||||
if "%~1"=="" goto :main
|
||||
|
||||
if /i "%~1"=="Release" (
|
||||
set BUILD_TYPE=Release
|
||||
shift
|
||||
goto :parse_args
|
||||
)
|
||||
if /i "%~1"=="Debug" (
|
||||
set BUILD_TYPE=Debug
|
||||
shift
|
||||
goto :parse_args
|
||||
)
|
||||
if /i "%~1"=="clean" (
|
||||
set CLEAN_BUILD=1
|
||||
shift
|
||||
goto :parse_args
|
||||
)
|
||||
|
||||
:: Unknown argument fallback (the *)
|
||||
echo Unknown argument: %~1
|
||||
echo Usage: .\%~nx0 [Release^|Debug] [clean]
|
||||
exit /b 1
|
||||
|
||||
:main
|
||||
set BUILD_DIR=build\windows\%BUILD_TYPE%
|
||||
echo === Building filehasher (%BUILD_TYPE%) ===
|
||||
|
||||
:: Clean if requested
|
||||
if %CLEAN_BUILD%==1 (
|
||||
echo Cleaning...
|
||||
if exist "%BUILD_DIR%" rmdir /s /q "%BUILD_DIR%" 2>nul
|
||||
)
|
||||
|
||||
:: Create build dir
|
||||
if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%"
|
||||
pushd "%BUILD_DIR%"
|
||||
|
||||
:: Find compiler in preferred order
|
||||
set CC=
|
||||
where clang-cl >nul 2>&1
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
echo Compiler: clang-cl ^(preferred^)
|
||||
set "CC=-DCMAKE_C_COMPILER=clang-cl"
|
||||
goto :find_generator
|
||||
)
|
||||
|
||||
where gcc >nul 2>&1
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
echo Compiler: gcc ^(fallback^)
|
||||
set "CC=-DCMAKE_C_COMPILER=gcc"
|
||||
goto :find_generator
|
||||
)
|
||||
|
||||
where clang >nul 2>&1
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
echo Compiler: clang ^(last resort^)
|
||||
set "CC=-DCMAKE_C_COMPILER=clang"
|
||||
goto :find_generator
|
||||
)
|
||||
|
||||
echo ERROR: No suitable compiler found! (clang-cl, gcc, or clang required)
|
||||
popd
|
||||
exit /b 1
|
||||
|
||||
:find_generator
|
||||
:: Find Ninja for build system
|
||||
set GEN=
|
||||
where ninja >nul 2>&1
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
echo Generator: Ninja
|
||||
set "GEN=-G Ninja"
|
||||
) else (
|
||||
echo Generator: Default
|
||||
)
|
||||
|
||||
:: Configure
|
||||
echo.
|
||||
echo Configuring CMake...
|
||||
set CMD=cmake ../../.. %GEN% %CC% -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
|
||||
echo !CMD!
|
||||
!CMD!
|
||||
if !ERRORLEVEL! neq 0 (echo ERROR: Configuration failed & popd & exit /b 1)
|
||||
|
||||
:: Build
|
||||
echo.
|
||||
echo Building...
|
||||
cmake --build . --config %BUILD_TYPE%
|
||||
if !ERRORLEVEL! neq 0 (echo ERROR: Build failed & popd & exit /b 1)
|
||||
|
||||
:: Check if compile_commands.json exists in the current build directory
|
||||
if exist "compile_commands.json" (
|
||||
echo.
|
||||
echo clangd: compile_commands.json generated
|
||||
|
||||
:: Copy from current build dir up two levels to the project root
|
||||
copy /Y "compile_commands.json" "..\..\..\compile_commands.json" >nul 2>&1
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
echo clangd: Copied to project root
|
||||
) else (
|
||||
echo clangd: Could not copy to project root
|
||||
)
|
||||
)
|
||||
|
||||
popd
|
||||
echo.
|
||||
echo === Build Complete ===
|
||||
echo Executable: %BUILD_DIR%\filehasher.exe
|
||||
Reference in New Issue
Block a user