Makefile 如何在先决条件行中获取当前目标名称而不使用扩展名?

Makefile 如何在先决条件行中获取当前目标名称而不使用扩展名?,makefile,Makefile,我知道,$$@用于获取先决条件行上的目标名称,但无法使其工作以查找没有扩展名的目标名称 这就是我的意思。我有这个 foo.pdf : foo.tex pdflatex $? 但是我不想重复文件名foo。我想写像(这不起作用) 我尝试了许多其他的变化,但都没有奏效。我所拥有的make book中没有这方面的例子 你知道怎么做吗?在LinuxMint上使用Gmake3.81 或者只获取目标的foo部分,以便在依赖项行中使用它 我知道我可以写这个 TARGET = foo ${TARGET:

我知道,
$$@
用于获取先决条件行上的目标名称,但无法使其工作以查找没有扩展名的目标名称

这就是我的意思。我有这个

foo.pdf : foo.tex
    pdflatex $?
但是我不想重复文件名
foo
。我想写像(这不起作用)

我尝试了许多其他的变化,但都没有奏效。我所拥有的make book中没有这方面的例子

你知道怎么做吗?在LinuxMint上使用Gmake3.81 或者只获取目标的
foo
部分,以便在依赖项行中使用它

我知道我可以写这个

TARGET = foo
${TARGET:=.pdf} : ${TARGET:=.tex}
    latex $?
但我想看看是否有可能以不同的方式进行操作。

使用模式规则

# First rule in file, canonically called `all`,
# defines what gets built by default.
all: foo.pdf

# define the rule
%.pdf : %.tex
    pdflatex $<
#文件中的第一条规则,通常称为“all”,
#定义默认情况下生成的内容。
全部:foo.pdf
#定义规则
%.pdf:%.tex
pdflatex$<
或者,您可以使用静态模式规则:

foo.pdf: %.pdf : %.tex
    pdflatex $<
foo.pdf:%.pdf:%.tex
pdflatex$<

但我从来没有理由用这个。

比我快了一分钟:)是的,我知道我能做到。在我的makefile中有很多和我一样的规则。但是这个练习的全部目的是学习如何使用
$$@
,它应该引用前提条件行中的target。我只是在寻找我提到的语法,而不是其他替代方法。是否可以像我的示例中那样直接执行?@Nasser如果您想了解何时使用
。SECONDEXPANSION:
,规则是“不要”。对于任何合理的工作流,它的性能都很糟糕,最好使用
include
并使用规则生成该文件的内容。
foo.pdf: %.pdf : %.tex
    pdflatex $<