【问题标题】:Run custom shell script with CMake使用 CMake 运行自定义 shell 脚本
【发布时间】:2016-10-10 14:05:25
【问题描述】:

我的目录结构如下:

/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 复制到构建目录?

我尝试在doc目录内的CMakeLists.txt文件中使用add_custom_command

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}/ ) 

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

【问题讨论】:

标签: cmake


【解决方案1】:

add_custom_command 已经快到了。这确实是告诉 CMake 如何生成文件的正确方法。但是,CMake 只会在某些内容依赖于该文件时运行它。

当文件本身是最终产品并且后续构建步骤不再使用时,通常的方法是创建一个自定义目标来驱动相关的自定义命令:

add_custom_target(
  BuildDocs ALL
  DEPENDS doc.pdf
)

This(自定义命令的自定义目标驱动程序)是 CMake 中非常常见的习语。

您当然可以随意使用 add_custom_target 的参数(例如 ALLCOMMENT),因为它适合您。

【讨论】:

  • 谢谢。 :) 我是否必须使用特殊的 CMake 命令将 doc.pdf 复制到构建目录? doc.pdf 在目录doc 中创建,但未被复制。
  • @Marcello90 如果您希望在二进制目录中生成文件,并且脚本无法自行执行此操作(例如,通过传递所需的输出位置),那么您可以使用用于复制文件的附加自定义命令(并使目标取决于 final 输出位置); ${CMAKE_COMMAND} -E copy_if_different 或类似的东西可用于在构建时实现平台无关的复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2018-02-28
  • 2016-06-14
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多