make
サブメイクへの変数の通信を防ぐことはできません。私はマニュアルを読み、彼らのアドバイスに従いました (リセットMAKEOVERRIDES
とMAKEFLAGS
) が、まだ機能していません。
次のプロトタイプの Makefile を検討してください。
${warning $(MAKEOVERRIDES)}
${warning $(MAKEFLAGS)}
${warning $(VAR)}
none:
$(MAKE) -f Makefile MAKEOVERRIDES= MAKEFLAGS= all
all:
echo done!
Imake VAR=10 none
の場合、次の結果が得られます。
Makefile:2: VAR=10
Makefile:3:
Makefile:4: 10
make -f Makefile MAKEOVERRIDES= MAKEFLAGS= all
make[1]: Entering directory `/home/adriano/sandbox/makes'
Makefile:2:
Makefile:3:
Makefile:4: 10
echo done!
done!
make[1]: Leaving directory `/home/adriano/sandbox/makes'
つまり、サブメイクへのmake
通信です。VAR
これは正しい動作ですか?
私は試してみましたが、運がunexport VAR
ありbash -c make ...
ませんでした。
編集:none
のレシピを次のように変更しました:bash -c "echo $$MAKEOVERRIDES $$MAKEFLAGS $$VAR" ; make ...
このようにして、VAR が実際には、コマンドを実行するために make が作成する環境を通過し、他の変数を通過しないことがわかりました (他の変数もこの方法で make に渡されます)。
私の質問は次のとおりだと思います: サブ make を実行するための新しいシェル/環境を作成するにはどうすればよいですか?
編集: 誰かがなぜ私がこれをしようとしているのかと尋ねました。ここでそれに答えようと思います。
CONFIG という名前の変数を使用する「モジュール」があります。このモジュールをビルドするには、別の部分的に無関係な「モジュール」をビルドする必要があります。これも CONFIG を使用しますが、値は異なります。問題は、「サブモジュール」をビルドしようとすると、CONFIG に「スーパーモジュール」の値が含まれていることです。「サブモジュール」を作成するときにCONFIGを指定できますが、両方のモジュールが同じ名前の多くの変数を使用し、それらをすべて指定しようとすると、モジュールが密結合されてしまい、余裕がありません。
どうしてこんなに難しいんだろう…