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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM