Parallel processing 同时创建多个目标的并行GNU make和规则
在我的GNU makefile中(除其他外)有几个表单规则Parallel processing 同时创建多个目标的并行GNU make和规则,parallel-processing,makefile,gnu-make,Parallel Processing,Makefile,Gnu Make,在我的GNU makefile中(除其他外)有几个表单规则 a b c d: x program $^ i、 e.程序只需一次调用即可创建文件a、b、c和d。 当我用gmake-j4运行这个程序时,make生成四个程序并行运行,因为没有一个文件存在,也没有一个文件依赖于另一个文件 我可以通过提供一个“假依赖链”(缺少更好的术语)来解决这个问题: 有没有更优雅的方法教gmake只运行一次程序,即使是在并行构建中 编辑:任何解决方案都应该遵守对x的依赖关系,如果a-d是关于x的最新
a b c d: x
program $^
i、 e.程序
只需一次调用即可创建文件a、b、c和d。
当我用gmake-j4
运行这个程序时,make生成四个程序
并行运行,因为没有一个文件存在,也没有一个文件依赖于另一个文件
我可以通过提供一个“假依赖链”(缺少更好的术语)来解决这个问题:
有没有更优雅的方法教gmake只运行一次程序
,即使是在并行构建中
编辑:任何解决方案都应该遵守对
x
的依赖关系,如果a-d
是关于x的最新版本,则什么也不做。如果您的目标都有一个共同的茎,那么您可以使用模式规则:
%.a %.b %.c %.d:
touch $*.a $*.b $*.c $*.d
如果他们没有,那么你唯一能做的就是创建一个sentinel文件:
a b c d: .sentinel ;
.sentinel: ; touch a b c d $@
不,茎是不同的。但是我试着将伪依赖链压缩到bcd:a
,这似乎奏效了。保证会吗?我会说是的,因为a
必须首先生成,并且当程序完成时,b、c和d已经生成,无需进一步调用。我忽略了什么吗?这些方法的问题是,如果您删除c
而不删除a
,c
将无法重建,因为没有规则知道如何构建c
。
a b c d: .sentinel ;
.sentinel: ; touch a b c d $@