# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable (demo${DIR_SRCS})
target_link_libraries (demo ${EXTRA_LIBS})
configure_file命令用于加入一个配置头文件config.h,config.h文件由CMake从config.h.in生成,通过预定义一些参数和变量来控制代码的生成。
option命令添加了一个USE_MYMATH选项,并且默认值为ON。
根据USE_MYMATH变量的值来决定是否使用自己编写的MathFunctions库。
修改main.cpp文件,让其根据USE_MYMATH的预定义值来决定是否调用标准库还是MathFunctions库。
#include <cstdio>
#include <cstdlib>
#include <config.h>
#ifdef USE_MYMATH
#include <MathFunctions.h>
#else
#include <cmath>
#endif
int main(int argc, char *argv[])
{
if (argc < 3)
{
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
#ifdef USE_MYMATH
printf("Now we use our own Math library. \n");
double result = power(base, exponent);
#else
printf("Now we use the standard library. \n");
double result = pow(base, exponent);
#endif
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}
main.cpp文件包含了一个config.h文件,config.h文件预定义了USE_MYMATH 的值。但不会直接编写config.h文件,为了方便从CMakeLists.txt中导入配置,通常编写一个config.h.in文件,内容如下:
#cmakedefine USE_MYMATH
CMake会自动根据CMakeLists.txt配置文件中的设置自动生成config.h文件。
修改CMakeLists.txt文件,USE_MYMATH为OFF,使用标准库。
# 是否使用自己的MathFunctions库
option (USE_MYMATH
"Use provided math implementation" OFF)
在build目录下cmake ..,make,执行程序:
在math/CMakeLists.txt文件指定MathFunctions库的安装规则:
#指定MathFunctions库的安装路径
install(TARGETS MathFunctions DESTINATION bin)
install(FILES MathFunctions.h DESTINATION include)
修改根目录的CMakeLists.txt文件指定目标文件的安装规则:
#指定安装路径
install(TARGETS test DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/config.h"
DESTINATION include)
通过对安装规则的定制,生成的目标文件和MathFunctions函数库 libMathFunctions.o文件将会被拷贝到/usr/local/bin中,而MathFunctions.h和生成的config.h文件则会被复制到/usr/local/include中。
/usr/local是默认安装到的根目录,可以通过修改 CMAKE_INSTALL_PREFIX 变量的值来指定文件应该拷贝到哪个根目录。
CMake提供了一个CTest测试工具。在项目根目录的CMakeLists.txt文件中调用一系列的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")
第一个测试test_run用来测试程序是否成功运行并返回0值。剩下的三个测试分别用来测试 5 的 平方、10 的 5 次方、2 的 10 次方是否都能得到正确的结果。其中PASS_REGULAR_EXPRESSION用来测试输出是否包含后面跟着的字符串。
如果要测试更多的输入数据,可以通过编写宏来实现:
# 启用测试
enable_testing()
# 测试程序是否成功运行
add_test (test_run demo 5 2)