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

Gab*_*ers 4 makefile code-cleanup pattern-matching gnu-make

在Makefile中我有:

images/schematic.pdf:images/schematic.svg

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

  sed -i "s:schematic:images/schematic:g" $@_tex
Run Code Online (Sandbox Code Playgroud)

这条规则的作用是:

  • 使用inkscape转换为可用于乳胶的.pdfPDF文件及其相应的.pdf_tex文本文件(请参阅此答案:https://tex.stackexchange.com/a/2107/104581)
  • 修改提到的.pdf_tex文件,以便它不会破坏"更高"目录中的乳胶编译(即..pdf_tex文件在时./images)

我的问题:

我有很多这种形式的规则,即只有schematic改变的地方.我想用一个模式规则替换schematic%.并%在配方中使用(在sed命令中).

但是规则:

images /%.pdf:images /%.svg

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

  sed -i "s:%:images/%:g" $@_tex
Run Code Online (Sandbox Code Playgroud)

不起作用:%在食谱中按字面解释.

我还尝试用$%替换配方中的%,但这个变量似乎是空的.

不满意的解决方案:

在配方中添加一行来创建一个(make)变量,该变量将保存结果notdir(removeprefix($<))(使用此问题或调用bash,因为GNU Make中没有removeprefix).

wno*_*ise 9

你想要的$*.从https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html:

$*:隐式规则匹配的词干(请参阅模式匹配).如果目标是dir/a.foo.b并且目标模式是.%.b那么干是dir/foo.词干对于构造相关文件的名称很有用.

在静态模式规则中,词干是文件名的一部分,与目标模式中的'%'匹配.

在明确的规则中,没有干; 所以'$*'无法以这种方式确定.相反,如果目标名称以识别的后缀结尾(请参阅老式后缀规则),则将'$*'设置为目标名称减去后缀.例如,如果目标名称为'foo.c',则'$*'设置为'foo',因为'.c'是后缀.GNU make只为兼容make的其他实现而做了这个奇怪的事情.除了隐式规则或静态模式规则之外,通常应该避免使用'$*'.

如果显式规则中的目标名称未以识别的后缀结束,则"$*"将设置为该规则的空字符串. $%是一个自动变量,但它适用于归档(.a库)成员,几乎从不有用.