cmake,add_custom_command具有来自不同目录的依赖项

时间:2012-11-20 09:50:03

标签: cmake

我有一个关于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)

问题是我想在这里发生三件事:

  1. 如果part.out不存在,则需要生成
  2. 如果part.out已过期(part.srcpart.out更新)我希望重新生成
  3. 如果full.out已过期(part.outfull.out更新,或full.out不存在),我希望(重新)生成

    因此,如果我将DEPENDS ./details/part.out添加到add_custom_command(OUTPUT full.out),我将获得第2点和第3点,但不会获得第1点,因为如果我删除了part.out,那么我会调用make full_out我会收到一个错误,即没有规则可以./details/part.out(因为它是来自另一个目录的规则)。

    如果我将DEPENDS full_out添加到add_custom_command(OUTPUT full.out)add_custom_target(full_out),我将获得第1点和第2点,但不是3,因为即使重新生成part.out,也会{ {1}}将不会重新生成,因为它不依赖于full.out文件本身。

    那么如何连接两种方案呢? 我正考虑添加两个part.out,但我怎么知道这是否一直有效?我的意思是在这种情况下,构建的顺序在这里很重要。

1 个答案:

答案 0 :(得分:24)

CMake docs for add_custom_target

  

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

所以我建议用

“连接”目标
ADD_DEPENDENCIES( full_out part_out )

编辑: 工作示例

事实证明,您需要为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个案例。