【问题标题】:rules for generated files with variable part in filename文件名中具有可变部分的生成文件的规则
【发布时间】:2025-12-19 15:10:15
【问题描述】:

有源文件:a.asn1,b.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)

?

我正在使用自动工具和 GNU make。

【问题讨论】:

    标签: gnu-make automake


    【解决方案1】:

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

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

    _

    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 的规则

    【讨论】: