完整的CMake指南。 第三部分:测试和包装


引言


本文介绍了使用CMake进行测试和打包的程序,CMake是一组用于开发各种软件产品的灵活实用的实用程序。 强烈建议您阅读本手册的第一第二部分,以免误解语法和CMake的工作方式。


CMake发布


以下是使用应练习的CMake语言的示例。 通过修改现有命令并添加新命令来试验源代码。 要运行这些示例,请从官方网站安装CMake。


测试例


如前所述,CMake支持程序的自动测试。 此功能非常易于使用-只需在通常的CMakeLists.txt编写一些命令,然后使用ctestmake 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() #  : add_test(FirstTest Multiply 15 207) add_test(SecondTest Multiply -54 -785) add_test(ThirdTest Multiply 85234) #   : set_tests_properties(FirstTest SecondTest ThirdTest PROPERTIES TIMEOUT ${MULTIPLY_TIMEOUT}) set_tests_properties(FirstTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 3105" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(SecondTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 42390" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(ThirdTest PROPERTIES PASS_REGULAR_EXPRESSION "Error!") 

让我们按顺序考虑一切。 前一篇文章应该让您熟悉前四个命令,而下一个enable_testing命令会引起很多问题。 本质上,此命令仅通知CMake您打算测试程序的意图,同时生成一些配置文件,而您不必知道这些文件的存在。


以下三个add_test将测试添加到当前项目。 该命令的缩写形式将测试的名称作为第一个参数,随后的参数构成运行该测试的shell命令。


一系列set_tests_properties命令可设置各个测试的行为。 在测试项目列表之后,紧随其后的是关键字PROPERTIES ,表示属性列表的开始,其形式为< > < >并为所选测试设置。 可用属性的完整列表在这里


对于所有测试,使用TIMEOUT属性将最大执行时间设置为一秒,然后对于后续测试,使用PASS_REGULAR_EXPRESSIONFAIL_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) #  ... endif() 

测试执行


一系列cmake . && cmake --build . && ctest .命令cmake . && cmake --build . && ctest . cmake . && cmake --build . && ctest . 所有三个测试都运行。 ctest -R <RegularExpression>执行一组满足给定正则表达式的测试。 例如, ctest -R ThirdTest仅运行第三个测试。


包装实例


要创建源文件,库和可执行文件的包,只需使用install命令描述必需文件的install ,然后CPack include命令启用CPack模块:


 #    "Multiply"   "bin": install(TARGETS Multiply DESTINATION bin) #    : set(CPACK_PACKAGE_NAME "Multiply") set(CPACK_PACKAGE_VENDOR "MyCompany") set(CPACK_PACKAGE_CONTACT "https://myprojectsite.org") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "mycontacts@gmail.com") set(CPACK_PACKAGE_DESCRIPTION "The most stupid program ever written") #    : set(CPACK_GENERATOR "DEB") #    "CPack": include(CPack) 

在这种情况下, install命令会向软件包生成器通知Multiply目标安装目录。 如果不编写安装命令,则无法生成软件包。


下面通过设置几个变量列出了程序包的特性。 实际上,有许多这样的变量可以正确打包软件包。 它们中的大多数是可选的,但是某些程序包生成器需要其定义。 此处提供所有包生成器共有的变量列表。


必须定义CPACK_GENERATOR变量-它是cpack实用程序调用的程序包生成器的列表。 在这种情况下,它采用值DEB ,因此,在概述应用程序的根目录中会生成一个debian软件包。


最后, CPack模块,使用先前定义的变量和可执行文件的安装命令来配置将来的项目包,并添加两个程序集目标package_sourcepackage_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完整教程系列已经结束。 希望您学习了很多有用的材料,并提高了编程技巧。 祝你好运

Source: https://habr.com/ru/post/zh-CN433822/


All Articles