假设我有一些输入文件sheet[n].in
。对于每个输入文件,我想生成两个输出文件sheet[n].out
和solved[n].out
。我写了这个Makefile:
SOURCES = sheet1.in
OUT = $(SOURCES:.in=.out)
SOLVED = $(patsubst sheet%,solved%,$(OUT))
sheets: ${OUT}
solvedsheets: ${SOLVED}
all: sheets solvedsheets
sheet%.out: sheet%.in
cat $< > $@
solved%.out: sheet%.in
cat <% > $@
echo "solved!" >> $@
debug:
@echo "OUT = ${OUT}"
@echo "SOLVED = ${SOLVED}"
我用一些包含一些文本的虚拟sheet1.in
文件测试它。运行make
时,它会生成sheet1.out
,但不生成solved1.out
。 make debug
收益:
OUT = sheet1.out
SOLVED = solved1.out
我可以删除solved%.out
的规则,并且甚至不会抱怨缺少规则。它似乎只是忽略SOLVED
列表作为必要的输出文件。那是为什么?
答案 0 :(得分:1)
当您输入没有规则的make
时,Make会运行文件中找到的第一个非模式规则。因此,只会调用您的sheets
规则。
您有两个简单的解决方案:
all
规则作为Makefile中的第一条规则; make all
而非make
。简化且更健壮的Makefile:
SOURCE := $(wildcard *.in)
OUTPUT := $(SOURCE:.in=.out) $(SOURCE:sheet%.in=solved%.out)
.PHONY: all
all: $(OUTPUT)
sheet%.out: sheet%.in
cat $< > $@
solved%.out: sheet%.in
cat <% > $@
echo "solved!" >> $@