丁致宇第二周学习报告 深入中大型项目的Cmakelists
作者:丁致宇,时间:2024.1.28 ]
正文
中大型项目常用cmake语法(查找表)
项目基本设置
-
指定CMake最低版本要求:
cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR) -
项目声明:
project(roms VERSION 3.9 LANGUAGES Fortran) -
设置变量和CMake模块路径:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -
设置构建类型:
set(CMAKE_BUILD_TYPE Release)
编译器和链接器配置
-
添加编译器选项:
add_compile_options(-Wall -Wextra) -
设置目标特定的编译定义:
target_compile_definitions(roms_executable PRIVATE -DUSE_NETCDF4) -
设置目标特定的编译选项:
target_compile_options(roms_executable PRIVATE -O2) -
设置目标特定的链接选项:
target_link_options(roms_executable PRIVATE -L/path/to/lib)
环境检测与条件分支
- 检查环境变量:
if(DEFINED ENV{ECBUILD_MODULE_PATH})
# 做一些特定于ecbuild的配置
endif()
包含其他脚本和模块
-
包含自定义CMake脚本:
include(roms_functions) -
查找并链接依赖库:
find_package(NetCDF REQUIRED COMPONENTS Fortran)
源代码和资源管理
-
添加子目录:
add_subdirectory(src) -
指定头文件和库目录:
include_directories(${NetCDF_INCLUDE_DIRS})
link_directories(${NetCDF_LIBRARY_DIRS}) -
设置源文件属性:
set_property(SOURCE file.F90 PROPERTY COMPILE_FLAGS "-special-flag") -
自动生成源码:
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated_source.f90
COMMAND generate_source_script
DEPENDS script_input.dat
) -
处理文件和目录:
file(GLOB MY_SOURCES "src/*.cpp")
file(COPY ${CMAKE_SOURCE_DIR}/data/ DESTINATION ${CMAKE_BINARY_DIR}/data)
目标定义和链接
-
创建对象库:
add_library(Objects OBJECT ${All_f90s}) -
创建静态库和共享库:
add_library(ROMS_static STATIC $<TARGET_OBJECTS:Objects>)
add_library(ROMS_shared SHARED $<TARGET_OBJECTS:Objects>) -
构建可执行文件:
add_executable(roms_executable ${master_f90})
target_link_libraries(roms_executable ${NetCDF_LIBRARIES})
安装和测试
-
安装目标和文件:
install(TARGETS roms_executable DESTINATION bin)
install(FILES readme.txt DESTINATION share/doc)
install(DIRECTORY docs/ DESTINATION share/doc) -
启用和添加测试:
enable_testing()
add_test(NAME MyTest COMMAND TestExecutable)
打包和项目导出
-
设置CPack打包:
set(CPACK_PACKAGE_NAME "MyApp")
include(CPack) -
导出和安装目标:
export(TARGETS roms_executable FILE ROMSExecutableTargets.cmake)
install(EXPORT ROMSExecutableTargets FILE ROMSExecutableTargets.cmake DESTINATION lib/cmake/ROMS)
自定义构建步骤和清理
-
添加自定义构建命令和目标:
add_custom_target(clean-all COMMAND ${CMAKE_MAKE_PROGRAM} clean)
add_custom_command(TARGET roms_executable POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Build complete!") -
提供开关选项:
option(USE_MY_LIB "Use the provided library" ON) -
设置CMake策略:
cmake_policy(SET CMP0074 NEW)
Cmakelists解读实践
示例项目见文件夹内的 示例项目cmakelists+详细注释.txt文件