Измените переменную 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 ниже)