CMake | 使用宏重用代码

目录

一、CMake相关命令

1.macro

2.与宏参数相关的字符串

(1)${ARGC}

(2)${ARGV}

(3)${ARGN}

3.math

4.add_test

5.set_tests_properties

二、主要实现

1.顶层CMakeLists.txt

2.tests/CMakeLists.txt 

3.tests/test.cpp

4.其他文件

5.配置及编译

        在测试时,通过宏可以方便地定义测试和设置测试的顺序。比如我们测试代码时需要多次调用调用 add_test 和 set_tests_properties来设置每个测试的预期开销,而我们通过定义一个宏(或一个函数)能够一次性处理这两个函数的调用。

一、CMake相关命令

1.macro

macro(<name> [<arg1> ...])
  <commands>
endmacro()

        定义一个名为<name>的宏,该宏接受名为<arg1>的参数。在调用宏之前,不会执行macro()到endmacro()之间列出的命令。

2.与宏参数相关的字符串

(1)${ARGC}

        保存给定宏的所有参数数量。

(2)${ARGV}

        保存给定宏的所有参数列表。

(3)${ARGN}

        保存超过最后一个预期参数的参数列表,即额外参数列表。

        宏命令与function()命令非常相似。尽管如此,还是有一些重要的区别:

  • 在函数中,ARGN,ARGC,ARGV和ARGV0,ARGV1...是通常意义上的真变量。
  • 在宏上,它们不是变量它们是字符串替换,就像C预处理器对宏所做的那样。

        所以,无法使用以下命令:

if(ARGV1)

        而我们应该这样使用:

if(${ARGV1})

3.math

math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])

        计算一个数学表达式。计算数学表达式<expression>,并将<variable>设置为结果值。表达式的结果必须可以表示为64位有符号整数。

  1. 数学表达式必须以字符串形式给出(即用双引号括起来)。
  2. 结果根据选项OUTPUT_FORMAT格式化,其中<format>是以下选项之一:
  • HEXADECIMAL:C代码中的十六进制表示法,即以“0x”开头。
  • DECIMAL:十进制记数法。如果未指定“输出格式”选项,也会使用该选项。
  math(EXPR num_macro_calls "${num_macro_calls} + 1")

4.add_test

        CMake I 创建一个简单的单元测试_该用户还没想到好的昵称的博客-CSDN博客

5.set_tests_properties

set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2)

        设置测试的属性。如果未找到测试,CMake将报告错误。

        COST属性:描述测试的成本。当启用并行测试时,测试集中的测试将按成本降序运行。项目可以通过将此属性设置为浮点值来明确定义测试的成本。

二、主要实现

1.顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(recipe-01 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#根据GNU标准定义 binary 和 library 路径
include(GNUInstallDirs)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

#使用 add_subdirectory 调用 src/CMakeLists.txt 和 tests/CMakeLists.txt 
add_subdirectory(src)

enable_testing()
add_subdirectory(tests)

2.tests/CMakeLists.txt 

#构建并链接 cpp_test 可执行文件
add_executable(cpp_test test.cpp)
target_link_libraries(cpp_test sum_integers)

#定义一个新宏 add_catch_test,两个参数_name _cost
macro(add_catch_test _name _cost)

  #将 num_macro_calls 加1
  math(EXPR num_macro_calls "${num_macro_calls} + 1")
  
  message(STATUS "add_catch_test called with ${ARGC} arguments: ${ARGV}")

  #引入一个新变量,但不能直接查询ARGN,因为它不是通常意义上的CMake变量
  set(_argn "${ARGN}")

  if(_argn)
    message(STATUS "oops - macro received argument(s) we did not expect: ${ARGN}")
  endif()

  add_test(
    NAME
      ${_name}
    COMMAND
      $<TARGET_FILE:cpp_test>
      [${_name}] --success --out
      ${PROJECT_BINARY_DIR}/tests/${_name}.log --durations yes
    WORKING_DIRECTORY
      ${CMAKE_CURRENT_BINARY_DIR}
    )

  set_tests_properties(
    ${_name}
    PROPERTIES
      COST ${_cost}
    )
endmacro()

set(num_macro_calls 0)
#使用 add_catch_test 定义了两个测试
add_catch_test(short 1.5)
add_catch_test(long 2.5 extra_argument)

message(STATUS "in total there were ${num_macro_calls} calls to add_catch_test")

        add_test中的命令可以参考:CMake I 使用Catch2库进行单元测试_该用户还没想到好的昵称的博客-CSDN博客 

3.tests/test.cpp

#include "sum_integers.hpp"

// this tells catch to provide a main()
// only do this in one cpp file
#define CATCH_CONFIG_MAIN
#include "catch.hpp"

#include <vector>

TEST_CASE("Sum of integers for a short vector", "[short]") {
  auto integers = {1, 2, 3, 4, 5};
  REQUIRE(sum_integers(integers) == 15);
}

TEST_CASE("Sum of integers for a longer vector", "[long]") {
  std::vector<int> integers;
  for (int i = 1; i < 1001; ++i) {
    integers.push_back(i);
  }
  REQUIRE(sum_integers(integers) == 500500);
}

4.其他文件

        src/sum_integers.h文件和 src/sum_integers.cpp文件见博客

        tests/catch.hpp文件见博客

5.配置及编译

         进行测试时,时间长的会先开始。ctest命令见博客

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值