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

时间:2010-03-02 22:19:54

标签: makefile

从手册页:

  

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

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

我想知道如何构建此图表并了解所使用的标准。

感谢。

2 个答案:

答案 0 :(得分:24)

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

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

然后在图表上执行topological sort以确定执行顺序。来自维基百科:

  

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

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

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

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

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

答案 1 :(得分:3)

我怀疑你期待的东西比实际上更神奇。 Makefile包含如下行:

target: prereq1 prereq2 prereq3 ...

这定义了系统中文件之间的关系;在图形说法中,行上每个以空格分隔的单词隐式声明图中的节点,并在冒号左侧的每个节点之间创建有向边,并在冒号右侧创建每个节点从后者指向前者。

从那里可以通过遍历图形来查找没有传入边缘的节点并执行与这些节点关联的命令,然后从那里“回”图形。

希望有所帮助。