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

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

在详细信息子目录中,有一个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)

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

>如果part.out不存在,则需要生成
>如果part.out已过期(part.src比part.out更新)我想重新生成
>如果full.out已过期(part.out比full.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,也不会重新生成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个陈述的案例.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...