如何在没有全局变量的情况下从CMake中的不同目录链接custom_targets?

时间:2018-01-27 22:10:36

标签: cmake

根据本教程(第5部分):

https://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/

  

不传播自定义目标的文件级依赖关系

因此,当我在链中有两个自定义目标时,第二个自定义命令应该同时依赖于第一个自定义目标第一个自定义命令输出

但是如果我在不同的子目录中有自定义目标会怎样。如何获取第一个目标生成的文件的路径?

project
├── gen1
│   └── CMakeLists.txt
├── gen2
│   └── CMakeLists.txt
└── CMakeLists.txt

gen1 CMakeLists.txt:

set(SPECIAL_TEXT foo)    
add_custom_command(
    OUTPUT gen1
    COMMAND cmake -E echo ${SPECIAL_TEXT} > gen1
    )

add_custom_target(
    gen1-wrapper
    DEPENDS gen1
    )

gen2 CMakeLists.txt:

add_custom_command(
    OUTPUT gen2
    DEPENDS gen1-wrapper **????????**
    COMMAND cmake -E copy gen1 gen2
    )

add_custom_target(
    all-generated ALL
    DEPENDS gen2
    )

top CMakeList.txt

add_subdirectory(gen2)
add_subdirectory(gen1)

是否可以在不引入全局变量的情况下传播依赖项?

2 个答案:

答案 0 :(得分:1)

生成的文件位于二进制目录结构中,与源目录结构as per the CMake docs.相同,因此您可以使用相对路径../gen1/gen1?我承认这不是一个非常强大的解决方案。

另一种方法是使用object libraries add_library(... OBJECT ...)和顶级生成器表达式,如下所示:

add_executable(... $<TARGET_OBJECTS:gen1> $<TARGET_OBJECTS:gen2>)

答案 1 :(得分:0)

使用cmake v 3.14.2可以正常工作。适用于我的特定设置:

add_custom_command(
  OUTPUT gen2
  COMMAND cmake -E copy gen1 gen2
)

add_custom_target(
    all-generated ALL
    DEPENDS gen1-wrapper gen2
)