2012-11-20 78 views
8

我有一个关于CMake的问题,这似乎在这里经常被问到,但没有一个答案似乎解决了我的问题。cmake,add_custom_command来自不同目录的依赖关系

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) 

在主目录存在使用part.out用于生成另一个文件中的CMakeLists.txt

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.outfull.out更新,或full.out desn't存在),我希望它是产生

所以,如果我添加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但我怎么知道这是否会始终工作?我的意思是在这种情况下,构建顺序在这里很重要。

回答

22

CMake docs for 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说明的情况。

+1

好吧,我知道如何连接目标。问题是当我看到一个文件(这是来自另一个目录**的另一个自定义命令**的结果)发生更改时,如何使custom_command的输出得到重建 –

+1

@MichałWalenciak嗯。看到我的解决方案的扩展答案。 –

+0

thx,现在很好:) –