在cmake中选择性地运行氧气

时间:2018-12-13 14:59:30

标签: cmake doxygen

我有一个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。有什么直接的方法可以传达这种信息吗?

2 个答案:

答案 0 :(得分:2)

首先从add_custom_target()中删除所有内容。

add_custom_target(doc ALL

通过

add_custom_target(doc

然后添加

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

src: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

答案 1 :(得分:0)

我想出了一种在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()

这并不是我最初想要的,但对于我的目的来说已经足够了。我还不会接受这个答案,以防有人听到一个确实更准确地满足了我最初的要求的答案。