web-dev-qa-db-ja.com

make変数を変更し、同じMakefileのレシピから別のルールを呼び出しますか?

私はすでに makeターゲットから別のターゲットを手動で呼び出す方法は? を見ましたが、私の質問は少し異なります。次の例を検討してください(stackoverflow.comは、表示でタブをスペースに変更しますが、編集しようとすると、タブはソースに保持されます)。

TEXENGINE=pdflatex

pdflatex:
    echo the engine is $(TEXENGINE)

lualatex:
    TEXENGINE=lualatex
    echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there!

ここで、デフォルトのターゲット(pdflatex)を実行すると、期待される出力が得られます。

$ make pdflatex 
echo the engine is pdflatex
the engine is pdflatex

しかし、ターゲットlualatexを使用して、次のことを実行します。

  • make変数TEXENGINElualatexに変更し、次に
  • pdflatex(それを使用する)と同じコードを呼び出します。

どうすればできますか?

明らかに、私のlualatexルールでは、TEXENGINE変数を変更することすらできません。これは、試してみると次のようになるためです。

$ make lualatex 
TEXENGINE=lualatex
echo Here I want to call the pdflatex rule, to check pdflatex there!
Here I want to call the pdflatex rule, to check pdflatex there!

...したがって、Makefileでこのようなことが可能かどうかを本当に知りたいのです。

26
sdaau

ターゲット固有の変数 を使用します

ターゲット固有の変数には、もう1つの特別な機能があります。ターゲット固有の変数を定義すると、その変数の値は、このターゲットのすべての前提条件やそのすべての前提条件などに対しても有効になります(これらの前提条件がその変数をその変数でオーバーライドしない限り)。独自のターゲット固有の変数値)。

TEXENGINE=pdflatex

pdflatex:
    echo the engine is $(TEXENGINE)

lualatex: TEXENGINE=lualatex
lualatex: pdflatex
    echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there!

出力は次のとおりです。

$ make pdflatex
echo the engine is pdflatex
the engine is pdflatex
$ make lualatex
echo the engine is lualatex
the engine is lualatex
echo Here I want to call the pdflatex rule, to check lualatex there!
Here I want to call the pdflatex rule, to check lualatex there!
29
Jonathan Wakely

まあ、なんとか回避策にたどり着くことができましたが、私はそれを正確に理解していません-より多くの学習された答えが評価されます。ここでは、これらのリンクが役に立ちました:

だからここに変更された例があります-明らかに、後でルールからルールを呼び出す(前提条件としてではなく、 役職requisite)、コマンドラインで新しい変数値を指定している間は、makeを再帰的にしか呼び出すことができません。

TEXENGINE=pdflatex

pdflatex:
    echo the engine is $(TEXENGINE)

lualatex:
    echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there!
    $(MAKE) TEXENGINE=lualatex pdflatex

出力は私が望んでいるよりも少し冗長ですが、動作します:

$ make lualatex 
echo Here I want to call the pdflatex rule, to check pdflatex there!
Here I want to call the pdflatex rule, to check pdflatex there!
make TEXENGINE=lualatex pdflatex
make[1]: Entering directory `/tmp'
echo the engine is lualatex
the engine is lualatex
make[1]: Leaving directory `/tmp'

...これは、純粋にコマンドラインの対話形式で求めていたものですが、最善の解決策ではないことがわかっています(以下の@JonathanWakelyのコメントを参照)

4
sdaau