【问题标题】:parallel GNU make and rules that create several targets at once一次创建多个目标的并行 GNU make 和规则
【发布时间】:2013-06-17 10:50:53
【问题描述】:

我的 GNU makefile(以及其他)中有几条格式规则

a b c d: x
        program $^

program 只需一次调用即可创建文件 a、b、c 和 d。 当我使用gmake -j 4 运行此程序时,make 会产生四个并行运行的program,因为这些文件都不存在并且没有一个文件依赖于另一个。

我可以通过提供“假依赖链”来解决这个问题(因为没有更好的术语):

a: x
        program $^
b: a
c: b
d: c

有没有更优雅的方法来教 gmake 只运行一次 program,即使是在并行构建中?

编辑:任何解决方案都应遵守对x 的依赖,并且如果a - d 相对于x 是最新的,则不执行任何操作。

【问题讨论】:

    标签: parallel-processing makefile gnu-make


    【解决方案1】:

    如果您的目标都共享一个共同的词干,那么您可以使用模式规则:

    %.a %.b %.c %.d:
            touch $*.a $*.b $*.c $*.d
    

    如果他们不这样做,那么您唯一能做的就是创建一个哨兵文件:

    a b c d: .sentinel ;
    .sentinel: ; touch a b c d $@
    

    【讨论】:

    • 不,词干不同。但我尝试将假依赖链压缩为b c d: a,这似乎奏效了。有保证吗?我会说是的,因为必须首先创建a,并且当程序完成时,b、c 和 d 已经创建,无需进一步调用。我忽略了什么吗?
    • 这些方法的问题是,如果你删除c而不删除ac将不会被重建,因为没有规则知道如何构建c。跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多