1
3
内部make创建一个有向无环图(DAG),其中每个节点都是目标,每个边都是先决条件关系。 Make选择一个起始节点作为(a)命令行上请求的目标,或(b)makefile中定义的第一个目标。 从那里make将首先遍历图形深度,从左到右。因此,给定这个生成文件:
make将这样行走DAG:
由于make首先构建叶节点,因此配方的实际调用(假设所有节点都已过期)将按以下顺序进行:
您可以用这个简单的makefile简单地证明这一点:
那么,并行性是如何形成的呢? 在并行构建中,make创建相同的DAG,并遵循相同的算法对其进行遍历。最大的区别是当make决定建立一个目标时会发生什么。在非并行构建中,make将调用配方并等待其结束,然后转到下一个。 在并行构建中(假设不是无限作业),make将首先获得jobserver令牌。如果它不能,它就会睡觉等一个。如果可以,它会调用该目标的配方,但不会等待,而是返回其算法并转到DAG中的下一个节点,即同级节点。如果没有兄弟姐妹,我们会回到父母那里看看 那个 具有要生成的兄弟(make无法生成父级,因为子级尚未完成)。通过DAG等。如果它到达DAG的末尾,并且不是所有的事情都已经完成,那么make从头开始。 |
G_Hannigan · 移动嵌套文件的Makefile规则 6 年前 |
Peter Lenkefi · 强制make在同一环境中执行命令 6 年前 |
ms5991 · 没有规则使目标“bin/obj/list”。o' 6 年前 |
qweruiop · make命令前后的变量赋值 6 年前 |
Patrick Sanan · GNU Make:检查并行作业的数量 6 年前 |
kenorb · 如何在Makefile中输入父目录? 6 年前 |
ART · makefile中的条件检查 6 年前 |