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
この作品の理由は、文字列「SRC/*。TXT」の代わりにmake' 'の' echo'とシェルは各コマンドのためにそれを再度展開し 'cp'コマンド、(にそのまま置かれていることですこれは '$(ワイルドカード)'の拡張を行いました)。 –
レシピが呼び出されたときに変数が展開されているので(元のメークファイルが動作すると予想される、即時または単純な拡張では「:=」ではなく遅延拡張に「=」が使用されます)。ここに問題があります:効率のためにGNUはディレクトリの内容をキャッシュします。したがって、makeが認識しない方法でディレクトリ構造を変更すると、makeの考えが存在するファイルが現実と一致しないというこのような状況に陥る可能性があります。 – MadScientist