Files
krylov/CMakeLists.txt

79 lines
2.3 KiB
CMake
Raw Normal View History

2026-04-09 19:38:56 +08:00
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)
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()