运行自定义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}/) 

现在脚本是在配置阶段不是在构建时执行,但。

+2

可能重复的[CMake add \ _custom \ _command not running](http://*.com/questions/2937128/cmake-add-custom-command-not-being-run) – Tsyvarev

你差不多有add_custom_command。这确实是告诉CMake如何生成文件的正确方法。但是,CMake只会在某些事情依赖于该文件时运行。

当如在你的情况下,该文件本身是最终产品,并且不被后续的构建步骤进一步使用的任何,通常的方法是创建一个定制目标,以驱动相关的自定义命令(S):

add_custom_target(
    BuildDocs ALL 
    DEPENDS doc.pdf 
) 

这个(自定义命令的自定义目标驱动程序)是CMake中非常常见的习惯用法。

你当然可以玩add_custom_target(例如ALL,COMMENT)的参数,因为它适合你。

+0

谢谢。 :)我必须使用特殊的CMake命令将doc.pdf复制到build目录吗? 'doc.pdf'在目录'doc'中创建,但不被复制。 – Marcello90

+0

@ Marcello90如果您希望在二进制目录中生成该文件,并且该脚本缺乏单独执行此操作的功能(例如,通过传递所需的输出位置),则可以使用其他自定义命令来复制文件(并且目标取决于* final *输出位置);可以使用'$ {CMAKE_COMMAND} -E copy_if_different'或类似的方法在构建时实现与平台无关的副本。 – Angew