【问题标题】:Custom command / target run only for default build not install自定义命令/目标仅针对默认构建运行,不安装
【发布时间】:2018-08-11 12:31:06
【问题描述】:

我想在我的项目中默认使用 CMake 构建我的文档 (doxygen)。我让 CMake 生成 Makefile。到目前为止,我知道这些方法:

1)

add_custom_target(doc ALL
  COMMAND ${DOXYGEN_COMMAND})

2)

add_custom_command(
  TARGET my-executable
  POST_BUILD
  COMMAND ${DOXYGEN_COMMAND})

我对第一种方法的问题是目标是在构建和安装期间构建both(即在运行make在运行make install 时) .这是不行的。

第二种方法的问题在于它实际上并不正确:文档不必必须在可执行文件之后构建(事实上,它甚至可以并行完成)。此外,我现在无法仅构建可执行文件。

有没有办法创建此自定义命令/目标,使其make(构建)期间运行,而不是在make install(安装)期间运行,但独立于其他可执行文件等目标?

基本上我需要一个“默认目标”。另外我真的很想避免递归执行 CMake 或直接执行。

【问题讨论】:

  • 使用add_custom_command(OUTPUT ...) 定义生成文档的规则,使用add_custom_target(... ALL) 定义依赖于命令输出的规则。这样,文档将只构建一次。
  • @arrowd:非默认自定义目标的问题在于其文件无法安装:(在 CMake 文档文件中,表示用于安装但不是由 make all 生成,被称为未定义的行为)。但文档文件通常用于安装。

标签: cmake


【解决方案1】:

@Tsyvarev 给出的解决方案在一个问题上效果很好除了

手动运行 make docs 不会导致重新构建文档,因为“输出文件”${documentation_file} 始终被认为是最新的(没有指定可能更新的依赖项)。

我找到了三种解决方法:

  • 运行make -B docs-B 标志使 GNU Make 认为所有目标都已过期,从而导致生成文档。

  • 添加一个“手动文档”目标,该目标首先依赖于一个删除 ${documentation_file}docs-clean 目标,然后是 docs 本身(以构建文档和文件),然后运行 ​​make docs-manual

    add_custom_target(docs-clean
      COMMAND ${CMAKE_COMMAND} -E remove ${documentation_file})
    add_custom_target(docs-manual)
    add_dependencies(docs-manual docs-clean docs)
    

    请注意,我担心这只是一个肮脏的 hack:AFAIK 未指定构建依赖项(docs-cleandocs)的顺序,因为它们之间没有依赖关系,它们甚至可以并行构建。

    使用add_custom_commandTARGET docs-manualPRE_BUILD(在构建依赖项之前运行命令)而不是docs-clean 目标会很完美,但是这个only works for Visual Studio 7 or later

  • 添加一个依赖于docs但删除生成的${documentation_file}的自定义目标:

    add_custom_target(docs-manual
      COMMAND ${CMAKE_COMMAND} -E remove ${documentation_file})
    add_dependencies(docs-manual docs)
    

    除了在make docs 之后第一次运行它之外,这有效,因为当docs 构建时,生成的文件仍然存在。

编辑:使用add_dependencies 代替add_custom_targetDEPENDS,因为后者仅用于文件,而不用于对目标的依赖。

【讨论】:

  • add_custom_target 命令DEPENDS 中添加的依赖不是来自target,如你所料,而是来自file .在任何地方,清理文档文件的方法与问题帖子中的第二种方法具有相同的缺点:在make install 上,文档也将被构建。
  • @Tsyvarev 谢谢,解决了DEPENDS 的问题。只有在(手动)运行docs-manual 目标时才会清理文档文件。运行 make 后跟 make install 只会构建一次文档(因为单独的 docs 目标不会删除文档文件)。
  • 拥有docs-manualdocs 似乎有点乱,但没关系。顺便说一句,如果文档文件由 doxygen 生成,则可以轻松获取列表 source 文件(例如通过file(GLOB))。因此,“文档文件”的 DEPENDS 选项允许您仅在可以更改其内容时重建文档。这种方式对我来说似乎比额外的docs-manual 目标更清楚。
【解决方案2】:

只要创建一个文件,存在就表示文档文件已经建立:

set(documentation_file ${CMAKE__BINARY_DIR}/docs_ready)

# Documentation target
add_custom_target(docs ALL DEPENDS ${documentation_file})
# Documentation command
add_custom_command(OUTPUT ${documentation_file}
    COMMAND ${DOXYGEN_COMMAND}
    # And mark that documentation is created
    COMMAND ${CMAKE_COMMAND} -E touch ${documentation_file}
)

【讨论】:

  • 唯一的缺点:make docs 手动运行现在不会重建文档(因为${documentation_file} 在那里,ofc)。添加带有解决方法的答案。
猜你喜欢
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2016-10-18
相关资源
最近更新 更多