0

構成オプションを遅延評価しようとしています。Make変数が実際に使用(置換)された場合のみエラーを出したい。

次の Makefile を検討してください。

VAR = $(error "E")

NFS_DIR = NFS_DIR is $(VAR)

T = $(NFS_DIR) is 1

all:
    echo Test

自分の環境 (/srv/nfs値がある) で実行すると、出力は次のようになります。

➜  ~  make
echo Test
Makefile:3: *** "E".  Stop.

したがって、再帰的な定義は単純な定義のように機能します。

環境をクリアすると、期待どおりに動作します。

➜  ~  env -i make  
echo Test
Test

環境変数と同じ名前で定義された場合、再帰的に展開された変数が単純に展開された変数のように機能するという言及は見つかりませんでした。

質問は次のとおりです。

  1. なぜ観察された行動?
  2. 望ましい動作を実装する方法は?

更新: 明確にするために —?=オプションは構成オプションであるため、使用したくありません。環境からではなく、厳密に Makefile から取得する必要があります。

4

2 に答える 2

1

make の開始時に環境にある変数は、(レシピなどの一部として) make が実行されるコマンドの環境にエクスポートされます。make が変数の値をコマンドに送信するために、make は最初に展開します。単純に展開された変数のようには機能しません。コマンドを実行すると強制的に展開されるだけです。

これは一種の厄介な副作用ですが、直接できることは何もないかどうかはわかりません.

私が考えることができる 2 つの選択肢があります。1 つ目は、make コマンドを使用してunexport、コマンドの環境でその変数を送信しないように make に指示することです。

2 つ目は、make 内の変数の名前を、有効な環境変数ではない名前に変更することです。make は、名前が有効なシェル変数 (英数字の plus のみを含む_) である変数のみをエクスポートします。VAR-localそのため、代わりにlike という名前を使用すると、VARそれが可能になります。

于 2013-09-12T11:38:17.727 に答える
0

質問はタイトルで非常に明確に見えますが、実際の要求は詳細に失われているため、他の唯一の返信ではほとんど回答されていません。タイトルの質問に直接答えると、非常に興味深いですが、環境変数と同じ名前の Makefile で変数を定義するには、次のコマンドを使用してその値を取得できますprintenv

PATH=${shell printenv PATH}:/opt/bin

echo:
    echo $(PATH)

外部コマンドによる評価に依存せずに同じ結果を達成するための他の手法を歓迎します。

于 2018-08-02T09:36:12.933 に答える