具有多个作业-j和子目录的makefile

时间:2013-04-01 13:43:19

标签: makefile

想象一下,你有一个使用“make -c”构建子目录的make文件。图像你有4个目标目录。完成4个中的3个,需要运行1个。使用以下命令运行整个makefile:

make -j 4

有没有办法告诉makefile系统使用make -c -j 4而不是1来运行剩余的目标?如果两个目标丢失,我想为每个目标制作-c -j 2。

2 个答案:

答案 0 :(得分:3)

我将扩展Beta(正确)答案。当您使用-jN时,所有单个make进程都相互通信,并保证在所有不同的make调用中运行的N个作业永远不会超过N个。同时,他们总是保证(假设至少有N个作业可以在所有的make调用中运行),N个作业将一直在运行。

假设您有4个目录,其中有"要做的事情",不管怎么说你可以知道先验,所以不要用-j4调用make的一个实例,而是让它调用通常,4个子制作器会强制使用-j1调用每个子制作。现在假设第一个目录有10个目标已过期,第二个目录有5个,第三个有20个,第四个有100个过时目标。首先,您有4个并行运行的作业。然后,一旦构建了第二个目录的5个目标,您只有3个并行运行的作业,然后是2个,然后对于第四个目录的其余构建,您将只在一个目标上构建一个目标。时间,没有平行。那不太好。

GNU make的工作方式,相反,make的所有四个实例都在进行通信。当第二个目录完成后,它运行的作业可用于其他目录等。在构建结束时,第四个目录一次构建四个作业。那更好。

也许如果你解释为什么你想要这样做,那么对我们构建答案会更有帮助。

答案 1 :(得分:1)

自动制作句柄。来自the manual

  

如果将[-j]设置为某个数字值“N”和您的操作系统   支持它...父制作和所有子制作将进行通信   确保只有'N'个作业同时运行   在他们之间。