我在cmake编译后想执行一些特定的shell命令(执行、lcov收集代码覆盖报告等),我又不想写到XX.sh的shell脚本中,如何直接通过CMake执行shell命令呢?

在网上翻江倒海了一下,找到了一个老外写的cmake脚本,参考他,自己写了下,终于实现了我的目标,主要是用ADD_CUSTOM_TARGET和EXECUTE_PROCESS来实现。具体实现我还是用经典的hello world来解释下:

在你的CMakeLists.txt中,加入以下代码:

SET(RUN_HELLO_WORLD_COMMAND_FILE "${CMAKE_BINARY_DIR}/run-hello-world.cmake")
FILE(WRITE ${RUN_HELLO_WORLD_COMMAND_FILE }
"SET(ENV{LANG en})\n")

FILE(APPEND ${RUN_HELLO_WORLD_COMMAND_FILE }
"EXECUTE_PROCESS(COMMAND \"./hello-world\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}/bin\")\n")

FILE(APPEND ${RUN_HELLO_WORLD_COMMAND_FILE }"EXECUTE_PROCESS(COMMAND \"${GCOVR_EXECUTABLE}\" --html  -r \"${CMAKE_SOURCE_DIR}\" --output \"${COVERAGE_HTML_FILE}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n")

ADD_CUSTOM_TARGET(run-hello-world
COMMAND ${CMAKE_COMMAND} ARGS -P ${RUN_HELLO_WORLD_COMMAND_FILE }
DEPENDS hello-world)

${CMAKE_COMMAND}其实就是cmake,

上面我先在CMAKE_BINARY_DIR加一个文件叫run-hello-world.cmake,我在这个FILE里面做了两件事,1.执行hello-world 2. 用gcovr生成了html报告,如果写成shell脚本的话就是:

./hello-world

gcovr --html -r "/media/helloworld" --output "/media/helloworld/build"

OK,上面已经在你的CMakeLists.txt中加好了上述语句,那如何使用呢?请看下面:

1.编译 cmake .. -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug (..表示源码位置为上一层路径,这个根据给位看官具体情况而定)

2.编译你的target(这里是hello-world), cmake --build . --use-stderr --target hello-world

3.编译自己加的target(run-hello-world),cmake --build . --use-stderr --target run-hello-world

OK,执行完上面一句cmake后,cmake就会去执行hello-world,得到代码覆盖率报告,也算是更够满足我原先想在cmake中执行shell脚本的需求。

ADD_CUSTOM_TARGET,EXECUTE_PROCESS等,各位看官自行百度或Google吧。

希望对各位看官能有帮助!

参考链接:https://code.cor-lab.de/projects/rsc/repository/revisions/master/entry/cmake/Modules/EnableCoverageReport.cmake

CMake如何执行shell命令的更多相关文章

  1. Linux远程执行Shell命令或脚本

    ## 远程执行shell命令 ssh [user]@[server] '[command]' # eg. ssh root@192.168.1.1 'uptime' ## 远程执行本地shell脚本 ...

  2. vim中执行shell命令

    1):!command   不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容   例如   :!ls -l   特别的可以运行:!bas ...

  3. Android Java执行Shell命令

    最新内容建议直接访问原文:http://www.trinea.cn/android/android-java-execute-shell-commands/ 主要介绍Android或Java应用中如何 ...

  4. subprocess模块还提供了很多方便的方法来使得执行 shell 命令

    现在你可以看到它正常地处理了转义. 注意 实际上你也可以在shell=False那里直接使用一个单独的字符串作为参数, 但是它必须是命令程序本身,这种做法和在一个列表中定义一个args没什么区别.而如 ...

  5. nodejs 执行shell 命令

    有需要从前端操作服务器执行shell命令的需求 建立一个process.js文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var process =  ...

  6. vim中执行shell命令小结

    vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...

  7. python(6)-执行shell命令

    可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 commands.* ...

  8. Android执行shell命令

    一.方法 /** * 执行一个shell命令,并返回字符串值 * * @param cmd * 命令名称&参数组成的数组(例如:{"/system/bin/cat", &q ...

  9. loadrunner调用plink,远程linux执行shell命令

    loadrunner调用plink,远程linux执行shell命令   脚本: Action() {   char* cmd; cmd = lr_eval_string("C:\\\&qu ...

随机推荐

  1. AS代码优化和Flex应用程序的性能

    1.在局部变量够用时,不要使用全局变量.类静态变量也要少用.全局变量是开发者的恶梦.实在需要全局变量的话,我建议使用singleton设 计模式来进行管理. 2.读取数组中的数据,尽量使用for in ...

  2. JVM方法调用栈

    摘自深入分析java web技术内幕

  3. PHP里文件的查找方式及写法

    PHP里说的文件包括:文件和目录1.用filetype方法加路径("./11.txt")是判断文件类型 //var_dump(filetype("./11.txt&quo ...

  4. [JAVA] 学java必看书籍

    <java编程思想>,<Effective Java>,<JVM虚拟机规范>     <Java核心技术>    <Java Web开发技术大全& ...

  5. Javascript设计模式之装饰者模式详解篇

    一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...

  6. 一键安装Redmine

    群英汇·项目管理系统:http://www.ossxp.com/HelpCenter/00040_Redmine 其中包含中文说明及管理手册 一键安装下载:http://bitnami.org/sta ...

  7. (三)Harbor使用OpenLDAP认证登陆

    接上一篇<安装Harbor>,安装好之后,接下来我们使用OpenLDAP来进行Harbor  web界面的登陆验证及权限分配! OpenLDAP: 使用OpenLDAP的都知道,这是一个集 ...

  8. java后台接受app上传的图片

    package com.sujinabo.file; import java.io.File; import java.io.FileOutputStream; import java.io.IOEx ...

  9. AR/VR行业是否会像智能手机一样的飞速崛起

    从硬件和内容两方面来看,VR(虚拟现实)应该会比AR(增强现实)率先普及大众.当然,这是建立在解决无线化.眩晕.便携等问题之后的事儿,内容上不用担心,照现在这个发展速度-- 说到"风口&qu ...

  10. Jmeter之录制脚本

    目前,思路:先录制→再压测. [一]录制的准备: 第一种:直接的模板(¬_¬) [1]File→Templates [2]看见Select Template→Recording→create [3]好 ...