2017-10-06 35 views
1

比方说,我有几个目录,每个目录包含makefile。现在让我们假设在这个dirs中有一个lib dir(也有makefile),并且在其他dirs的makefile的某些中有一个引用。也就是说,有些项目依赖于另一项目。现在,如果我使用-j选项运行make实用程序,它可能会尝试使lib处于两个或更多并行线程中。如何防止make实用程序同时执行相同的目标?

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

+1

您是否有一些测试情况来备份您的声明?如果依赖关系是正确和完整的(这对许多递归生成文件来说并不重要),那么使*不会构建目标多次。 – Vroomfondel

回答

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被提及作为一个目标,那么这个调用使 将连续运行,即使“-j”选项中给出。任何 递归调用make命令仍将并行运行 (除非其makefile也包含此目标)。此目标的 上的任何先决条件都将被忽略。

FreeBSD's make documentation

.NOTPARALLEL 禁用并行模式。

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

相关问题