如何在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
,以便在调用cpack
或make 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)
希望对某人有用。
问候,亚历克斯