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

Mic*_*iak 12 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)
Run Code Online (Sandbox Code Playgroud)

在主目录中有一个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)
Run Code Online (Sandbox Code Playgroud)

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

  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是再生一个full.out不会再生,因为它不依赖于part.out文件本身.

那么如何连接两种方案呢?我正在考虑添加两者,DEPENDS但我怎么知道这是否总能奏效?我的意思是在这种情况下,构建顺序在这里很重要.

Joh*_* S. 24

CMake文档add_custom_target:

默认情况下,不依赖于自定义目标.使用ADD_DEPENDENCIES向其他目标添加依赖项或从其他目标添加依赖项.

所以我建议用"连接"目标

ADD_DEPENDENCIES( full_out part_out )
Run Code Online (Sandbox Code Playgroud)

编辑: 工作示例

事实证明,您需要为其设置源文件属性 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 )
Run Code Online (Sandbox Code Playgroud)

细节/的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)
Run Code Online (Sandbox Code Playgroud)

这个例子适用于所有3个陈述的案例.