GNU开发工具:CMake快速入门教程(4)

# 测试帮助信息是否可以正常提示
    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 宏,测试一系列数据
    do_test (5 2 "is 25")
    do_test (10 5 "is 100000")
    do_test (2 10 "is 1024")

GNU开发工具:CMake快速入门教程

八、GDB支持

让CMake支持gdb的设置只需要指定Debug模式下开启-g选项:

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

生成的程序可以直接使用gdb来调试。

九、添加环境检查

使用平台相关的特性时,需要对系统环境做检查。检查系统是否自带pow函数,如果有pow函数,就使用;否则使用自定义的power函数。

1、添加 CheckFunctionExists 宏

首先在顶层CMakeLists.txt文件中添加CheckFunctionExists.cmake 宏,并调用check_function_exists命令测试链接器是否能够在链接阶段找到 pow函数。

#检查系统是否支持 pow 函数
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)
check_function_exists需要放在configure_file命令前。

2、预定义相关宏变量

修改 config.h.in 文件,预定义相关的宏变量。

// does the platform provide pow function?
#cmakedefine HAVE_POW

3、在代码中使用宏和函数

修改 main.cpp文件 ,在代码中使用宏和函数。

#include <stdio.h>
#include <stdlib.h>
#include <config.h>

#ifdef HAVE_POW
#include <math.h>
#else
#include <MathFunctions.h>
#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 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

printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

十、添加版本号

修改顶层CMakeLists.txt文件,在project命令后分别指定当前的项目的主版本号和副版本号。

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (demo)

set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

#检查系统是否支持 pow 函数
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 (NOT HAVE_POW)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (NOT HAVE_POW)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable (demo ${DIR_SRCS})
target_link_libraries (demo  ${EXTRA_LIBS})

#指定安装路径
install(TARGETS demo DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/config.h"
        DESTINATION include)

# 启用测试
    enable_testing()

# 测试程序是否成功运行
    add_test (test_run demo 5 2)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12514.html