2016-10-13 3 views
1

入力ファイルがあるとします(sheet[n].in)。各入力ファイルに対して、2つの出力ファイル、sheet[n].outsolved[n].outを生成したいと思います。makeで同じ入力から2つのファイルを生成できません

SOURCES = sheet1.in 
OUT = $(SOURCES:.in=.out) 
SOLVED = $(patsubst sheet%,solved%,$(OUT)) 

sheets: ${OUT} 
solvedsheets: ${SOLVED} 
all: sheets solvedsheets 

sheet%.out: sheet%.in 
    cat $< > [email protected] 

solved%.out: sheet%.in 
    cat <% > [email protected] 
    echo "solved!" >> [email protected] 

debug: 
    @echo "OUT = ${OUT}" 
    @echo "SOLVED = ${SOLVED}" 

私はいくつかのテキストを含むいくつかのダミーsheet1.inファイルでそれをテスト:私はこのMakefileを書きました。 makeを実行すると、sheet1.outが生成されますが、solved1.outは生成されません。 make debug利回り:

OUT = sheet1.out 
SOLVED = solved1.out 

私はsolved%.outのルールを削除しても、不足しているルールに文句はありませんすることができます。必要な出力ファイルとして、SOLVEDのリストを無視しているようです。何故ですか?

答えて

1

ルールを指定しないでmakeと入力すると、ファイル内に最初のパターン以外のルールが実行されます。あなたのsheetsルールだけが呼び出されます。

あなたはその後、2つの簡単な解決策を持っている:

  1. allがあなたのMakefileの最初のルールを支配してください。
  2. makeの代わりにmake allと呼んでください。

簡体字、より堅牢なのMakefile:

SOURCE := $(wildcard *.in) 
OUTPUT := $(SOURCE:.in=.out) $(SOURCE:sheet%.in=solved%.out) 

.PHONY: all 

all: $(OUTPUT) 

sheet%.out: sheet%.in 
    cat $< > [email protected] 

solved%.out: sheet%.in 
    cat <% > [email protected] 
    echo "solved!" >> [email protected] 
+0

すごいああ。私は、何も引数が与えられていなければ 'all'を呼び出すと仮定して、これまで何年も使っていました。 – flyx

関連する問題