1
比方说,我有几个目录,每个目录包含makefile
。现在让我们假设在这个dirs中有一个lib
dir(也有makefile
),并且在其他dirs的makefile
的某些中有一个引用。也就是说,有些项目依赖于另一项目。现在,如果我使用-j
选项运行make
实用程序,它可能会尝试使lib
处于两个或更多并行线程中。如何防止make实用程序同时执行相同的目标?
问题很简单:如何防止这种行为?
比方说,我有几个目录,每个目录包含makefile
。现在让我们假设在这个dirs中有一个lib
dir(也有makefile
),并且在其他dirs的makefile
的某些中有一个引用。也就是说,有些项目依赖于另一项目。现在,如果我使用-j
选项运行make
实用程序,它可能会尝试使lib
处于两个或更多并行线程中。如何防止make实用程序同时执行相同的目标?
问题很简单:如何防止这种行为?
我认为最好的办法是使用.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
.NOTPARALLEL
如果.NOTPARALLEL被提及作为一个目标,那么这个调用使 将连续运行,即使“-j”选项中给出。任何 递归调用make命令仍将并行运行 (除非其makefile也包含此目标)。此目标的 上的任何先决条件都将被忽略。
.NOTPARALLEL 禁用并行模式。
.NO_PARALLEL .NOTPARALLEL的同义词,用于与其他pmake变体兼容。
您是否有一些测试情况来备份您的声明?如果依赖关系是正确和完整的(这对许多递归生成文件来说并不重要),那么使*不会构建目标多次。 – Vroomfondel