@echo off chcp 65001 >nul setlocal enabledelayedexpansion set "ROOT=%~dp0" if "%ROOT:~-1%"=="\" set "ROOT=%ROOT:~0,-1%" set "TOOLS=%ROOT%\tools\" set "CMAKE_EXE=%TOOLS%cmake\bin\cmake.exe" set "NINJA_EXE=%TOOLS%ninja\ninja.exe" set "CLANG_EXE=%TOOLS%llvm\bin\clang-cl.exe" set "CLANGXX_EXE=%TOOLS%llvm\bin\clang-cl.exe" set "CONAN_EXE=%TOOLS%.venv\Scripts\conan.exe" :: ============================================================ :: 1. 检查工具链,优先使用 tools\,缺失时回退到 PATH :: ============================================================ echo [dstalk] 检查工具链... if not exist "%CMAKE_EXE%" set "CMAKE_EXE=cmake" if not exist "%NINJA_EXE%" set "NINJA_EXE=ninja" if not exist "%CLANG_EXE%" ( set "CLANG_EXE=clang-cl.exe" set "CLANGXX_EXE=clang-cl.exe" ) if not exist "%CONAN_EXE%" set "CONAN_EXE=conan" "%CMAKE_EXE%" --version >nul 2>&1 || ( echo [ERROR] CMake 未找到,请先运行 tools\setup.bat 或加入 PATH pause & exit /b 1 ) "%NINJA_EXE%" --version >nul 2>&1 || ( echo [ERROR] Ninja 未找到,请先运行 tools\setup.bat 或加入 PATH pause & exit /b 1 ) "%CLANG_EXE%" --version >nul 2>&1 || ( echo [ERROR] LLVM/Clang 未找到,请先运行 tools\setup.bat 或加入 PATH pause & exit /b 1 ) for /f "tokens=1,2,3" %%a in ('"%CLANG_EXE%" --version 2^>nul') do ( if "%%a %%b"=="clang version" set "CLANG_VERSION=%%c" ) for /f "tokens=1 delims=." %%v in ("!CLANG_VERSION!") do set "CLANG_MAJOR=%%v" if "!CLANG_MAJOR!"=="" ( echo [ERROR] 无法检测 Clang 版本 pause & exit /b 1 ) "%CONAN_EXE%" --version >nul 2>&1 || ( echo [ERROR] Conan2 未找到,请先运行 tools\setup.bat 或加入 PATH echo 需要已安装 Python 3.10+ pause & exit /b 1 ) if exist "%TOOLS%env.bat" call "%TOOLS%env.bat" :: ============================================================ :: 2. 检测并加载 MSVC 环境 :: ============================================================ set "VCVARS=" set "VS_YEAR=" for %%v in (2022 2019 2017) do ( if not defined VCVARS ( for %%e in (Professional Community Enterprise BuildTools) do ( if not defined VCVARS if exist "C:\Program Files (x86)\Microsoft Visual Studio\%%v\%%e\VC\Auxiliary\Build\vcvarsall.bat" ( set "VCVARS=C:\Program Files (x86)\Microsoft Visual Studio\%%v\%%e\VC\Auxiliary\Build\vcvarsall.bat" set "VS_YEAR=%%v" ) if not defined VCVARS if exist "C:\Program Files\Microsoft Visual Studio\%%v\%%e\VC\Auxiliary\Build\vcvarsall.bat" ( set "VCVARS=C:\Program Files\Microsoft Visual Studio\%%v\%%e\VC\Auxiliary\Build\vcvarsall.bat" set "VS_YEAR=%%v" ) ) ) ) if "%VCVARS%"=="" ( echo [ERROR] 未找到 Visual Studio Build Tools echo 请安装: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022 pause & exit /b 1 ) echo [dstalk] 加载 MSVC 环境... call "%VCVARS%" x64 >nul 2>&1 set "MSVC_RUNTIME_VERSION=v143" set "MSVC_CONAN_VERSION=193" set "CONAN_CPPSTD=20" if "!VS_YEAR!"=="2019" ( set "MSVC_RUNTIME_VERSION=v142" set "MSVC_CONAN_VERSION=192" ) if "!VS_YEAR!"=="2017" ( set "MSVC_RUNTIME_VERSION=v141" set "MSVC_CONAN_VERSION=191" set "CONAN_CPPSTD=17" ) echo [dstalk] MSVC runtime: !MSVC_RUNTIME_VERSION! :: ============================================================ :: 3. 使用 Clang 编译器 :: ============================================================ set "CC=%CLANG_EXE%" set "CXX=%CLANGXX_EXE%" cd /d "%ROOT%" :: ============================================================ :: 4. Conan 安装依赖 :: ============================================================ echo [dstalk] Conan 安装/刷新依赖... call "%CONAN_EXE%" install deps/ -of build --build=missing -s compiler=msvc -s compiler.version=!MSVC_CONAN_VERSION! -s compiler.cppstd=!CONAN_CPPSTD! -s compiler.runtime=dynamic -s compiler.runtime_type=Release -c tools.cmake.cmaketoolchain:generator=Ninja if !errorlevel! neq 0 ( echo [ERROR] Conan 安装失败 pause & exit /b 1 ) set "CONAN_GENERATORS=%ROOT%\build\build\Release\generators" :: ============================================================ :: 5. CMake 配置 + Ninja 编译 :: ============================================================ echo [dstalk] CMake 配置 + 编译... "%CMAKE_EXE%" -S "%ROOT%" -B "%ROOT%\build" -G Ninja ^ -DCMAKE_MAKE_PROGRAM="%NINJA_EXE%" ^ -DCMAKE_C_COMPILER="%CLANG_EXE%" ^ -DCMAKE_CXX_COMPILER="%CLANGXX_EXE%" ^ -DCMAKE_TOOLCHAIN_FILE="%CONAN_GENERATORS%\conan_toolchain.cmake" ^ -DCMAKE_PREFIX_PATH="%CONAN_GENERATORS%" ^ -DCMAKE_BUILD_TYPE=Release ^ -DDSTALK_BUILD_GUI=OFF if !errorlevel! neq 0 ( echo [ERROR] CMake 配置失败 pause & exit /b 1 ) "%CMAKE_EXE%" --build "%ROOT%\build" if !errorlevel! neq 0 ( echo [ERROR] 编译失败 pause & exit /b 1 ) echo. echo ============================================ echo 编译成功! echo build\dstalk-core\dstalk.dll echo build\dstalk-cli\dstalk-cli.exe echo ============================================ pause