转载出处链接:http://www.hahack.com/codes/cmake/
https://blog.csdn.net/u010122972/article/details/78216013
一、CMake的历史
由于各种make工具遵循不同的规范和标准,所执行的Makefile格式也不同,但如果想让软件跨平台,必须要保证能够在不同平台编译,但使用这些make工具就得为每一种标准写一次Makefile,因此CMake应运而生。
CMake首先允许开发者编写一种与平台无关的CMakeList.txt来定制整个编译流程,
然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如Unix的Makefile或Windows的Visual Studio
二、CMake的编写(CMakeLists.txt并不是顺序执行的,相当于一系列的声明)
CMakeList.txt 的语法比较简单,由命令、注释和空格组成:
#后面内容为注释;
命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔,其中命令是不区分大小写的。
- 在linux平台下使用CMake生成Makefile并编译的流程如下:
- 编写CMake配置文件CMakeList.txt
- 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile。其中,PATH 是CMakeList.txt所在的目录
- 使用 make 命令进行编译
举例:
- 单个源文件编写CMakeLists.txt (三行) 其中project(项目名)会引入两个变量XXX_BINARY_DIR(二进制文件保存路径)XXX_SOURCE_DIR(源代码保存路径)
- 同一目录下多个源文件编写CMakeLists.txt(四行,多一行是查找当前目录下所有源文件)
- 多个目录,多个源文件(每个目录下一个CMakeLists,主目录中还需要添加子目录,添加链接库;子目录两行:查找源文件,生成链接库)
- 自定义编译选项
三、CMake的安装与测试
CMake也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生Makefile后使用
sudo make install 和 make test 来执行。
- 制定安装规则: 将库、生成的可执行文件等放在指定的安装路径下。下例将其放在/usr/local/bin和/usr/local/include下。
# 指定 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)
- 为工程添加测试:CMake提供了CTest测试工具,只需在项目根目录的CMakeLists文件中使用一系列add_test命令。
# 启用测试
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")
# 测试 10 的 5 次方
add_test (test_10_5 Demo 10 5)
set_tests_properties (test_10_5
PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")
# 测试 2 的 10 次方
add_test (test_2_10 Demo 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} Demo ${arg1} ${arg2})
set_tests_properties (test_${arg1}_${arg2}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
# 使用该宏进行一系列的数据测试
do_test (5 2 "is 25")
do_test (10 5 "is 100000")
do_test (2 10 "is 1024")