80 lines
2.4 KiB
CMake
80 lines
2.4 KiB
CMake
cmake_minimum_required(VERSION 3.18)
|
||
project(krylov_gmres VERSION 0.1.0 LANGUAGES CXX)
|
||
|
||
set(CMAKE_CXX_STANDARD 20)
|
||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||
|
||
option(KRYLOV_BUILD_TESTS "Build krylov unit tests" ON)
|
||
|
||
# 避免 Eigen / spdlog 把自己的测试注册进 CTest
|
||
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
||
set(EIGEN_BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
||
set(EIGEN_BUILD_DOC OFF CACHE BOOL "" FORCE)
|
||
|
||
# ---------------- 第三方依赖 ----------------
|
||
include(FetchContent)
|
||
|
||
FetchContent_Declare(
|
||
eigen
|
||
GIT_REPOSITORY https://aliyun.mayblog.top/devtools/eigen.git
|
||
GIT_TAG 3.4.0
|
||
)
|
||
|
||
FetchContent_Declare(
|
||
spdlog
|
||
GIT_REPOSITORY https://aliyun.mayblog.top/devtools/spdlog.git
|
||
GIT_TAG v1.11.0
|
||
)
|
||
|
||
# Eigen 是 header-only,避免 add_subdirectory 把其庞大测试集带进 CTest
|
||
FetchContent_GetProperties(eigen)
|
||
if(NOT eigen_POPULATED)
|
||
FetchContent_Populate(eigen)
|
||
endif()
|
||
add_library(Eigen3_Eigen INTERFACE)
|
||
target_include_directories(Eigen3_Eigen INTERFACE ${eigen_SOURCE_DIR})
|
||
add_library(Eigen3::Eigen ALIAS Eigen3_Eigen)
|
||
|
||
FetchContent_MakeAvailable(spdlog)
|
||
|
||
# ---------------- 通用 logger 库(与 krylov 解耦,可独立复用) ----------------
|
||
add_library(logger STATIC
|
||
src/logger/logger.cpp
|
||
)
|
||
target_include_directories(logger PUBLIC
|
||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||
)
|
||
target_link_libraries(logger PUBLIC spdlog::spdlog)
|
||
|
||
# ---------------- Krylov 核心库 ----------------
|
||
# 算法实现(arnoldi / gmres ...)集中到 krylov_core。
|
||
# 目前仅依赖 Eigen 与通用 logger。
|
||
add_library(krylov_core INTERFACE)
|
||
target_include_directories(krylov_core INTERFACE
|
||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||
)
|
||
target_link_libraries(krylov_core INTERFACE
|
||
Eigen3::Eigen
|
||
logger
|
||
)
|
||
add_library(krylov::core ALIAS krylov_core)
|
||
|
||
# ---------------- 可执行文件 ----------------
|
||
add_executable(krylov_solver src/main.cpp)
|
||
target_link_libraries(krylov_solver PRIVATE krylov::core)
|
||
|
||
# ---------------- 测试 ----------------
|
||
if(KRYLOV_BUILD_TESTS)
|
||
enable_testing()
|
||
|
||
add_executable(test_logger tests/test_logger.cpp)
|
||
target_link_libraries(test_logger PRIVATE krylov::core)
|
||
add_test(NAME test_logger COMMAND test_logger)
|
||
|
||
add_executable(test_eigen tests/test_eigen.cpp)
|
||
target_link_libraries(test_eigen PRIVATE krylov::core)
|
||
add_test(NAME test_eigen COMMAND test_eigen)
|
||
endif()
|