有选择地 运行 cmake 中的 doxygen

selectively run doxygen in cmake

我有一个 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?

首先从 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;
}

Shell:

$ 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

我想出了一种方法,将工作分配给 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()

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