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

2023-12-25

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

In the 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)

问题是我希望这里发生三件事:

  1. if part.out不存在,需要生成
  2. if part.out已过期 (part.srcpart.out)我想让它重新生成
  3. if full.out已过期 (part.outfull.out, or full.out不存在)我希望它是(重新生成

所以如果我添加DEPENDS ./details/part.out to add_custom_command(OUTPUT full.out)我将实现第 2 点和第 3 点,但不会实现第 1 点,因为如果我删除part.out然后我打电话make full_out我会收到一个错误,提示没有规则可制定./details/part.out(因为它是来自另一个目录的规则)。

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

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


CMake 文档用于add_custom_target http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:add_custom_target:

默认情况下,没有任何内容取决于自定义目标。使用ADD_DEPENDENCIES 添加与其他目标的依赖关系。

所以我建议将目标“连接”

ADD_DEPENDENCIES( full_out part_out )

EDIT: 工作示例

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

这是我的工作示例(在 Windows 下使用 VS2008 进行了尝试):

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 个案例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake、add_custom_command 以及来自不同目录的依赖项 的相关文章

随机推荐