
引言
本文介绍了使用CMake进行测试和打包的程序,CMake是一组用于开发各种软件产品的灵活实用的实用程序。 强烈建议您阅读本手册的第一和第二部分,以免误解语法和CMake的工作方式。
CMake发布
以下是使用应练习的CMake语言的示例。 通过修改现有命令并添加新命令来试验源代码。 要运行这些示例,请从官方网站安装CMake。
测试例
如前所述,CMake支持程序的自动测试。 此功能非常易于使用-只需在通常的CMakeLists.txt
编写一些命令,然后使用ctest
或make test
运行make test
。 您可以随意检查程序的输出,内存的动态分析等等。
我们将通过一个特定的示例来考虑测试程序的过程。 Multiply.c
源文件包含以下代码:
#include <stdio.h> #include <stdlib.h> #define ARG_COUNT 3 int main(const int argc, const char *argv[]) { if (argc != ARG_COUNT) { fprintf(stderr, "Error!\n"); return EXIT_FAILURE; } const int first = atoi(argv[1]); const int second = atoi(argv[2]); printf("The result is: %d\n", first * second); return EXIT_SUCCESS; }
此代码显示将两个参数乘以控制台的结果。 请注意,如果实际参数个数不符合预期,则也可能发生错误:在这种情况下,错误将输出到错误流Error!
。
在同一目录中是CMakeLists.txt
文件,其中包含构建过程的描述,其中包含以下代码:
cmake_minimum_required(VERSION 3.0) project(MyProgram) add_executable(Multiply Multiply.c) set(MULTIPLY_TIMEOUT 1)
让我们按顺序考虑一切。 前一篇文章应该让您熟悉前四个命令,而下一个enable_testing
命令会引起很多问题。 本质上,此命令仅通知CMake您打算测试程序的意图,同时生成一些配置文件,而您不必知道这些文件的存在。
以下三个add_test
将测试添加到当前项目。 该命令的缩写形式将测试的名称作为第一个参数,随后的参数构成运行该测试的shell命令。
一系列set_tests_properties
命令可设置各个测试的行为。 在测试项目列表之后,紧随其后的是关键字PROPERTIES
,表示属性列表的开始,其形式为< > < >
并为所选测试设置。 可用属性的完整列表在这里 。
对于所有测试,使用TIMEOUT
属性将最大执行时间设置为一秒,然后对于后续测试,使用PASS_REGULAR_EXPRESSION
和FAIL_REGULAR_EXPRESSION
设置预期的输出(例如,如果正则表达式The result is: 3105
匹配,则FirstTest
测试继续,如果匹配)表达式“ Error!
测试将停止并被视为失败)。
启用测试的方法
有一个enable_testing
的类似物-这是通过include
命令将CTest
模块include
。 通常,包含模块较为通用,但是它们之间仍然存在差异。
enable_testing
命令启用对当前目录以及所有后续目录的测试。 它应该位于CMakeLists.txt
根目录中,因为CTest希望程序集的根目录中有一个测试文件。
启用CTest
模块可以配置项目以使用CTest / CDash进行测试,并且还可以自动确定BUILD_TESTING
选项,该选项在可能进行测试时接受true(默认情况下ON
)。 因此,使用此命令时,以这种方式描述测试过程是合理的:
if(BUILD_TESTING) add_test(FirstTest Test 1) add_test(SecondTest Test 2) add_test(ThirdTest Test 3)
测试执行
一系列cmake . && cmake --build . && ctest .
命令cmake . && cmake --build . && ctest .
cmake . && cmake --build . && ctest .
所有三个测试都运行。 ctest -R <RegularExpression>
执行一组满足给定正则表达式的测试。 例如, ctest -R ThirdTest
仅运行第三个测试。
包装实例
要创建源文件,库和可执行文件的包,只需使用install
命令描述必需文件的install
,然后CPack
include
命令启用CPack
模块:
在这种情况下, install
命令会向软件包生成器通知Multiply
目标安装目录。 如果不编写安装命令,则无法生成软件包。
下面通过设置几个变量列出了程序包的特性。 实际上,有许多这样的变量可以正确打包软件包。 它们中的大多数是可选的,但是某些程序包生成器需要其定义。 此处提供了所有包生成器共有的变量列表。
必须定义CPACK_GENERATOR
变量-它是cpack
实用程序调用的程序包生成器的列表。 在这种情况下,它采用值DEB
,因此,在概述应用程序的根目录中会生成一个debian软件包。
最后, CPack
模块,使用先前定义的变量和可执行文件的安装命令来配置将来的项目包,并添加两个程序集目标package_source
和package_source
(分别为二进制程序集和源程序集)。
包装执行
一系列cmake . && cmake --build . && cmake --build . --target package
命令cmake . && cmake --build . && cmake --build . --target package
cmake . && cmake --build . && cmake --build . --target package
启动cmake . && cmake --build . && cmake --build . --target package
以执行所选的生成器以创建二进制软件包和cmake . && cmake --build . && cmake --build . --target package_source
命令cmake . && cmake --build . && cmake --build . --target package_source
cmake . && cmake --build . && cmake --build . --target package_source
cmake . && cmake --build . && cmake --build . --target package_source
在根目录中直接生成一个源包。
完成时间
至此,CMake完整教程系列已经结束。 希望您学习了很多有用的材料,并提高了编程技巧。 祝你好运