12

我有一个关于 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 件事:

  1. 如果part.out不存在则需要生成
  2. 如果part.out过时(part.src比更新part.out)我希望它被重新生成
  3. 如果full.out过时(part.out比 更新full.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重新生成,afull.out也不会重新生成,因为它不依赖于part.out文件本身。

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

4

1 回答 1

25

CMake 文档add_custom_target

默认情况下,没有任何东西取决于自定义目标。使用 ADD_DEPENDENCIES 将依赖项添加到其他目标或从其他目标添加依赖项。

所以我建议将目标与

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

于 2012-11-20T13:20:30.930 回答