Измените переменную make и вызовите другое правило из рецепта в том же Makefile?

Я уже видел Как вручную вызывать другую цель из целевого объекта?, но мой вопрос немного отличается; рассмотрим этот пример (обратите внимание, что 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 TEXENGINE на lualatex, а затем
  • вызывает тот же код, что и в 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!

... поэтому я действительно хотел бы узнать, возможно ли что-то подобное в Make файлах.

Ответы

Ответ 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!

Ответ 2

Ну, мне удалось разобраться в каком-то обходном пути, но я этого не очень понимаю - так будет оценен более узнаваемый ответ. Для меня здесь эти ссылки помогли:

Итак, вот пример, модифицированный - по-видимому, для вызова правила из правила впоследствии (а не как предпосылка, а скорее как post 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 ниже)