以下を考慮してください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つだけで、同じ名前の環境変数と非環境変数を持つことができないことを意味します。
make の変数は make が実行されている環境から取得できます。 make の起動時に表示されるすべての環境変数は、同じ名前と値を持つ make 変数に変換されます。
明示的に要求されない限り、makeは元の環境で定義されている場合、またはコマンドラインで設定されている場合にのみ変数をエクスポートします。 [...]特定の変数を子makeにエクスポートするには、次のようにエクスポートディレクティブを使用します。
export variable …
変数をエクスポートしたくない場合は、次のように unexport ディレクティブを使用します。
unexport variable …
私がテストしたところ、unexport X
プロセスが開始された環境から内部変数を完全に削除するだけでは、内部変数とは異なる値を維持する方法がないようです。
使用.POSIX
組み込み目標しかし、この動作は変わらないようです。意見のようです。いずれにせよ、POSIXの動作に対して厳しすぎるMakeはありません。