如何告诉CMake安装目录依赖于伪目标



如何在CMake中实现以下功能(使用2.8.5版本)?我有一个名为doc的自定义目标生成的文档,我希望在安装或打包时包含其输出。

add_custom_target( doc "${DOXYGEN_EXECUTABLE}" Doxyfile )
install( DIRECTORY ${CMAKE_BINARY_DIR}/doc DESTINATION doc )

Doxyfile告诉氧在${CMAKE_BINARY_DIR}/doc放文件。

如果我在构建目录中这样做:

make doc
cpack

things工作正常,因为第一行创建了install目标所依赖的目录。

然而,如果我有一个新的构建(所以${CMAKE_BINARY_DIR}/doc还不存在),我直接调用CPack:

cpack

然后它抱怨它找不到${CMAKE_BINARY_DIR}/doc:

CMake Error at <snip>/build/cmake_install.cmake:36 (FILE):
  file INSTALL cannot find "<snip>/build/doc".

我还尝试了以下操作:

add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile )
install( DIRECTORY ${CMAKE_BINARY_DIR}/doc DESTINATION doc )

但是我仍然得到相同的CPack错误,并且在构建目录中做make doc也不起作用。

因此,如果我在cpack之前手动执行make doc,它与本帖子顶部的配置一起工作,但我如何告诉cmake/cpack install指令依赖于自定义目标doc,以便在调用cpackmake install时自动生成文档?

谢谢!

可能需要ALL关键字:

add_custom_target( doc ALL "${DOXYGEN_EXECUTABLE}" Doxyfile )

更新:

目前cmake不提供一个选项来添加自定义依赖到它的内置目标(如all, install, test等)。似乎在不久的将来它不会提供这个选项-参见http://public.kitware.com/Bug/view.php?id=8438

然而,通过一些hack/变通方法仍然有可能实现期望的行为。例如,您可以直接在安装步骤开始时运行make tool。

所以使用风险自负:

add_custom_target(hack ${CMAKE_COMMAND} -E echo "Hacking install target")
if("${CMAKE_GENERATOR}" MATCHES Make)
    install(CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} hack WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")")
endif()

我在我的CMakeList.txt中改变了一点,以便在Linux和Windows上构建

install(CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} hack WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")") endif()

这是我的解决方案。它不会总是"ALL"构建文档,只有当doc或install target是必需的(在Visual Studio上,当install项目被编译时)。这个解决方案并不完整。例如,它不能与MinGW一起工作,但是…

set( DOXYFILE_OUTPUT_DIR ${PROJECT_BINARY_DIR}/doc )
#-- Configure the Template Doxyfile
configure_file(Doxyfile.in ${PROJECT_BINARY_DIR}/Doxyfile  @ONLY IMMEDIATE)
#-- Add a custom target to run Doxygen
add_custom_target (doc
    COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile
    SOURCES ${PROJECT_BINARY_DIR}/Doxyfile
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
if(WIN32)
    install(
        CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} /Build Debug ABIHex.sln /project doc.vcproj
                              WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")"
    )
else(WIN32)
    install(
        CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} --build --target doc
                              WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")"
    )
endif(WIN32)

希望对某人有用。

问候,亚历克斯

最新更新