【问题标题】:Cannot produce two files from same input with make无法使用 make 从相同的输入生成两个文件
【发布时间】:2016-10-13 18:37:41
【问题描述】:

假设我有一些输入文件sheet[n].in。对于每个输入文件,我想生成两个输出文件,sheet[n].outsolved[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.outmake debug 产量:

OUT = sheet1.out
SOLVED = solved1.out

我可以删除 solved%.out 的规则,并且 make 甚至不会抱怨缺少规则。似乎只是忽略了 SOLVED 列表作为必要的输出文件。这是为什么呢?

【问题讨论】:

    标签: makefile


    【解决方案1】:

    当你在没有规则的情况下输入make 时,Make 将运行在文件中找到的第一个 non-pattern 规则。因此只会调用您的 sheets 规则。

    那么你有两个简单的解决方案:

    1. all 规则设为 Makefile 中的第一条规则;
    2. 请致电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!" >> $@
    

    【讨论】:

    • 哇哦。这些年来我一直在使用它,只是假设如果没有参数它会调用all
    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多