IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> CMake实战:安装测试和添加环境生成安装包 -> 正文阅读

[系统运维]CMake实战:安装测试和添加环境生成安装包

 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 的文档。

2、添加版本号

  首先修改顶层 CMakeLists 文件,在 project 命令之后加入如下两行:

  set (Demo_VERSION_MAJOR 1)

  set (Demo_VERSION_MINOR 0)

  分别指定当前的项目的主版本号和副版本号。

  之后,为了在代码中获取版本信息,我们可以修改 config.h.in 文件,添加两个预定义变量:

  // the configured options and settings for Tutorial

  #define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@

  #define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

  这样就可以直接在代码中打印版本信息了:

  #include <stdio.h>

  #include <stdlib.h>

  #include "config.h"

  #ifdef USE_MYMATH

  ? #include "math/myMath.h"

  #else

  ? #include <math.h>

  #endif

  int sub(int a, int b) {

   return (a - b);

  }

  int main(int argc, char *argv[]) {

  ? ? if (argc < 3) {

  ? ? ? ? printf("Usage: %s argv[1] argv[2] \n", argv[0]);

  ? ? ? ? return 1;

  ? ? }

  ? ? printf("version : %d.%d\n", Demo_VERSION_MAJOR, Demo_VERSION_MINOR);

  ? ? int a = atof(argv[1]);

  ? ? int b = atoi(argv[2]);

  #ifdef USE_MYMATH

  ? ? printf("Now we use our own Math library. \n");

  ? ? int result = add(a, b);

  ? ? printf("%d + %d = %d\n", a, b, result);

  #else

  ? ? printf("Now we use the main.cpp sub function. \n");

  ? ? int result = sub(a, b);

  ? ? printf("%d - %d = %d\n", a, b, result);

  #endif

  ? ? return 0;

  }

  运行结果:

  [root@hackett demo7]# cmake .

  -- Configuring done

  -- Generating done

  -- Build files have been written to: /root/workspace/cmake/demo7

  [root@hackett demo7]# make

  Consolidate compiler generated dependencies of target MathFunctions

  [ 25%] Building CXX object math/CMakeFiles/MathFunctions.dir/myMath.cpp.o

  [ 50%] Linking CXX static library libMathFunctions.a

  [ 50%] Built target MathFunctions

  [ 75%] Building CXX object CMakeFiles/demo.dir/main.cpp.o

  [100%] Linking CXX executable demo

  [100%] Built target demo

  [root@hackett demo7]# ./demo 2 3?

  version : 1.0

  Now we use our own Math library.?

  2 + 3 = 5

  3、生成安装包

  如何配置生成各种平台上的安装包,包括二进制安装包和源码安装包。为了完成这个任务,我们需要用到 CPack ,它同样也是由 CMake 提供的一个工具,专门用于打包。

  首先在顶层的 CMakeLists.txt 文件尾部添加下面几行:

  # 构建一个 CPack 安装包

  include (InstallRequiredSystemLibraries)

  set (CPACK_RESOURCE_FILE_LICENSE

  ? "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")

  set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")

  set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")

  include (CPack)

  上面的代码做了以下几个工作:

  1. 导入 InstallRequiredSystemLibraries 模块,以便之后导入 CPack 模块;

  2. 设置一些 CPack 相关变量,包括版权信息和版本信息,其中版本信息用了上一节定义的版本号;

  3. 导入 CPack 模块。

  创建一个``License.txt`文件

  touch License.txt

  接下来的工作是像往常一样构建工程,并执行 cpack 命令。

  生成二进制安装包:

  cpack -C CPackConfig.cmake

  生成源码安装包:

  cpack -C CPackSourceConfig.cmake

  我们可以试一下。在生成项目后,执行 cpack -C CPackConfig.cmake 命令:

  [root@hackett demo8]# cmake .

  -- Configuring done

  -- Generating done

  -- Build files have been written to: /root/workspace/cmake/demo8

  [root@hackett demo8]# cpack -C CPackConfig.cmake

  CPack: Create package using STGZ

  CPack: Install projects

  CPack: - Run preinstall target for: demo8

  CPack: - Install project: demo8 [CPackConfig.cmake]

  CPack: Create package

  CPack: - package: /root/workspace/cmake/demo8/demo8-1.0.1-Linux.sh generated.

  CPack: Create package using TGZ

  CPack: Install projects

  CPack: - Run preinstall target for: demo8

  CPack: - Install project: demo8 [CPackConfig.cmake]

  CPack: Create package

  CPack: - package: /root/workspace/cmake/demo8/demo8-1.0.1-Linux.tar.gz generated.

  CPack: Create package using TZ

  CPack: Install projects

  CPack: - Run preinstall target for: demo8

  CPack: - Install project: demo8 [CPackConfig.cmake]

  CPack: Create package

  CPack: - package: /root/workspace/cmake/demo8/demo8-1.0.1-Linux.tar.Z generated.

  [root@hackett demo8]# ls

  CMakeCache.txt? cmake_install.cmake? config.h? ? ?CPackConfig.cmake? CPackSourceConfig.cmake? demo? ? ? ? ? ? ? ? ? demo8-1.0.1-Linux.tar.gz? install_manifest.txt? main.cpp? math

  CMakeFiles? ? ? CMakeLists.txt? ? ? ?config.h.in? _CPack_Packages? ? CTestTestfile.cmake? ? ? demo8-1.0.1-Linux.sh? demo8-1.0.1-Linux.tar.Z? ?License.txt? ? ? ? ? ?Makefile

  这 3 个二进制包文件所包含的内容是完全相同的。我们可以执行其中一个。此时会出现一个由 CPack 自动生成的交互式安装界面:

  [root@hackett demo8]# sh demo8-1.0.1-Linux.sh?

  demo8 Installer Version: 1.0.1, Copyright (c) Humanity

  This is a self-extracting archive.

  The archive will be extracted to: /root/workspace/cmake/demo8

  If you want to stop extracting, please press <ctrl-C>.

  Do you accept the license? [yn]:?

  y

  By default the demo8 will be installed in:

  ? "/root/workspace/cmake/demo8/demo8-1.0.1-Linux"

  Do you want to include the subdirectory demo8-1.0.1-Linux?

  Saying no will install in: "/root/workspace/cmake/demo8" [Yn]:?

  y

  Using target directory: /root/workspace/cmake/demo8/demo8-1.0.1-Linux

  Extracting, please wait...

  Unpacking finished successfully

  完成后提示安装到了 demo8-1.0.1-Linux 子目录中,我们可以进去执行该程序:

  [root@hackett demo8]# ls

  CMakeCache.txt? cmake_install.cmake? config.h? ? ?CPackConfig.cmake? CPackSourceConfig.cmake? demo? ? ? ? ? ? ? ?demo8-1.0.1-Linux.sh? ? ? demo8-1.0.1-Linux.tar.Z? main.cpp? math

  CMakeFiles? ? ? CMakeLists.txt? ? ? ?config.h.in? _CPack_Packages? ? CTestTestfile.cmake? ? ? demo8-1.0.1-Linux? demo8-1.0.1-Linux.tar.gz? install_manifest.txt? ? ?Makefile

  [root@hackett demo8]# ./demo8-1.0.1-Linux/bin/demo 3 2

  version : 1.0

  Now we use our own Math library.?

  3 + 2 = 5

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 16:03:51  更:2022-02-28 16:04:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:17:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码