Cmake 自定义命令/目标仅针对默认生成运行,不安装

Cmake 自定义命令/目标仅针对默认生成运行,不安装,cmake,Cmake,默认情况下,我希望使用CMake与我的项目一起构建文档(doxygen)。我让CMake生成makefile。到目前为止,我知道这些方法: (一) (二) 第一种方法的问题是,目标是在生成和安装期间生成(即运行make和运行makeinstall时)。这是不可能的 第二种方法的问题在于它实际上并不正确:文档不必在可执行文件之后构建(事实上,它甚至可以并行完成)。此外,我现在不能只构建可执行文件 是否有方法创建此自定义命令/目标,使其仅在make(构建)期间运行,而不是在make install(

默认情况下,我希望使用CMake与我的项目一起构建文档(doxygen)。我让CMake生成makefile。到目前为止,我知道这些方法:

(一)

(二)

第一种方法的问题是,目标是在生成和安装期间生成(即运行
make
和运行
makeinstall
时)。这是不可能的

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

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


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

只需创建一个文件,这意味着已经构建了文档文件:

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

只需创建一个文件,这意味着已经构建了文档文件:

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\u file}
始终被认为是最新的(没有指定可能更新的依赖项)

我发现了三个变通方法:

  • 运行
    make-B docs
    。<代码> -b/COD>标志导致GNU使所有目标都过时,从而导致文档的生成。

  • 添加一个“手动文档”目标,该目标首先依赖于删除
    ${documentation\u 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)
    
    请注意,我担心这只是一个肮脏的攻击:AFAIK没有指定依赖项(
    docs clean
    docs
    )的生成顺序,并且由于它们之间没有依赖项,因此它们甚至可以并行生成

    使用
    add_custom_命令
    TARGET docs手册
    PRE_BUILD
    (在构建依赖项之前运行该命令)而不是
    docs clean
    目标将是完美的,但这一点

  • 添加依赖于
    文档
    但删除生成的
    ${documentation\u 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_target
dependens
,因为后者仅适用于文件,而不适用于对目标的依赖性。

除了一个问题外,提供的解决方案非常有效:

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

我发现了三个变通方法:

  • 运行
    make-B docs
    。<代码> -b/COD>标志导致GNU使所有目标都过时,从而导致文档的生成。

  • 添加一个“手动文档”目标,该目标首先依赖于删除
    ${documentation\u 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)
    
    请注意,我担心这只是一个肮脏的攻击:AFAIK没有指定依赖项(
    docs clean
    docs
    )的生成顺序,并且由于它们之间没有依赖项,因此它们甚至可以并行生成

    使用
    add_custom_命令
    TARGET docs手册
    PRE_BUILD
    (在构建依赖项之前运行该命令)而不是
    docs clean
    目标将是完美的,但这一点

  • 添加依赖于
    文档
    但删除生成的
    ${documentation\u 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_target
dependens
,因为后者仅用于文件,而不用于对目标的依赖关系。

使用
add_custom_命令(输出…
定义生成文档的规则和
add_custom_target(…ALL)
这取决于命令的输出。这样,文档将只生成一次。@arrowd:非默认自定义目标的问题是无法安装其文件:(在CMake文档中,表示要安装但不是由
make all
生成的文件称为未定义行为)。但文档文件通常用于安装。使用
add_custom_命令(输出…
定义生成文档的规则,并使用
add_custom_目标(…全部)
,这取决于命令的输出。这样,文档将只生成一次。@arrowd:非默认自定义目标的问题是无法安装其文件:(在CMake文档中,表示要安装但不是由
make all
生成的文件称为未定义行为)。但文档文件通常用于安装。唯一的缺点是:
makedocs
手动运行不会立即重建文档(因为
${documentation\u file}
存在,