Makefile: 在配方中重复使用模式规则的%值

13
在 Makefile 中我有:

images/schematic.pdf: images/schematic.svg

  inkscape -D -z --file=$^ --export-pdf=$@ --export-latex

  sed -i "s:schematic:images/schematic:g" $@_tex
这个规则的作用是:
  • 使用inkscape将文件转换为latex-ready的.pdf PDF文件和相应的.pdf_tex文本文件(请参见此答案:https://tex.stackexchange.com/a/2107/104581
  • 修改所提到的.pdf_tex文件,以便它不会破坏从“更高”的目录(即当.pdf_tex文件在./images中时,它不会破坏编译)

我的问题:

我有很多这种形式的规则,即只更改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($<))的结果(使用this question或调用bash,因为GNU Make中没有removeprefix)。
1个回答

19
您需要使用$*
来源: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 只是为了与其他make实现兼容而执行这个奇怪的操作。除了隐式规则或静态模式规则外,通常应避免使用“$ *”。

如果显式规则中的目标名称没有以已识别的后缀结尾,则该规则的“$ *”将设置为空字符串。

$%是一个自动变量,但它仅用于存档(library)成员,几乎不会有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接