我使用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) $< $@
答案 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";