更改make变量,并从同一Makefile中的配方调用另一个规则?

时间:2014-10-15 12:39:16

标签: makefile gnu-make

我已经看过How to manually call another target from a make target?,但我的问题有点不同;考虑这个例子(注意,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!

...所以我真的想知道Makefiles中是否有这样的东西。

2 个答案:

答案 0 :(得分:24)

使用target-specific variable

  

目标特定变量还有一个特殊功能:当您定义特定于目标的变量时,变量值对此目标的所有先决条件及其所有先决条件等都有效(除非这些先决条件覆盖了该变量)变量具有自己的特定于目标的变量值。)

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!

答案 1 :(得分:3)

好吧,我设法得到了一种解决方法,但我并不完全理解它 - 所以我们将会更加了解更多学问。对我来说,这些链接有助于:

所以这里修改了一个例子 - 显然,之后从规则中调用规则(不是作为先决条件,而是作为 post 必需品),我只能递归调用{{1} ,同时在命令行中指定新的变量值:

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

...这就是我想要的纯粹命令行交互方式,但我知道这不是最好的解决方案(请参阅下面的@ JonathanWakely的评论)