Files
dynamics/CMakeLists.txt
T
2026-05-17 08:47:25 +08:00

114 lines
4.6 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================================
# Dynamics — 多语言引擎 CMake 构建系统
# ============================================================================
# 用法:
# cmake -B build # 配置(使用默认编译器)
# cmake --build build # 编译
# cmake --build build --target dynamics_c # 只编译 C 引擎
#
# 交叉编译:
# cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-linux.cmake
# cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw.cmake
# cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-macos.cmake
# ============================================================================
cmake_minimum_required(VERSION 3.15)
project(DynamicsEngines
VERSION 1.0.0
DESCRIPTION "Multi-language molecular dynamics simulation engines"
LANGUAGES C CXX Fortran
)
# ── 全局编译选项 ──────────────────────────────
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 优化等级(可被 -DCMAKE_BUILD_TYPE=Debug 覆盖)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# 统一编译选项
set(COMMON_C_FLAGS -O3 -Wall -Wextra)
set(COMMON_CXX_FLAGS -O3 -Wall -Wextra)
# ── 统一输出目录:所有引擎可执行文件输出到 engines/<name>/build/ ────
# 这样 Python 的 run_engine() 可以在固定路径找到它们
function(add_engine_target name lang src)
if(lang STREQUAL "C")
add_executable(${name} ${src})
target_compile_options(${name} PRIVATE ${COMMON_C_FLAGS})
target_link_libraries(${name} PRIVATE m)
elseif(lang STREQUAL "CXX")
add_executable(${name} ${src})
target_compile_options(${name} PRIVATE ${COMMON_CXX_FLAGS})
elseif(lang STREQUAL "Fortran")
enable_language(Fortran OPTIONAL)
if(NOT CMAKE_Fortran_COMPILER)
message(STATUS "Fortran compiler not found — skipping ${name}")
return()
endif()
add_executable(${name} ${src})
endif()
# 输出到 engines/<name>/build/Python 调度器期望的位置)
set_target_properties(${name} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/engines/${name}/build"
)
# macOS 上禁止生成 .app 包(命令行工具不需要)
set_target_properties(${name} PROPERTIES
MACOSX_BUNDLE FALSE
)
endfunction()
# ============================================================================
# 引擎目标定义
# ============================================================================
# ── C 引擎 ────────────────────────────────────
add_engine_target(dynamics_c C "engines/c/main.c")
# ── C++ 引擎 ──────────────────────────────────
add_engine_target(dynamics_cpp CXX "engines/cpp/main.cpp")
# ── Fortran 引擎 ──────────────────────────────
add_engine_target(dynamics_f90 Fortran "engines/fortran/main.f90")
# ============================================================================
# 自定义目标
# ============================================================================
# 编译所有引擎
add_custom_target(all-engines
DEPENDS dynamics_c dynamics_cpp dynamics_f90
)
# 显示引擎信息
add_custom_target(info
COMMAND ${CMAKE_COMMAND} -E echo "=== Dynamics Engines ==="
COMMAND ${CMAKE_COMMAND} -E echo "C engine: dynamics_c"
COMMAND ${CMAKE_COMMAND} -E echo "C++ engine: dynamics_cpp"
COMMAND ${CMAKE_COMMAND} -E echo "Fortran engine: dynamics_f90"
COMMAND ${CMAKE_COMMAND} -E echo ""
COMMAND ${CMAKE_COMMAND} -E echo "Build: cmake --build ."
COMMAND ${CMAKE_COMMAND} -E echo "Single: cmake --build . --target dynamics_c"
)
message(STATUS "DynamicsEngines ${PROJECT_VERSION}")
message(STATUS " Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS " C compiler: ${CMAKE_C_COMPILER}")
message(STATUS " C++ compiler: ${CMAKE_CXX_COMPILER}")
if(CMAKE_Fortran_COMPILER)
message(STATUS " Fortran compiler: ${CMAKE_Fortran_COMPILER}")
else()
message(STATUS " Fortran compiler: (not found, skipped)")
endif()
message(STATUS "")
message(STATUS " Targets:")
message(STATUS " cmake --build . --target dynamics_c")
message(STATUS " cmake --build . --target dynamics_cpp")
message(STATUS " cmake --build . --target dynamics_f90")
message(STATUS " cmake --build . --target all-engines")