Cmake 自定义命令/目标仅针对默认生成运行,不安装
默认情况下,我希望使用CMake与我的项目一起构建文档(doxygen)。我让CMake生成makefile。到目前为止,我知道这些方法: (一) (二) 第一种方法的问题是,目标是在生成和安装期间生成(即运行Cmake 自定义命令/目标仅针对默认生成运行,不安装,cmake,Cmake,默认情况下,我希望使用CMake与我的项目一起构建文档(doxygen)。我让CMake生成makefile。到目前为止,我知道这些方法: (一) (二) 第一种方法的问题是,目标是在生成和安装期间生成(即运行make和运行makeinstall时)。这是不可能的 第二种方法的问题在于它实际上并不正确:文档不必在可执行文件之后构建(事实上,它甚至可以并行完成)。此外,我现在不能只构建可执行文件 是否有方法创建此自定义命令/目标,使其仅在make(构建)期间运行,而不是在make install(
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}
始终被认为是最新的(没有指定可能更新的依赖项)
我发现了三个变通方法:
- 运行
。<代码> -b/COD>标志导致GNU使所有目标都过时,从而导致文档的生成。make-B docs
- 添加一个“手动文档”目标,该目标首先依赖于删除
的${documentation\u file}
目标,然后依赖于docs clean
本身(构建文档和文件),然后运行docs
:make docs manual
请注意,我担心这只是一个肮脏的攻击:AFAIK没有指定依赖项(add_custom_target(docs-clean COMMAND ${CMAKE_COMMAND} -E remove ${documentation_file}) add_custom_target(docs-manual) add_dependencies(docs-manual docs-clean docs)
和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}
始终被认为是最新的(没有指定可能更新的依赖项)
我发现了三个变通方法:
- 运行
。<代码> -b/COD>标志导致GNU使所有目标都过时,从而导致文档的生成。make-B docs
- 添加一个“手动文档”目标,该目标首先依赖于删除
的${documentation\u file}
目标,然后依赖于docs clean
本身(构建文档和文件),然后运行docs
:make docs manual
请注意,我担心这只是一个肮脏的攻击:AFAIK没有指定依赖项(add_custom_target(docs-clean COMMAND ${CMAKE_COMMAND} -E remove ${documentation_file}) add_custom_target(docs-manual) add_dependencies(docs-manual docs-clean docs)
和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}
存在,