如何在Makefile中合并类似的规则?

时间:2012-02-15 08:10:36

标签: makefile

我使用Makefile进行语言翻译/转换。 对于每种语言,都有一条规则可以从XML转换为特定格式。

如何将这些相似的模式组合成一个规则? 添加更多语言会使这个Makefile中的代码膨胀。

在这种情况下,我无法更改目标的后缀(de_DE - > de_DE.txt)。 那样会更容易!

这是Makefile:

# german translation
%.de_DE: %.de_DE.xml
    @java $(JAVA_PAR) $(CONVERTER) $< $@

# turkish translation
%.tr_TR: %.tr_TR.xml
    @java $(JAVA_PAR) $(CONVERTER) $< $@

# cz translation
%.cs_CZ: %.cs_CZ.xml
    @java $(JAVA_PAR) $(CONVERTER) $< $@

2 个答案:

答案 0 :(得分:4)

GNU make支持这个,但不是我觉得非常可维护的方式: 语法和语义很难掌握。

LANGS := de_DE tr_TR cs_CS en_US nl_NL

define LANG_template
# translation 
%.$1: %.$1.xml
    @java $(JAVA_PAR) $(CONVERTER) $$< $$@
endef

$(foreach l, $(LANGS), \
  $(eval $(call LANG_template,$(l))) \
)

注意美元双倍的迹象。在带有shell变量的食谱中,你最终会得到四个。

答案 1 :(得分:0)

您可以改为生成语言规则(例如perl mk_lang_rules.pl > lang_rules.make)并将include lang_rules.make添加到您的makefile中。 其中mk_lang_rules.pl与以下内容类似:

#!/usr/bin/perl
use strict;
use warnings;

my %langs = (
        "german" => "de_DE",
        "turkish" => "tr_TR",
        "cz" => "cs_CZ",
);

foreach my $lang (keys %langs) {
        my $code = $langs{$lang};
        print "\n# $lang translation\n";
        print "%.$code: %.$code.xml\n";
        print "\t\@java \$(JAVA_PAR) \$(CONVERTER) \$< \$@\n";
}
print "\n";