运行自定义shell脚本的CMake
我有以下目录结构:运行自定义shell脚本的CMake
/CMakeLists.txt
/component-a/CMakeLists.txt
/...
/component-b/CMakeLists.txt
/...
/doc/CMakeLists.txt
/create-doc.sh
shell脚本create-doc.sh
创建一个文档文件(doc.pdf
)。我如何在构建时使用CMake来执行这个shell脚本,并将文件doc.pdf
复制到构建目录中?
我尝试通过在CMakeLists.txt
文件中使用add_custom_command
目录doc
内:
add_custom_command (OUTPUT doc.pdf
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create-doc.sh
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/)
不幸的是,命令永远不会运行。
我也试过execute_process
:
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create-doc.sh
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/)
现在脚本是在配置阶段不是在构建时执行,但。
你差不多有add_custom_command
。这确实是告诉CMake如何生成文件的正确方法。但是,CMake只会在某些事情依赖于该文件时运行。
当如在你的情况下,该文件本身是最终产品,并且不被后续的构建步骤进一步使用的任何,通常的方法是创建一个定制目标,以驱动相关的自定义命令(S):
add_custom_target(
BuildDocs ALL
DEPENDS doc.pdf
)
这个(自定义命令的自定义目标驱动程序)是CMake中非常常见的习惯用法。
你当然可以玩add_custom_target
(例如ALL
,COMMENT
)的参数,因为它适合你。
谢谢。 :)我必须使用特殊的CMake命令将doc.pdf复制到build目录吗? 'doc.pdf'在目录'doc'中创建,但不被复制。 – Marcello90
@ Marcello90如果您希望在二进制目录中生成该文件,并且该脚本缺乏单独执行此操作的功能(例如,通过传递所需的输出位置),则可以使用其他自定义命令来复制文件(并且目标取决于* final *输出位置);可以使用'$ {CMAKE_COMMAND} -E copy_if_different'或类似的方法在构建时实现与平台无关的副本。 – Angew
可能重复的[CMake add \ _custom \ _command not running](http://*.com/questions/2937128/cmake-add-custom-command-not-being-run) – Tsyvarev