2011-10-05 44 views
3

如何在CMake中实现以下功能(使用版本2.8.5)?我有一个由名为doc的自定义目标生成的文档,我希望在安装或CPacking时将其输出。如何告诉CMake安装目录取决于伪目标?

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

Doxyfile告诉Doxygen的放出来的文档在${CMAKE_BINARY_DIR}/doc

如果我做这个build目录:

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 doccpack手动将其与配置工作在这个岗位上,但我怎么能告诉cmake的/ cpack的install指令依赖于自定义的目标doc,使建筑的文档发生自动拨打电话cpackmake install

谢谢!

回答

2

也许你需要ALL关键字:

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

更新:

目前CMake的不提供一个选项,以自定义的依赖关系添加到其内置的目标(如allinstall,test等)。而且它似乎不会在不久的将来提供此选项 - 请参阅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() 
+0

谢谢,这确实是一个可能的解决方案。但是,'ALL'关键字始终会导致目标被建立。在这种情况下,这不是问题,但我仍然对通用解决方案感兴趣,我可以在安装目标(隐含地取决于'ALL')和我的自定义目标之间添加显式依赖关系。 –

+0

@ysnikraz我已经更新了我的答案。不幸的是,cmake没有明确的方式来设置定制和内置目标之间的依赖关系。 –

+0

非常感谢您的更新和解决方法!只是测试它,它运作良好。正是我在找什么! –

1

我已经以建立在Linux和Windows

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

改变这个有点在我CMakeList.txt这是我的解。只有在需要doc或安装目标时,才会生成始终为“ALL”的文档(在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) 

希望它会对某人有用。

Regards, Alex

相关问题