Parallel processing 同时创建多个目标的并行GNU make和规则

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的最新

在我的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:
        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 $@