Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependencies 如何告诉CMake安装目录依赖于虚假目标?_Dependencies_Installation_Cmake_Target - Fatal编程技术网

Dependencies 如何告诉CMake安装目录依赖于虚假目标?

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上 如果在生成目录中执行此操

如何在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

如果在生成目录中执行此操作:

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/cpack
install
指令取决于自定义目标
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)