如何告诉CMake安装目录取决于虚假目标?

时间:2011-10-05 08:41:02

标签: dependencies install cmake target

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

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

Doxyfile告诉Doxygen在${CMAKE_BINARY_DIR}/doc发布文档。

如果我在构建目录中执行此操作:

make doc
cpack

事情很好,因为第一行创建了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也不起作用。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

您可能需要ALL关键字:

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

<强>更新

目前,cmake没有提供向其内置目标添加自定义依赖项的选项(例如allinstalltest等)。它似乎不会在不久的将来提供此选项 - 请参阅http://public.kitware.com/Bug/view.php?id=8438

然而,仍然可以通过一些黑客/解决方法来实现期望的行为。例如,您可以在安装步骤开始时直接运行make工具。

所以自行承担风险

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()

答案 1 :(得分:1)

我在CMakeList.txt中对此进行了一些更改,以便在Linux和Windows上构建

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

这是我的解决方案。它始终没有构建文档&#34; ALL&#34;仅当需要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)

希望它对某人有用。

此致 亚历