gpt4 book ai didi

cmake、add_custom_command 与来自不同目录的依赖项

转载 作者:行者123 更新时间:2023-12-04 00:28:03 27 4
gpt4 key购买 nike

我有一个关于 CMake 的问题,这似乎在这里很常见,但似乎没有一个答案能解决我的问题。

details子目录,有一个CMakeLists.txt其中包含:

add_custom_command(OUTPUT part.out
COMMAND foo --input=part.src --output=part.out
DEPENDS part.src)

add_custom_target(part_out
DEPENDS part.out)

在主目录中有一个 CMakeLists.txt使用 part.out用于生成另一个文件:
add_custom_command(OUTPUT full.out
COMMAND bar --input=./details/part.out --output=full.out)

add_custom_target(full_out
DEPENDS full.out)

问题是我希望在这里发生 3 件事:
  • 如果 part.out不存在需要生成
  • 如果 part.out已过时( part.srcpart.out 新)我希望它重新生成
  • 如果 full.out已过时( part.outfull.out 新,或 full.out 不存在)我希望它被(重新)生成

  • 所以如果我添加 DEPENDS ./details/part.outadd_custom_command(OUTPUT full.out)我将实现第 2 点和第 3 点,但不会实现第 1 点,因为如果我删除 part.out然后我调用 make full_out我会得到一个错误,说没有规则可以做 ./details/part.out (因为它是来自另一个目录的规则)。

    如果我添加 DEPENDS full_outadd_custom_command(OUTPUT full.out)或到 add_custom_target(full_out)我会达到第 1 点和第 2 点,但不会达到第 3 点,因为即使 part.out重生了,一个 full.out不会重新生成,因为它不依赖于 part.out文件本身。

    那么如何连接这两个场景呢?
    我正在考虑添加 DEPENDS但我怎么知道这是否总是有效?我的意思是在这种情况下,构建的顺序在这里很重要。

    最佳答案

    CMake docs for add_custom_target :

    By default nothing depends on the custom target. Use ADD_DEPENDENCIES to add dependencies to or from other targets.



    所以我建议“连接”目标
    ADD_DEPENDENCIES( full_out part_out )

    编辑:
    工作示例

    事实证明,您需要为 part.out 设置源文件属性。

    这是我的工作示例(在带有 VS2008 的 Windows 下尝试):

    CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8 )
    project( full )

    add_subdirectory( details )

    add_custom_command( OUTPUT full.out
    COMMAND ${CMAKE_COMMAND} -E copy ./details/part.out full.out
    DEPENDS details/part.out
    )


    add_custom_target( full_out
    DEPENDS full.out details/part.out details/part.src
    )


    set_source_files_properties( details/part.out PROPERTIES GENERATED TRUE )


    add_dependencies( full_out part_out )

    详细信息/CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8 )
    project(part)

    add_custom_command(OUTPUT part.out
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/part.src part.out
    DEPENDS part.src)

    add_custom_target(part_out
    DEPENDS part.out)

    此示例适用于您陈述的所有 3 个案例。

    关于cmake、add_custom_command 与来自不同目录的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13470499/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com