Makefile -j确实没用

时间:2014-05-08 12:29:27

标签: parallel-processing makefile

我有一个shell程序,可以从一个源文件生成3个文件。例如,我可以进行文件制作'接收输入foo.tex并生成foo.pdffoo.dvifoo.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  

如果我在没有-j的情况下运行它,我会得到:

$ make
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 -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

我们可以观察到在并行模式下,重新生成已经存在的文件。

我想避免它...

我也尝试过这样的事情:

a.inc a.asm a.h: a.def
   command $<

但我没有得到更好的结果。

有任何帮助吗?

1 个答案:

答案 0 :(得分:1)

当您编写原始makefile时,您没有告诉输出文件是否共享任何关系,因此无法知道它们已经构建过,因此每次都必须尝试构建每个。

您修改后的想法是正确的想法,但不幸的是,make并未将此类定义解释为指示单个命令将生成所有文件,而是将其视为a way to build each individual file (written in a compact shorthand)

  

具有多个目标的规则相当于编写许多规则   有一个目标,除此之外都是相同的。

判断N输出文件是从1规则体生成的唯一方法是使用multiple pattern rules

  

模式规则可能有多个目标。与普通规则不同,这个   不具有相同先决条件的许多不同规则   食谱。如果模式规则有多个目标,make就知道了   规则的配方负责制定所有目标。食谱   只执行一次以制作所有目标。搜索时   模式规则匹配目标,规则的目标模式其他   比匹配需要规则的目标的是偶然的:   只关心给文件的配方和先决条件   目前有问题。但是,当运行此文件的配方时,   其他目标被标记为已自行更新。