CMake实战:安装测试和添加环境生成安装包(上)

发表于:2022-1-11 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:hackettt    来源:稀土掘金

  1、安装测试
  CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行。在 GNU Makefile 里,你可能需要为此编写 install 和 test 两个伪目标和相应的规则,但在 CMake 里,这样的工作同样只需要简单的调用几条命令。
  1.1定制安装规则
  首先先在 math/CMakeLists.txt 文件里添加下面两行:
  # 指定 MathFunctions 库的安装路径
  install (TARGETS MathFunctions DESTINATION bin)
  install (FILES MathFunctions.h DESTINATION include)

  指明 MathFunctions 库的安装路径。之后同样修改根目录的 CMakeLists 文件,在末尾添加下面几行:
  # 指定安装路径
  install (TARGETS Demo DESTINATION bin)
  install (FILES "${PROJECT_BINARY_DIR}/config.h"
           DESTINATION include)

  通过上面的定制,生成的 Demo 文件和 MathFunctions 函数库 libMathFunctions.o 文件将会被复制到 /usr/local/bin 中,而 MathFunctions.h 和生成的 config.h 文件则会被复制到 /usr/local/include 中。我们可以验证一下(顺带一提的是,这里的 /usr/local/ 是默认安装到的根目录,可以通过修改 CMAKE_INSTALL_PREFIX 变量的值来指定这些文件应该拷贝到哪个根目录):
  [root@hackett demo5]# make install
  Consolidate compiler generated dependencies of target MathFunctions
  [ 50%] Built target MathFunctions
  Consolidate compiler generated dependencies of target demo
  [100%] Built target demo
  Install the project...
  -- Install configuration: ""
  -- Installing: /usr/local/bin/demo
  -- Installing: /usr/local/include/config.h
  -- Installing: /usr/local/bin/libMathFunctions.a
  -- Installing: /usr/local/include/myMath.h
  [root@hackett demo5]# ls /usr/local/bin/
  demo      libMathFunctions.a               
  [root@iZwz97bu0gr8vx0j8l6kkzZ demo5]# ls /usr/local/include/
  config.h myMath.h

  1.2工程添加测试
  添加测试同样很简单。CMake 提供了一个称为 CTest 的测试工具。我们要做的只是在项目根目录的 CMakeLists 文件中调用一系列的 add_test 命令。
  CMakeLists.txt
  cmake_minimum_required(VERSION 3.10)
  # set the project name
  project(demo5)
  # 加入一个配置头文件,用于处理 CMake 对源码的设置
  configure_file (
      "${PROJECT_SOURCE_DIR}/config.h.in"
      "${PROJECT_BINARY_DIR}/config.h"
  )
  # 是否使用自己的 MathFunctions 库
  option (USE_MYMATH
          "Use provided math implementation" ON)
  # 是否加入 MathFunctions 库
  if (USE_MYMATH)
      include_directories ("${PROJECT_SOURCE_DIR}/math")
      add_subdirectory (math)
      set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
  endif (USE_MYMATH)
  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 3 2)
  add_test (test_35_2 demo 35 2)
  set_tests_properties (test_35_2 PROPERTIES PASS_REGULAR_EXPRESSION "37")
  add_test (test_5_2 demo 5 2)
  set_tests_properties (test_5_2 PROPERTIES PASS_REGULAR_EXPRESSION "7")
  add_test (test_2_3 demo 2 3)
  set_tests_properties (test_2_3 PROPERTIES PASS_REGULAR_EXPRESSION "5")

  上面的代码包含了四个测试。第一个测试 test_run 用来测试程序是否成功运行并返回 0 值。剩下的三个测试分别用来测试 35 + 2 、5 + 2、2 + 3是否都能得到正确的结果。其中 PASS_REGULAR_EXPRESSION 用来测试输出是否包含后面跟着的字符串。
  测试结果:
  [root@hackett demo5]# make 
  Consolidate compiler generated dependencies of target MathFunctions
  [ 50%] Built target MathFunctions
  Consolidate compiler generated dependencies of target demo
  [ 75%] Building CXX object CMakeFiles/demo.dir/main.cpp.o
  [100%] Linking CXX executable demo
  [100%] Built target demo
  [root@hackett demo5]# make test
  Running tests...
  Test project /root/workspace/cmake/demo5
      Start 1: test_run
  1/4 Test #1: test_run .........................   Passed    0.00 sec
      Start 2: test_35_2
  2/4 Test #2: test_35_2 ........................   Passed    0.00 sec
      Start 3: test_5_2
  3/4 Test #3: test_5_2 .........................   Passed    0.00 sec
      Start 4: test_2_3
  4/4 Test #4: test_2_3 .........................   Passed    0.00 sec
  100% tests passed, 0 tests failed out of 4
  Total Test time (real) =   0.01 sec

  如果要测试更多的输入数据,像上面那样一个个写测试用例未免太繁琐。这时可以通过编写宏来实现:
  # 定义一个宏,用来简化测试工作
  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 (35 2 "37")
  do_test (5 52 "7")
  do_test (2 3 "5")

  关于 CTest 的更详细的用法可以通过 man 1 ctest 参考 CTest 的文档。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号