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

Jef*_*ica 5 cmake

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

我需要强制项目之间的构建顺序。它曾经是:

=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo2 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
Run Code Online (Sandbox Code Playgroud)

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

# don't change the library order, it will break xyz  
target_link_libraries(foo3 other1 foo2 other2 foo1 other3)
Run Code Online (Sandbox Code Playgroud)

正如你可以猜到的,在我的改变之后,我现在得到了

=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
Run Code Online (Sandbox Code Playgroud)

并且foo3由于foo2未复制/安装/任何标头而无法构建。我很确定如果我可以在问题解决foo2之前强制 CMake 触发。foo3

但是,我尝试过:

target_link_libraries(foo3 foo2)
Run Code Online (Sandbox Code Playgroud)

无济于事。我仍然看到foo3之前的触发器foo2

我也尝试过

add_dependencies(foo3 foo2)
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

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

Lot*_*har 4

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

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

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

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

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