使用cmake跨不同目录的项目依赖项

时间:2016-01-27 05:38:59

标签: cmake

假设我有这样的项目结构:

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的构建?

1 个答案:

答案 0 :(得分:2)

在CMake中,依赖关系只能按目标设置。

您应该决定ProjB是否依赖于ProjA内部。通过" internals"我的意思是目标的名称,CMake变量的值等等。

  1. 如果ProjB实际上需要ProjA的内部,您可以仔细确定ProjA的一个或另一个目标所需的ProjB目标,并且只需要设置依赖。构建ProjA的这种方式可以与ProjB make -j交错,但构建将是正确的。
  2. ,如果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>
    )
    

    将自动设置所需的依赖项。

    1. 如果ProjB无法了解ProjA的内部内容,并且只知道ProjB只有在ProjA已构建时才能构建,那么您可以使用ExternalProject_Add构建两个项目并在创建的目标之间设置依赖关系:
    2. <强>的CMakeLists.txt

      ExternalProject_Add(ProjA ...)
      ExternalProject_Add(ProjB ...)
      # Now `ProjA` and `ProjB` are targets in top-level project.
      add_dependencies(ProjB ProjA)