如何在 CMake 中强制目标构建的顺序

How to force the order of target builds in CMake

我刚刚继承了一大堆用 CMake 构建的项目。我的 CMake 知识为零,我怀疑以前的维护者也有同样的知识。

我需要强制项目之间的构建顺序。以前是:

1
2
3
=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo2 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...

我必须添加一个项目和依赖项(在不同的目标而不是上面的目标中)。但是代码中充满了

1
2
# don't change the library order, it will break xyz  
target_link_libraries(foo3 other1 foo2 other2 foo1 other3)

你可以猜到,经过我的修改,我现在得到了

1
2
=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...

并且 foo3 不会构建,因为 foo2 标头没有被复制/安装/无论如何。我很确定如果我可以强制 CMake 在 foo3 之前触发 foo2 问题就会得到解决。

但是,我试过了:

无济于事。我仍然在 foo2.

之前看到 foo3 触发器

我也试过

1
add_dependencies(foo3 foo2)

所以,我的问题:

  • 我可以看到 CMake 必须在内部构建的依赖关系图吗?
  • 如果某个地方碰巧有一个循环,我怎么知道并找到它?
  • 我可以强制目标构建的顺序吗?
  • 构建顺序还有其他问题吗?


CMake 是一个声明式构建系统。

虽然您在 CMakeLists.txt 文件中编写的 cmake 程序是纯命令式执行的,但它构建的构建系统是声明性的。

这意味着您无法控制目标的构建顺序。您指定要完成的工作,但不指定如何完成。那是抽象出来的。

唯一的方法是在目标中添加依赖项。首先在依赖目标构建之前构建所有依赖目标。

您可以通过 "target_link_libraries" 和 "target_sources" 等命令添加依赖项。您可以使用非常通用的"add_dependencies"添加更多非基本 C/C 编程相关文件。