如何在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
,以便在调用cpack
或make install
时自动生成文档?
谢谢!
答案 0 :(得分:2)
您可能需要ALL
关键字:
add_custom_target( doc ALL "${DOXYGEN_EXECUTABLE}" Doxyfile )
<强>更新强>
目前,cmake没有提供向其内置目标添加自定义依赖项的选项(例如all
,install
,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()
答案 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)
希望它对某人有用。
此致 亚历