常用语句
*************************************************************************************************
#基本命令
#设置最低cmake版本
cmake_minimum_required (VERSION 2.8)
#设置项目信息
project (Demo1)
# 添加子目录
add_subdirectory(path)
#搜索目录下的文件,创建一个集合
aux_source_directory(<dir> <variable>)
#手动添加文件集合
set( SRC_LIST ./main.c ./testFunc1.c ./testFunc.c)
#建立可执行文件
add_executable(hello-world#可执行文件 hello-world.cpp#包含的源码)
add_executable(Demo ${DIR_SRCS})
*************************************************************************************************
#链接库
#添加头文件搜索路径
include_directories (test_func#路径1 test_func1#路径2)
#添加非标准的共享库搜索路径
link_directories
#生成新的库
add_library(message#库的名字
STATIC#动态还是静态
Message.hpp Message.cpp#生成库的源文件)
#将目标库连接到可执行文件目标
target_link_libraries(helo-world#可执行文件 message#要添加的库)
#设置可执行文件存放路径
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设置库存放路径
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#设置输出的名称,还有其它功能,如设置库的版本号等等
set_target_properties
*************************************************************************************************
#编译选项
#加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
#添加控制选项
option(MYDEBUG#option名称
"enable debug compilation"#字符串,编译时提示option功能
OFF)
#if语句
if (MYDEBUG)
add_executable(main2 main2.c)
else()
message(STATUS "Currently is not in debug mode")
endif()
//cpp文件中的选项
#ifdef USE_MYMATH
#include "math/MathFunctions.h"
#else
#include <math.h>
#endif
//config.h.in
//CMake 会自动根据 CMakeLists 配置文件中的设置
//自动生成 config.h 文件
#cmakedefine USE_MYMATH
*************************************************************************************************
#安装和测试
# 指定 MathFunctions 库的安装路径
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)
# 指定安装路径
install (TARGETS Demo DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION include)
#生成的 Demo 文件和 MathFunctions 函数库 libMathFunctions.o 文件
#将会被复制到 /usr/local/bin 中
#而 MathFunctions.h 和生成的 config.h 文件则会被复制到 /usr/local/include 中。
*************************************************************************************************
#为工程添加测试
# 启用测试
enable_testing()
# 测试程序是否成功运行
add_test (test_run Demo 5 2)
# 测试帮助信息是否可以正常提示
add_test (test_usage Demo)
set_tests_properties (test_usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")
# 测试 5 的平方
add_test (test_5_2 Demo 5 2)
set_tests_properties (test_5_2
PROPERTIES PASS_REGULAR_EXPRESSION "is 25")
#命令行中测试功能的用法
[ehome@xman Demo5]$ make test
#宏定义
macro (do_test arg1 arg2 result)
add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})
set_tests_properties (test_${arg1}_${arg2}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
*************************************************************************************************
#版本号
#添加版本号
set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)
#为了在代码中获取版本信息,我们可以修改 config.h.in 文件,添加两个预定义变量
#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@
*************************************************************************************************
#添加环境检查
#顶层cmake
# 检查系统是否支持 pow 函数
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)
//config.h.in
//does the platform provide pow function?
#cmakedefine HAVE_POW
//main.cpp
#ifdef HAVE_POW
printf("Now we use the standard library. \n");
double result = pow(base, exponent);
#else
printf("Now we use our own Math library. \n");
double result = power(base, exponent);
#endif
*************************************************************************************************
#生成安装包
# 构建一个 CPack 安装包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)
#导入 InstallRequiredSystemLibraries 模块,以便之后导入 CPack 模块;
#设置一些 CPack 相关变量,包括版权信息和版本信息,其中版本信息用了上一节定义的版本号;
#导入 CPack 模块。
#命令行中生成安装包
#生成二进制安装包
cpack -C CPackConfig.cmake
#生成源码安装包
cpack -C CPackSourceConfig.cmake
*************************************************************************************************
#定义
#目标二进制可执行文件的存放位置
EXECUTABLE_OUTPUT_PATH
#工程的根目录
PROJECT_SOURCE_DIR
#库文件的默认输出路径,这里设置为工程目录下的lib目录
LIBRARY_OUTPUT_PATH
#用来测试输出是否包含后面跟着的字符串
PASS_REGULAR_EXPRESSION
*************************************************************************************************
Reference
Major
Details
link_directories, LINK_LIBRARIES, target_link_libraries使用总结
关于-fPIC, -fpic, -fpie, -fPIE的一点理解
CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR之间的区别
cmake:设置编译选项的讲究(add_compile_options和CMAKE_CXX_FLAGS的区别)