1

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

使-j 4

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

4

2 回答 2

3

我将扩展 Beta 的(正确)答案。当您使用-jN. 同时,它们始终保证(假设至少有 N 个作业可能在所有 make 调用中运行),N 个作业将始终运行。

相反,假设您有 4 个目录与“有事做”,不知何故您可以先验地知道,因此不是调用 make 的一个实例-j4并让该 make 正常调用 4 个 submake,而是强制每个 submake用 调用-j1。现在假设第一个目录有 10 个过期的目标,第二个有 5 个,第三个有 20 个,第四个有 100 个过期的目标。起初,您有 4 个作业并行运行。然后,一旦构建了第二个目录的 5 个目标,您就只有 3 个并行运行的作业,然后是 2 个,然后对于第四个目录的其余构建,您一次只能构建一个目标,并且没有并行性。这可不太好。

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

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

于 2013-04-02T13:08:58.430 回答
1

自动制作手柄。从手册

如果您将 [-j] 设置为某个数值“N”并且您的操作系统支持它...父品牌和所有子品牌将进行通信以确保只有“N”个作业同时运行商场。

于 2013-04-01T14:17:01.870 回答