CMake如何执行shell命令

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

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

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

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")spa

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

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")htm

 

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

 

${CMAKE_COMMAND}其实就是cmake,源码

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

./hello-worldio

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

相关文章
相关标签/搜索