CMake 最低版本号

cmake_minimum_required(VERSION 2.8)

项目信息

project(main)

添加版本号

set (main_VERSION_MAJOR 1)
set (main_VERSION_MINOR 0)

set (CMAKE_INCLUDE_CURRENT_DIR ON)

是否使用自己的库

option(USE_MYMATH

"USE provided math implementation" ON)

检查系统环境 必须放在configure_file命令前

include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)

加入一个配置头文件,用于处理CMake对源码的设置

$前面加"可以使用目录名中间有空格

configure_file(

"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"        

)

是否加入MathFunctions库

if(USE_MYMATH)

# 设置头文件
include_directories("${PROJECT_SOURCE_DIR}/math")
# 添加子目录目录
add_subdirectory(math)
# 设置库名
set (EXTAR_LIB ${EXTAR_LIB} MathFunctions)

endif(USE_MYMATH)

查找当前目录下的所有源文件

将名称保存到DIR_SRCS变量

aux_source_directory(. DIR_SRCS)

指定生成目标

add_executable(main_cmake ${DIR_SRCS})

添加链接库

target_link_libraries(main_cmake ${EXTAR_LIB})

指定安装路径

install (TARGETS main_cmake DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION include)

启用测试

enable_testing()

测试程序是否成功运行

add_test (test_run main_cmake 5 2)

测试帮助信息是否可以正常提示

add_test (test_usage main_cmake)
set_tests_properties (test_usage PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

测试 5 的平方

add_test (test_5_2 main_cmake 5 2)
set_tests_properties (test_5_2 PROPERTIES PASS_REGULAR_EXPRESSION "is 25")

测试 10 的 5 次方

add_test (test_10_5 main_cmake 10 5)
set_tests_properties (test_10_5 PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")

# 测试 2 的 10 次方
add_test (test_2_10 main_cmake 2 10)
set_tests_properties (test_2_10 PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

# 定义一个宏,用来简化测试工作
macro (do_test arg1 arg2 result)

 add_test (test_${arg1}_${arg2} main_cmake ${arg1} ${arg2})
 set_tests_properties (test_${arg1}_${arg2} PROPERTIES PASS_REGULAR_EXPRESSION ${result})

endmacro (do_test)

使用该宏进行一系列的数据测试

do_test (5 2 "is 25")
do_test (2 10 "is 1024")
do_test (10 5 "is 100000")

支持gdb 让CMake 支持gdb的设置也很容易,只需要指定Debug模式下开启-g选项

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS "-Wall -Wextra -pthread")

生成安装包

构建一个 CPack 包

include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${main_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${main_VERSION_MINOR}")
include (CPack)

总结

建议1

项目中每个模块各自写一个CMakeLists.txt,在项目根目录写一个CMakeLists.txt,用来统一调用各个模块的CMakeLists.txt进行生成。

建议2

在根目录新建一个build 进行cmake .. 这样生成出来的一些杂项不会到处都有