GNU Make は、すでに存在する場合にのみマクロを環境変数としてエクスポートします。

GNU Make は、すでに存在する場合にのみマクロを環境変数としてエクスポートします。

以下を考慮してくださいMakefile

X = macro-X-value
foo:
        echo $$X $(X)

ここでの目的は、X環境変数とマクロの名前として機能することです。以下を使用すると、期待bmakeどおりに機能します。

$ env X=env-X-value /usr/bin/bmake
  echo $X macro-X-value
  env-X-value macro-X-value

$ env -i /usr/bin/bmake
  echo $X macro-X-value
  macro-X-value

ただし、GNU Make(v.4.2.1)を使用すると、動作が非常に奇妙になります。

$ env X=env-X-value /usr/bin/gmake
  echo $X macro-X-value
  macro-X-value macro-X-value

$ env -i /usr/bin/gmake
  echo $X macro-X-value
  macro-X-value

gmakeだから輸出価値があると思います。マクロ X〜のように 環境変数 X、しかしただ外部環境の場合すでに 出口X

これに関する情報が見つかりません。POSIXの説明。実際には別のポイントがあります。

マクロは実行中のコマンド環境にエクスポートされません。 [… ]

この動作は文書化されていますか?これはバグですか?無効にできますか?

答え1

私がマニュアルで読んだところによると、GNU makeは変数をシェルのように扱います。起動すると、環境の変数を内部セットにインポートし、コマンドの実行時にエクスポート用にマークされた変数を環境にエクスポートします。これは、すべての変数を含むテーブルが1つだけで、同じ名前の環境変数と非環境変数を持つことができないことを意味します。

6.10 環境の変数:

make の変数は make が実行されている環境から取得できます。 make の起動時に表示されるすべての環境変数は、同じ名前と値を持つ make 変数に変換されます。

そして5.7.2 サブブランドに変数を渡す:

明示的に要求されない限り、makeは元の環境で定義されている場合、またはコマンドラインで設定されている場合にのみ変数をエクスポートします。 [...]特定の変数を子makeにエクスポートするには、次のようにエクスポートディレクティブを使用します。

export variable …

変数をエクスポートしたくない場合は、次のように unexport ディレクティブを使用します。

unexport variable …

私がテストしたところ、unexport Xプロセスが開始された環境から内部変数を完全に削除するだけでは、内部変数とは異なる値を維持する方法がないようです。


使用.POSIX組み込み目標しかし、この動作は変わらないようです。意見のようです。いずれにせよ、POSIXの動作に対して厳しすぎるMakeはありません。

関連情報