Parallel processing Makefile-j做了一些无用的事情

Parallel processing Makefile-j做了一些无用的事情,parallel-processing,makefile,Parallel Processing,Makefile,我有一个shell程序,从一个源文件生成3个文件。例如,我可以使用“makedocumentation”,它接收输入foo.tex,并生成foo.pdf、foo.dvi和foo.ps 由于性能问题,我不得不使用-j8选项调用我的Makefile 使用此示例文件: names = a b src = $(addsuffix .def,$(names)) a = $(patsubst %.def,%.inc,$(src)) b = $(patsubst %.def,%.asm,$(src)) c

我有一个shell程序,从一个源文件生成3个文件。例如,我可以使用“makedocumentation”,它接收输入
foo.tex
,并生成
foo.pdf
foo.dvi
foo.ps

由于性能问题,我不得不使用-j8选项调用我的Makefile

使用此示例文件:

names = a b 
src = $(addsuffix .def,$(names))

a = $(patsubst %.def,%.inc,$(src))
b = $(patsubst %.def,%.asm,$(src))
c = $(patsubst %.def,%.h,$(src))

obj = $(a) $(b) $(c)

command= cp $(1) $(basename $(1)).inc; \
         cp $(1) $(basename $(1)).asm; \
         cp $(1) $(basename $(1)).h

all: $(obj)

init: clean $(src) 

$(src): %:
    touch $@

$(a): %.inc: %.def
    $(call command, $<)

$(b): %.asm: %.def
    $(call command, $<)

$(c): %.h: %.def
    $(call command, $<)

clean: 
    -rm -f *.def
    -rm -f *.inc
    -rm -f *.asm
    -rm -f *.h  
在另一种情况下:

$ make -j8
cp  a.def a.inc;  cp  a.def a.asm;  cp  a.def a.h
cp  b.def b.inc;  cp  b.def b.asm;  cp  b.def b.h
cp  a.def a.inc;  cp  a.def a.asm;  cp  a.def a.h
cp  b.def b.inc;  cp  b.def b.asm;  cp  b.def b.h
cp  a.def a.inc;  cp  a.def a.asm;  cp  a.def a.h
cp  b.def b.inc;  cp  b.def b.asm;  cp  b.def b.h
我们可以观察到,在并行模式下,make会重新生成已经存在的文件

我想避免它

我也试过这样的方法:

a.inc a.asm a.h: a.def
   command $<
a.inca.asm a.h:a.def
命令$<
但我没有得到更好的结果


有什么帮助吗

在编写原始makefile时,您没有告诉make输出文件共享任何关系,因此它无法知道它们已经生成,因此每次都必须尝试生成每个文件

您修改后的想法是正确的,但令人遗憾的是make没有将这种定义解释为指示单个命令将生成所有文件,而是将其视为

具有多个目标的规则相当于编写多个规则,每个规则 只有一个目标,除此之外,所有目标都是一样的

告诉make N个输出文件是从1个规则体生成的唯一方法是

模式规则可能有多个目标。与正常规则不同,这 在相同的先决条件和条件下,不会执行许多不同的规则 配方如果模式规则有多个目标,make知道 规则的配方负责生成所有目标。食谱 仅执行一次以生成所有目标。在搜索 模式规则匹配一个目标,另一个规则的目标模式 与需要规则的目标匹配的规则是偶然的: 只担心给文件提供配方和先决条件 目前正在讨论中。但是,当运行此文件的配方时 其他目标被标记为自己已更新


不幸的是,我已经用类似于
$(srcs):%.inc%.asm%.h:%.def
的东西尝试了您所称的多模式规则,但是make不允许在我有多模式的情况下使用语法Target:pattern:Deps。或者可能有一个更新版本的make支持这种语法。我不相信你能用静态模式规则做到这一点,不。只有一个隐式模式规则(没有限制LHS的)。所以
%.inc%.asm%.h:%.def
。我认为这不应该是一个问题,除非该规则应该应用到的文件也在该其他静态模式规则的明确目标列表中。
a.inc a.asm a.h: a.def
   command $<