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位有符号整数。
- 数学表达式必须以字符串形式给出(即用双引号括起来)。
- 结果根据选项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 加1math(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 yesWORKING_DIRECTORY${CMAKE_CURRENT_BINARY_DIR})set_tests_properties(${_name}PROPERTIESCOST ${_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命令见博客。
CMake | 使用宏重用代码相关推荐
- CMake使用宏编译测试
首先代码中定义了使用宏的模块: 在任何位置都可以使用宏 #ifndef UNIT_TESTif(m_stop) {break;}std::cout << "thread is g ...
- ASP.NET重用代码技术 - 用户控件技术
作者: 苏红超 使用ASP.NET中的代码绑定技术来使得代码重用变得简单可行.我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一 ...
- ASP.NET重用代码技术 - 代码绑定技术
作者: 苏红超 导读 代码绑定是ASP.NET提供的一个重要的新技术.本文将会为您展示如何利用代码绑定技术来实现Web页面表示层和商业逻辑代码的分离,并建议您使用代码绑定技术实现代码的可重 ...
- Xcode可重用代码块code snippets
一. 关于code snippets 通过Xcode的重用代码块(code snippets)可快速输入预设好的常用代码模板,如通过键入 hystrong 系统会直接替代为 @property(non ...
- coverage 覆盖多个测试文件时_奇技淫巧[2]:cmake中添加lcov代码覆盖测试
奇技淫巧[2]:cmake中添加lcov代码覆盖测试 1 目的 为CMake工程的test添加lcov代码覆盖性测试 2 要点 添加lcov支持的方法应该有很多,比较方便的有: (1)利用脚本基于文件 ...
- 陈灯可重用代码段管理器(插件版最新版本:3.2;桌面版最新版本:2.3)
[软件简介] 陈灯代码段管理器为一款个人软件作品,其主要功能是对可重用代码段进行管理,包括对代码段的入库.代码段的搜索和代码段的共享等.软件包括插件版本和桌面版本两种版本,插件版本集成在Visual ...
- 让我们习惯在底层用C++宏生成代码
春天最难堪的是没有收成的垦植:人生最难堪的是失踪往决意信念的寂寞 我们知道操作C++泛型编程可以写出扩年夜性很是强的法式,操作C++的接***术也可以很等闲的扩年夜出已经存在的法式.只不外有一件工作它 ...
- Excel(VBA)自定义右键单击菜单以启动宏(示例代码)
主要介绍 Excel(VBA)自定义右键单击菜单以启动宏(示例代码)以及相关的经验技巧 THISWORKBOOK (paste into ThisWorkbook, macros that open ...
- 软件公司可重用代码库的建设 from sina bloger meng
这个想法由来已久,也是因为自己在现在效力的公司中能看到一些不良的现象,但自己却不是管理层,没有任何的执行力去改变它. 软件公司管理职位越往上,越不熟悉技术方面,加上此举和重构一样,很可能是吃力不讨好的 ...
最新文章
- OKR 落地需要相关工具的辅助吗?
- Automatic Judge 模拟
- boost::statechart模块实现无效结果复制测试
- 【终极方法】This method must return a result of type boolean
- python 调用bat失败_要想顺利通过Python面试,你最起码需要达到白银段位!
- Java封装图书信息类
- binlog关闭事务记录_【MySQL】binlog_format以及binlog事务记录分析
- Linux Intel网卡IGB驱动修改mac地址
- 电商项目面试题 及mysql面试题 太难没啥用
- 牛客 NC24858 [USACO 2009 Nov S]Job Hunt
- 最简单日柱推算法_日柱的简单计算方法
- Linux数据恢复的研究
- webug 4.0 第四关 POST注入
- 中国十大最具影响力***
- 2020计算机专业保研夏令营面经:南科大计算机
- Wildfish框架的实现原理之系统工具篇
- Spring 项目无法解析包含 uri http://java.sun.com/jsp/jstl/core 的 taglib
- 【实测避坑】SAP PI/PO系统 配置证书调用https地址
- Redis主从集群搭建及其原理
- IE的缺省设置(转)