如何防止make实用程序同时执行相同的目标?

时间:2017-10-06 08:20:04

标签: makefile

我们说我有几个目录,每个目录都包含一个int a=2, b=3; int *p1 = &(a+b); // Wrong int &&r1 = a+b; // OK, but the result is no longer an rvalue int *p2 = &r1; // OK 。现在让我们说这个目录中有一个makefile目录(也有lib),并且在其他目录的某些makefile中有一个引用它。即,有一些项目依赖于另一项。现在,如果我使用makefile选项运行make实用程序,它可能会尝试在两个或多个并行线程中生成-j

问题很简单:如何防止这种行为?

1 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是使用.NOTPARALLEL

a:
    @echo a
    @sleep 1
    @echo end a

b:
    @echo b
    @sleep 1
    @echo end b

.NOTPARALLEL:

没有.NOTPARALLEL

$  gmake a b -j 2
a 
b
end a
end b

使用.NOTPARALLEL

$ gmake a b -j 2
a 
end a 
b 
end b

GNU make's documentation

  

.NOTPARALLEL

     

如果提到.NOTPARALLEL作为目标,则调用make   即使给出了'-j'选项,也会连续运行。任何   递归调用make命令仍将并行运行配方   (除非它的makefile也包含这个目标)。任何先决条件   这个目标被忽略了。

FreeBSD's make documentation

  

.NOTPARALLEL     禁用并行模式。

     

.NO_PARALLEL     .NOTPARALLEL的同义词,用于与其他pmake变体兼容。