【问题标题】:selectively run doxygen in cmake在 cmake 中选择性地运行 doxygen
【发布时间】:2019-05-14 19:59:09
【问题描述】:

我有一个 CMakeLists.txt 文件,用于处理软件项目的 Doxygen 生成。其内容为:

find_package(Doxygen)
if (DOXYGEN_FOUND)
  set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
  set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
  configure_file(${doxyfile_in} ${doxyfile} @ONLY)
  add_custom_target(doc ALL
    ${DOXYGEN_EXECUTABLE} ${doxyfile}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Generating API documentation with Doxygen" VERBATIM) 
endif()

如果我正在执行安装构建,我真的很想只运行 doxygen。是否有一些直接的方式可以将其传达给 cmake?

【问题讨论】:

  • 可能您必须以仅在安装目标而不是默认 (?) 目标中调用 doxygen 的方式进行调用。
  • @albert 当然。问题是如何做到这一点。
  • @user888379 你想在调用cmake --target install的时候生成文档吧?
  • @EmiBrown 我从未使用过 cmake --target install;我总是使用make install。我刚试了一下,得到消息“指定 --help 以供使用,或按 CMake GUI 上的帮助按钮。”我也从未使用过 CMake GUI,,,
  • cmake --build build --target install,如果您使用 Makefile 生成器,将简单地执行 cd build && make install。但与“make install”相反,它也适用于忍者等

标签: cmake doxygen


【解决方案1】:

首先从add_custom_target()中删除ALL。

add_custom_target(doc ALL

add_custom_target(doc

然后添加

install(CODE
  "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target doc)")

源代码:https://cmake.org/cmake/help/latest/command/install.html#code

示例

CMakeList.txt:

cmake_minimum_required (VERSION 3.5)
project(meta VERSION 1.0.0 LANGUAGES NONE)
# ....

enable_language(CXX)
add_executable(app main.cpp)

include(GNUInstallDirs)
set(CMAKE_INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/foo)
install(TARGETS app
  EXPORT FooTargets
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(EXPORT FooTargets
  NAMESPACE foo::
  DESTINATION ${CMAKE_INSTALL_CONFIGDIR}
)

# replace by your own code
add_custom_target(doxygen
  COMMAND echo Hello Doxygen
  VERBATIM
)

install(CODE
  "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target doxygen)")

main.cpp

int main() {
  return 0;
}

壳牌:

$ cmake -H. -Bbuild
...
$ cmake --build build --target install -- DESTDIR=install
Scanning dependencies of target app
[ 50%] Building CXX object CMakeFiles/app.dir/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app
Install the project...
-- Install configuration: ""
-- Installing: install/usr/local/bin/app
-- Installing: install/usr/local/lib/cmake/foo/FooTargets.cmake
-- Installing: install/usr/local/lib/cmake/foo/FooTargets-noconfig.cmake
Scanning dependencies of target doxygen
Hello Doxygen
Built target doxygen

【讨论】:

  • 我认为这行不通,安装不是高级目标,它是内​​置的
  • 有趣 - 我想知道将构建逻辑嵌入到 install() 中。我试试看。
  • @Mizux,很好,我不知道install(CODE ...) 命令,谢谢
【解决方案2】:

我想出了一种方法,在 add_custom_command() 和 add_custom_target() 之间划分工作:

find_package(Doxygen)
if (DOXYGEN_FOUND)
  set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
  set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
  configure_file(${doxyfile_in} ${doxyfile} @ONLY)
  add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen.stamp
    DEPENDS ${doxyfile}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile}
    COMMAND cmake -E touch ${CMAKE_CURRENT_BINARY_DIR}/doxygen.stamp
    COMMENT "Generating API documentation with Doxygen"
    VERBATIM)
  add_custom_target(doc ALL
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/doxygen.stamp)
endif()

这并不完全符合我最初的要求,但对于我的目的来说已经足够了。我暂时不会接受这个答案,以防有人插话确实更准确地解决了我最初的要求。

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多