我有一个shell程序,可以从一个源文件生成3个文件。例如,我可以进行文件制作'接收输入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
如果我在没有-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 $<
但我没有得到更好的结果。
有任何帮助吗?
答案 0 :(得分:1)
当您编写原始makefile时,您没有告诉输出文件是否共享任何关系,因此无法知道它们已经构建过,因此每次都必须尝试构建每个。
您修改后的想法是正确的想法,但不幸的是,make并未将此类定义解释为指示单个命令将生成所有文件,而是将其视为a way to build each individual file (written in a compact shorthand)。
具有多个目标的规则相当于编写许多规则 有一个目标,除此之外都是相同的。
判断N输出文件是从1规则体生成的唯一方法是使用multiple pattern rules
模式规则可能有多个目标。与普通规则不同,这个 不具有相同先决条件的许多不同规则 食谱。如果模式规则有多个目标,make就知道了 规则的配方负责制定所有目标。食谱 只执行一次以制作所有目标。搜索时 模式规则匹配目标,规则的目标模式其他 比匹配需要规则的目标的是偶然的: 只关心给文件的配方和先决条件 目前有问题。但是,当运行此文件的配方时, 其他目标被标记为已自行更新。