diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bb1828..1c8ade7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,21 +6,22 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -# ── 选项 ────────────────────────────────────────── -option(BUILD_TESTS "Build unit tests" ON) -option(BUILD_EXAMPLES "Build examples" ON) +# ── 选项 ── +option(BUILD_TESTS "Build unit tests" ON) +option(BUILD_EXAMPLES "Build examples" ON) option(BUILD_BENCHMARKS "Build benchmarks" OFF) option(BUILD_SHARED_LIBS "Build shared library" OFF) option(ENABLE_SANITIZERS "Enable ASan/UBSan" OFF) option(ENABLE_LTO "Enable LTO" ON) +option(VDE_BUILD_PYTHON "Build Python bindings" OFF) -# ── 编译设置 ────────────────────────────────────── +# ── 编译选项接口(必须在 include(CompilerSettings) 之前创建)── +add_library(vde_compile_options INTERFACE) include(cmake/CompilerSettings.cmake) -# ── 依赖 ────────────────────────────────────────── +# ── 依赖 ── find_package(Eigen3 3.3 QUIET) if(NOT Eigen3_FOUND) - message(STATUS "Eigen3 not found — using FetchContent") include(FetchContent) FetchContent_Declare(Eigen3 URL https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz @@ -28,11 +29,10 @@ if(NOT Eigen3_FOUND) FetchContent_MakeAvailable(Eigen3) endif() -# ── 子目录 ──────────────────────────────────────── +# ── 子目录 ── add_subdirectory(src) - add_subdirectory(src) -# ── 测试 ────────────────────────────────────────── +# ── 测试 ── if(BUILD_TESTS) enable_testing() find_package(GTest QUIET) @@ -47,28 +47,17 @@ if(BUILD_TESTS) add_subdirectory(tests) endif() -# ── 示例 ────────────────────────────────────────── -# ── Python 绑定 ────────────────────────────────────option(VDE_BUILD_PYTHON "Build Python bindings (pybind11)" OFF)if(VDE_BUILD_PYTHON) add_subdirectory(python)endif() +# ── 示例 ── if(BUILD_EXAMPLES) add_subdirectory(examples) endif() -# ── 性能测试 ────────────────────────────────────── +# ── 性能测试 ── if(BUILD_BENCHMARKS) - find_package(benchmark QUIET) - if(NOT benchmark_FOUND) - include(FetchContent) - FetchContent_Declare(googlebenchmark - URL https://github.com/google/benchmark/archive/refs/tags/v1.8.0.tar.gz - ) - set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(googlebenchmark) - endif() add_subdirectory(benchmarks) endif() -# ── 安装 ────────────────────────────────────────── -include(GNUInstallDirs) -install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -install(TARGETS vde EXPORT ViewDesignEngine-targets) -install(EXPORT ViewDesignEngine-targets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ViewDesignEngine) +# ── Python 绑定 ── +if(VDE_BUILD_PYTHON) + add_subdirectory(python) +endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e8381f5..a19836c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,4 @@ # ── 编译选项接口目标 ────────────────────────────── -add_library(vde_compile_options INTERFACE) -include(${CMAKE_SOURCE_DIR}/cmake/CompilerSettings.cmake) # ── foundation ───────────────────────────────────── add_library(vde_foundation STATIC diff --git a/tools/build.sh b/tools/build.sh new file mode 100755 index 0000000..5ed4f2c --- /dev/null +++ b/tools/build.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -euo pipefail + +BUILD_TYPE="${BUILD_TYPE:-Release}" +BUILD_DIR="${BUILD_DIR:-build}" +JOBS="${JOBS:-$(nproc)}" +ENABLE_TESTS="${ENABLE_TESTS:-ON}" +ENABLE_SANITIZERS="${ENABLE_SANITIZERS:-OFF}" + +echo "=== ViewDesignEngine Build ===" +echo " Build Type: $BUILD_TYPE" +echo " Build Dir: $BUILD_DIR" +echo " Jobs: $JOBS" +echo " Tests: $ENABLE_TESTS" +echo " Sanitizers: $ENABLE_SANITIZERS" +echo "" + +cmake -B "$BUILD_DIR" \ + -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ + -DBUILD_TESTS="$ENABLE_TESTS" \ + -DBUILD_EXAMPLES=ON \ + -DENABLE_SANITIZERS="$ENABLE_SANITIZERS" \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + +cmake --build "$BUILD_DIR" -j"$JOBS" + +echo "" +echo "=== Build Complete ===" +echo "Libraries: $BUILD_DIR/src/libvde*.a" +echo "Executables: $BUILD_DIR/tests/" +echo "Examples: $BUILD_DIR/examples/" diff --git a/tools/clean.sh b/tools/clean.sh new file mode 100755 index 0000000..c19995c --- /dev/null +++ b/tools/clean.sh @@ -0,0 +1,3 @@ +#!/bin/bash +rm -rf build build-release build-debug build-asan release +echo "Cleaned build artifacts." diff --git a/tools/format.sh b/tools/format.sh new file mode 100755 index 0000000..ad770c0 --- /dev/null +++ b/tools/format.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +echo "=== Clang Format ===" +find src include tests examples -name "*.cpp" -o -name "*.h" | while read f; do + clang-format -i "$f" 2>/dev/null && echo " formatted: $f" || true +done +echo "Done." diff --git a/tools/release.sh b/tools/release.sh new file mode 100755 index 0000000..921847d --- /dev/null +++ b/tools/release.sh @@ -0,0 +1,52 @@ +#!/bin/bash +set -euo pipefail + +VERSION="${1:-$(date +%Y%m%d)}" +RELEASE_NAME="ViewDesignEngine-${VERSION}" +BUILD_DIR="build-release" + +echo "=== ViewDesignEngine Release $VERSION ===" + +# Clean build +rm -rf "$BUILD_DIR" + +# Build release +BUILD_DIR="$BUILD_DIR" BUILD_TYPE=Release ENABLE_TESTS=ON bash tools/build.sh + +# Run tests +echo "" +echo "=== Running Tests ===" +BUILD_DIR="$BUILD_DIR" bash tools/run_tests.sh + +# Package +echo "" +echo "=== Packaging ===" +mkdir -p release +PACKAGE_DIR="release/$RELEASE_NAME" +rm -rf "$PACKAGE_DIR" +mkdir -p "$PACKAGE_DIR"/{lib,include,bin,docs} + +# Headers +cp -r include/vde "$PACKAGE_DIR/include/" + +# Libraries +find "$BUILD_DIR/src" -name "libvde*.a" -exec cp {} "$PACKAGE_DIR/lib/" \; + +# Examples +for exe in "$BUILD_DIR"/examples/*/*; do + if [ -x "$exe" ] && [ ! -d "$exe" ]; then + cp "$exe" "$PACKAGE_DIR/bin/" + fi +done + +# Docs +cp -r docs "$PACKAGE_DIR/" +cp README.md LICENSE CHANGELOG.md "$PACKAGE_DIR/" + +# Archive +cd release +tar -czf "${RELEASE_NAME}-linux-x64.tar.gz" "$RELEASE_NAME" +echo "" +echo "=== Release Package ===" +ls -lh "${RELEASE_NAME}-linux-x64.tar.gz" +echo " $PWD/${RELEASE_NAME}-linux-x64.tar.gz" diff --git a/tools/run_tests.sh b/tools/run_tests.sh new file mode 100755 index 0000000..adf00fb --- /dev/null +++ b/tools/run_tests.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -euo pipefail + +BUILD_DIR="${BUILD_DIR:-build}" + +if [ ! -d "$BUILD_DIR" ]; then + echo "Build directory not found. Run tools/build.sh first." + exit 1 +fi + +echo "=== ViewDesignEngine Tests ===" +cd "$BUILD_DIR" +ctest --output-on-failure -j"$(nproc)" "$@"