在 Makefile 中我有:
images/schematic.pdf: images/schematic.svg
inkscape -D -z --file=$^ --export-pdf=$@ --export-latex
sed -i "s:schematic:images/schematic:g" $@_tex
这条规则的作用是:
.pdf
PDF 文件 + 其相应的 .pdf_tex
文本文件(请参阅此答案:https://tex.stackexchange.com/a/2107/104581).pdf_tex
文件,使其不会破坏从“更高”目录(即当.
文件位于.pdf_tex
中时的./images
)的乳胶编译我在这个表格中有很多规则。 e.其中仅
schematic
发生了变化。我想使用 pattern-rule 将 schematic
替换为 %
。并在配方中使用 %
(在 sed 命令中)。
但是规则:
images/%.pdf: images/%.svg
inkscape -D -z --file=$^ --export-pdf=$@ --export-latex
sed -i "s:%:images/%:g" $@_tex
不起作用:%在配方中按字面意思解释。
我也尝试用 $% 替换配方中的 % 但这个变量似乎是空的。
在配方中添加一行以创建一个(make)变量,该变量将保存
notdir(removeprefix($<))
的结果(使用这个问题或调用bash,因为GNU Make中没有removeprefix)。
你想要
$*
。
来自 https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html :
$*: 隐式规则匹配的词干(请参阅模式如何匹配)。 如果目标是 dir/a.foo.b 并且目标模式是 a.%.b 那么词干就是dir/foo。词干对于构建以下名称很有用 相关文件。
在静态模式规则中,词干是与目标模式中的“%”匹配的文件名的一部分。
在显式规则中,没有词干;所以'$*'不能用这种方式确定。相反,如果目标名称以 公认的后缀(请参阅老式后缀规则),“$*”设置为 目标名称减去后缀。例如,如果目标名称是 ‘foo.c’,则‘$*’设置为‘foo’,因为‘.c’是后缀。 GNU 使 做这个奇怪的事情只是为了与其他兼容 make 的实现。通常应该避免使用“$*”,除非 在隐式规则或静态模式规则中。
如果显式规则中的目标名称不以可识别的后缀结尾,则“$*”将设置为该规则的空字符串。
$%
是一个自动变量,但它是针对存档(.a
库)成员的,几乎从来没有用过。