私は基本的にバグのあるmakefileを調べているので、次のシナリオで混乱しました。
default:
echo "Build started with $@ at $(ENV_VAR)";\
ENV_VAR=$(NEW_DIR); \
cd $(ENV_VAR); \
$(MAKE);
プログラマーの目的:
基本的に、プログラマーは、環境変数ENV_VARを新しい値(ディレクトリーへのパス)NEW_DIRでオーバーライドしてから、そのディレクトリー内でmakeを再帰的に実行することを意図しています。
このmakefileのバグ:
私が見ているバグは、コーダーが「cd $$(ENV_VAR)」の代わりに「cd $(ENV_VAR)」を使用していることです。したがって、このため、実際には「cd」コマンドにオーバーライドされたmake変数を使用せず、代わりに$(MAKE)を実行する前に環境変数の値を使用します。また、パスが存在しないためにcdコマンドが失敗しました。最後に、再帰的なmakeを実行することになります。
私が持っている質問
上記の段落で述べたように、私たちは再帰的な作成のシナリオにあります。興味深いことに、同じターゲットが2回目に呼び出されたときに、$(ENV_VAR)がNEW_DIRのオーバーライドされた値を反映しているのがわかります。これは、私を困惑させます。
サンプル出力:
推定:
NEW_DIR = / new-dir OLD-DIR = / old-dir
出力:
Build started with default at /old-dir
bin/sh /old-dir: no such file (or) directory
Build started with default at /new-dir
これに関する提案をお願いします。