Dependencies 如何告诉CMake安装目录依赖于虚假目标?
如何在CMake中实现以下目标(使用版本2.8.5)?我有一个名为Dependencies 如何告诉CMake安装目录依赖于虚假目标?,dependencies,installation,cmake,target,Dependencies,Installation,Cmake,Target,如何在CMake中实现以下目标(使用版本2.8.5)?我有一个名为doc的自定义目标生成的文档,我希望在安装或打包时包含该文档的输出 add_custom_target( doc "${DOXYGEN_EXECUTABLE}" Doxyfile ) install( DIRECTORY ${CMAKE_BINARY_DIR}/doc DESTINATION doc ) Doxyfile告诉Doxygen将文档放在${CMAKE\u BINARY\u DIR}/doc上 如果在生成目录中执行此操
doc
的自定义目标生成的文档,我希望在安装或打包时包含该文档的输出
add_custom_target( doc "${DOXYGEN_EXECUTABLE}" Doxyfile )
install( DIRECTORY ${CMAKE_BINARY_DIR}/doc DESTINATION doc )
Doxyfile
告诉Doxygen将文档放在${CMAKE\u BINARY\u DIR}/doc
上
如果在生成目录中执行此操作:
make doc
cpack
一切正常,因为第一行创建了install
目标所依赖的目录
但是,如果我有一个新的构建(所以${CMAKE\u BINARY\u DIR}/doc
还不存在),并且我直接调用CPack:
cpack
然后它抱怨找不到${CMAKE\u BINARY\u DIR}/doc
:
CMake Error at <snip>/build/cmake_install.cmake:36 (FILE):
file INSTALL cannot find "<snip>/build/doc".
但是我仍然得到相同的CPack错误,在build目录中执行makedoc
也不起作用
因此,如果我在cpack
之前手动执行make doc
,它将与本文顶部的配置一起工作,但是我如何告诉cmake/cpackinstall
指令取决于自定义目标doc
,因此,在调用cpack
或makeinstall
时会自动生成文档
谢谢 您可能需要
ALL
关键字:
add_custom_target( doc ALL "${DOXYGEN_EXECUTABLE}" Doxyfile )
更新: 目前,cmake不提供向其内置目标添加自定义依赖项的选项(例如
all
,install
,test
,等等)。而且它似乎在不久的将来不会提供这种选择——参见
但是,通过一些黑客/变通方法仍然可以实现所需的行为。例如,您可以在安装步骤开始时直接运行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()
为了在Linux和Windows上构建,我在CMakeList.txt中对此做了一些更改
install(CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} hack WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")") endif()
这是我的解决方案。只有在需要doc或install目标时(在visualstudio上,编译安装项目时),它并不总是“全部”构建文档。
这个解决方案并不完整。例如,它将不适用于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)
希望它对某人有用
问候,,
Alex谢谢,这确实是一个可行的解决方案。但是,
ALL
关键字总是导致生成目标。在本例中,这不是问题,但我仍然对一个通用解决方案感兴趣,在该解决方案中,我可以在安装目标(隐式依赖于ALL
)和我的自定义目标之间添加一个显式依赖项。@ysnikraz我已经更新了答案。不幸的是,cmake没有明确的方法来设置自定义目标和内置目标之间的依赖关系。非常感谢您的更新和解决方案!刚刚测试过,效果很好。正是我要找的!
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)