Makefile:重用配方内模式规则的%值

问题描述 投票:0回答:1

在 Makefile 中我有:

images/schematic.pdf: images/schematic.svg
      inkscape -D -z --file=$^ --export-pdf=$@ --export-latex
      sed -i "s:schematic:images/schematic:g" $@_tex

这条规则的作用是:

  • 使用 inkscape 转换为乳胶就绪
    .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)。

makefile pattern-matching gnu-make code-cleanup
1个回答
20
投票

你想要

$*
。 来自 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
库)成员的,几乎从来没有用过。

© www.soinside.com 2019 - 2024. All rights reserved.