文件名中包含可变部分的生成文件的规则

rules for generated files with variable part in filename

有源文件:a.asn1b.asn1

首先我需要对它们进行预处理,为标识符添加前缀(不同文件的前缀不同)。

./prefixASN1.pl -file "foo.asn1" -prefix PREF-

这样做并将结果输出到PREF-foo.asn1

然后我需要从 PREF-foo.asn1 生成 C 解析器。

./snacc -mm PREF-foo.asn1

将创建 foo.c 和 foo.h(没有前缀的文件名)

如何实现与这个长 makefile 相同的行为:

a.c a.h: AAA-a.asn1
    ./snacc -mm $<
# serialize
a.h: a.c

b.c b.h: BBB-b.asn1
    ./snacc -mm $<
# serialize
b.h: b.c

AAA-a.asn1: a.asn1
    ./prefixASN1.pl -file $< -prefix AAA-

BBB-b.asn1: b.asn1
    ./prefixASN1.pl -file $< -prefix BBB-

用更短的东西,像这样:

# ??? set PREFIX=AAA for a
# ??? set PREFIX=BBB for b

%.c %.h: $(PREFIX)%.asn1
    ./snacc -mm $<
# serialize
???

$(PREFIX)%.asn1: %.asn1
    ./prefixASN1.pl -file $< -prefix $(PREFIX)

?

我正在使用 autotools 和 GNU make。

我决定在所有文件中使用相同的前缀更正确。

  • 将源规范重命名为 %.unprefixed.asn1
  • 修改了 perl 脚本以允许自定义输出文件名
  • 定义了几个ASN1_PREFIX_<stem>变量:

_

ASN1_PREFIX_a = AAA-
ASN1_PREFIX_b = BBB-
  • 添加的规则:

_

%.asn1: %.unprefixed.asn1`
    $(PREFIXASN1) -file $< -prefix "$(ASN1_PREFIX_$*)" -outfile $@

%.c %.h: %.asn1
    ...

_

要将变量前缀传递给规则,我更喜欢 Computed Variable Names 而不是 Target-specific Variable Values