2012-01-27 13 views
5

現在、make変数の評価に起因するMakefileに関する問題に直面しています。私は複雑さを軽減しましたが、問題を生み出す必須要素だけが残っています。 Makefileが読み込まれたときMakefile変数の拡張/評価

  • $(LIST)は、ファイルのリストとして評価されます。
  • ステップ1これらのファイルの1つが削除されます。
  • ステップ2の変数を使用すると、再度評価されないため、これ以上有効ではなくなり、コピーコマンド中にエラーが発生します。
  • 変数が使用された時点で評価されていれば、ここではのステップ2の間に評価されるといいでしょう。

この問題を解決する方法を教えてください。


のMakefile:

LIST=$(wildcard src/*.txt) 

all: step1 step2 

step1: 
    @echo "---------- step1 ----------" 
    @echo $(LIST) 
    rm src/q1.txt 
    ls src 

step2: 
    @echo "---------- step2 ----------" 
    @echo $(LIST) 
    cp $(LIST) ./dst 

実行ログ:

$ make 
---------- step1 ---------- 
src/q1.txt src/q2.txt 
rm src/q1.txt 
ls src 
q2.txt 
---------- step2 ---------- 
src/q1.txt src/q2.txt 
cp src/q1.txt src/q2.txt ./dst 
cp: cannot stat `src/q1.txt': No such file or directory 
make: *** [step2] Error 1 

答えて

7

ワイルドカード機能を使用しないでください。

LIST = src/*.txt 

all: step1 step2 

step1: 
    @echo "---------- step1 ----------" 
    @echo $(LIST) 
    rm src/q1.txt 
    ls src 

step2: 
    @echo "---------- step2 ----------" 
    @echo $(LIST) 
    cp $(LIST) ./dst 
+2

この作品の理由は、文字列「SRC/*。TXT」の代わりにmake' 'の' echo'とシェルは各コマンドのためにそれを再度展開し 'cp'コマンド、(にそのまま置かれていることですこれは '$(ワイルドカード)'の拡張を行いました)。 –

+3

レシピが呼び出されたときに変数が展開されているので(元のメークファイルが動作すると予想される、即時または単純な拡張では「:=」ではなく遅延拡張に「=」が使用されます)。ここに問題があります:効率のためにGNUはディレクトリの内容をキャッシュします。したがって、makeが認識しない方法でディレクトリ構造を変更すると、makeの考えが存在するファイルが現実と一致しないというこのような状況に陥る可能性があります。 – MadScientist