(GNU)makeでは、特定のターゲットのビルドチェーンが開始されているときに変数に値を割り当てる必要があります。 a.so
とb.o
両方のルールを実行するときcurrent
値のみb.so
を有しているcurrent
は、値a.so
を有し、ここでMake:どのターゲットをビルドするかによって変数を設定します。
# Rules
all: a.so b.so
a.so: b.o
@echo Current .so is $(current)
touch [email protected]
b.so: b.o
@echo Current .so is $(current)
touch [email protected]
b.o:
@echo Current .so is $(current)
touch [email protected]
# Set the "current" variable based on which .so is being build
a.so: current = a.so
b.so: current = b.so
を:ターゲットa.so
とb.so
、b.o
に応じてそれぞれのために、私はこのように手動でこれを行うことができb.so
のルールを実行するとき。これは私が欲しいものです。私が持っているメンタルモデルは、a.so
またはb.so
のルールが実行される前に、a.so
がビルドされていることがmakeが知るとすぐに、a.so: current = a.so
という行がトリガされるということです。私が間違っているなら、私を修正してください。
私の実際のケースでは、私はもっと多くのファイルを持っているので、最後の2行をこのようなものに置き換えたいと思います。
%.so: current = [email protected]
またはこれです。
しかしsofiles = a b
$(addsuffix .so, $(sofiles)): current = [email protected]
、これらの結果の両方current
変数はb.o
ターゲットがビルドされようとしている場合でも、新たに設定されますと同じ、間違った行動、インチb.o
ターゲットがこれらの行をトリガするのはなぜですか? .so
ごとに手作業でa.so: current = a.so
と書くのと同じ振る舞いを実現するにはどうすればよいですか?.so
ごとに実際に配線する必要はありませんか?
注:私はコード例に示されているユースケースは奇妙であり、効果の後に求められ、この厄介current
変数なしに達成することができることを知っています。私はしかし、この変数を使用せずに問題を解決する任意のソリューションに興味がありません。
詳細な回答ありがとうございます。はい、 'current'は' .so'ファイルがビルドされているとき(あるいは他のファイルが '.so'ファイルの前提条件としてビルド中)にセットされます。これが意図です。また、 'eval'(変数展開を直ちに実行するように並べ替えるには、すぐに行えますか?)は完璧に機能します! –
'eval'は、makefileの一部であるかのようにその引数を評価します。これは、インラインインクルードファイルとほぼ同じです。 https://www.gnu.org/software/make/manual/html_node/Eval-Function.htmlを参照してください。 – MadScientist