make"-j"选项如何实际工作?

LB4*_*B40 21 makefile

从手册页:

-j [jobs], - job [= jobs]指定要同时运行的作业(命令)数.如果有多个-j选项,则最后一个选项有效.如果在没有参数的情况下给出-j选项,make将不会限制可以同时运行的作业数.

我知道它使用图依赖来知道哪些规则是独立的.

我想知道这个图是如何构建的,并了解使用的标准是什么.

谢谢.

Joh*_*ica 26

正如人们所料,依赖图基于每个Makefile目标列出的先决条件.make将构建一个图形,其中目标和先决条件是顶点,并且从先决条件到其目标有一个有向边.通过这种方式,传入边数可以告诉您目标有多少先决条件.如果它没有传入边缘,那么它没有先决条件.

例如,.c.h文件的顶点将没有传入边.这些文件是您的源文件,不需要构建.

然后,它在图形上执行拓扑排序,以确定执行顺序.来自维基百科:

拓扑排序(拓扑顺序)的规范应用是调度一系列作业或任务; 拓扑排序算法最早是在20世纪60年代早期在PERT技术中用于项目管理中的调度(Jarnagin 1960).作业由顶点表示,如果在作业y开始之前必须完成作业x,则从x到y存在边缘(例如,洗衣服时,洗衣机必须在我们将衣服晾干之前完成).然后,拓扑排序给出了执行作业的顺序.

拓扑排序的要点是找到没有入边(没有依赖性)的顶点并将它们放在第一位.然后从图表中删除它们.现在,您将拥有一组新的顶点,没有传入边(没有依赖关系).那是下一个.等等,直到完成.(如果在没有这样的顶点时到达某个点,那么依赖图包含一个循环,这是一个错误条件.)

在典型的Makefile中,这意味着您将首先构建源文件(不需要做任何事情).然后是依赖于那些源文件的目标文件.然后从这些目标文件构建库和可执行文件.

在正常的非并行操作下,make每次迭代只需选择一个目标并构建它.当它是并行的时,它将尽可能多地获取无依赖目标并并行构建它们,直到允许的同时作业数量.

因此,当make到达目标文件步骤时,它将在图中具有大量顶点,这些顶点都没有传入边.它知道它可以并行构建目标文件,因此它会分离n个副本gcc来构建目标文件.