CMake如何执行shell命令
我在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命令的更多相关文章
- Linux远程执行Shell命令或脚本
## 远程执行shell命令 ssh [user]@[server] '[command]' # eg. ssh root@192.168.1.1 'uptime' ## 远程执行本地shell脚本 ...
- vim中执行shell命令
1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如 :!ls -l 特别的可以运行:!bas ...
- Android Java执行Shell命令
最新内容建议直接访问原文:http://www.trinea.cn/android/android-java-execute-shell-commands/ 主要介绍Android或Java应用中如何 ...
- subprocess模块还提供了很多方便的方法来使得执行 shell 命令
现在你可以看到它正常地处理了转义. 注意 实际上你也可以在shell=False那里直接使用一个单独的字符串作为参数, 但是它必须是命令程序本身,这种做法和在一个列表中定义一个args没什么区别.而如 ...
- 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 = ...
- vim中执行shell命令小结
vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...
- python(6)-执行shell命令
可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen* --废弃 popen2.* --废弃 commands.* ...
- Android执行shell命令
一.方法 /** * 执行一个shell命令,并返回字符串值 * * @param cmd * 命令名称&参数组成的数组(例如:{"/system/bin/cat", &q ...
- loadrunner调用plink,远程linux执行shell命令
loadrunner调用plink,远程linux执行shell命令 脚本: Action() { char* cmd; cmd = lr_eval_string("C:\\\&qu ...
随机推荐
- 设计模式08---设计模式之抽象工厂模式(Abstract Factory)
1.场景模拟 举个生活中常见的例子:组装电脑,我们在组装电脑的时候,通常要选择一系列的配件,比如选择CPU时候,需要注意品牌,型号,针脚数目,主频,只有这些都确定下来,才能确定一个CPU.同样,主板也 ...
- Android开发(19)---常见dialog对话框的运用
Dialog是android开发过程中最常用到的组件之一,Dialog的创立办法有两种: 一是直接new一个Dialog目标,然后调用Dialog目标的show和dismiss办法来操控对话框的显现和 ...
- Mybatis-Spring SqlSessionTemplate 源码解析
在使用Mybatis与Spring集成的时候我们用到了SqlSessionTemplate 这个类. <bean id="sqlSession" class="or ...
- [转载]关于shell脚本的基本语法
关于shell脚本的基本语法 整理于:2014-03-31,何俭飞,mymladdr@sina.com 一.执行 1.shell脚本如果要被执行,一般地必须要有执行权限"x"(除了 ...
- Zookeeper 安装和配置
单机模式 下载zookeeper的安装包之后, 解压到合适目录. 进入zookeeper目录下的conf子目录, 创建zoo.cfg: tickTime=2000 dataDir=/Users/app ...
- 用python计算lda语言模型的困惑度并作图
转载请注明:电子科技大学EClab——落叶花开http://www.cnblogs.com/nlp-yekai/p/3816532.html 困惑度一般在自然语言处理中用来衡量训练出的语言模型的好坏. ...
- PHP5.6通过CURL上传图片@符无效的兼容问题
今天本来想试试一个图片云的API,于是本地做了个上传图片的测试,结果灰常郁闷的发现以前一直用的好好的CURL上传图片居然死活不起作用,本来几分钟搞定的事情,结果折腾了大半天才终于找到原因,居然是兼容性 ...
- 隐藏或删除指定的html元素
<div id="Contain"> <div>好好学习<div> <div>天天向上<div> <div> ...
- public static void speckOnWin7(string text),在win7中读文字
public static void speckOnWin7(string text) { //洪丰写的,转载请注明 try { string lsSource = ""; ...
- 关于AVL实现的代码记录
试题集合: https://www.patest.cn/contests/pat-a-practise/1064 https://www.patest.cn/contests/pat-a-practi ...