假设我有这样的项目结构:
Root
+ ProjA
+ SubA.1
+ SubA.2
+ ProjB
+ SubB.1
+ SubB.2
我设置的依赖项是:
SubA.2 depends on SubA.1
ProjA depends on SubA.1 and SubA.2
ProjB depends on ProjA
我想在以make -jX
开头时使构建顺序看起来像这样:
1. SubA.1
2. SubA.2
3. SubB.1 SubB.2
但事实是:
1. SubA.1 SubB.1 SubB.2
2. SubA.2
似乎ProjB => ProjA
无法用于SubB
之后的所有SubA
构建。
如何在所有SubB
完成后完成所有SubA
的构建?
答案 0 :(得分:2)
在CMake中,依赖关系只能按目标设置。
您应该决定ProjB
是否依赖于ProjA
的内部。通过" internals"我的意思是目标的名称,CMake变量的值等等。
ProjB
实际上需要ProjA
的内部,您可以仔细确定ProjA
的一个或另一个目标所需的ProjB
目标,并且只需要设置依赖。构建ProjA
的这种方式可以与ProjB
make -j
交错,但构建将是正确的。,如果SubB.1
是可执行的,需要SubA.1
库进行链接,那么
target_link_libraries(SubB.1 SubA.1)
自动设置所需的依赖项。
如果使用可执行文件SubB.2
生成SubA.2
,则使用
add_custom_command(OUTPUT <subB.2_file>
COMMAND SubA.2 <args>
)
将自动设置所需的依赖项。
ProjB
无法了解ProjA
的内部内容,并且只知道ProjB
只有在ProjA
已构建时才能构建,那么您可以使用ExternalProject_Add
构建两个项目并在创建的目标之间设置依赖关系:<强>的CMakeLists.txt 强>:
ExternalProject_Add(ProjA ...)
ExternalProject_Add(ProjB ...)
# Now `ProjA` and `ProjB` are targets in top-level project.
add_dependencies(ProjB ProjA)