2012-02-15 42 views
1

我使用Makefile来做语言翻译/转换。 对于每种语言都有一条规则来执行从XML到特定格式的转换。如何合并Makefile中的类似规则?

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

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

这里是Makefile中:

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

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

# cz translation 
%.cs_CZ: %.cs_CZ.xml 
    @java $(JAVA_PAR) $(CONVERTER) $< [email protected] 
+0

'%:%.xml'太松了吗? – Beta 2012-02-15 16:00:31

+0

是的,在这种情况下就是这样。 – 2012-02-20 08:47:08

回答

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) \$< \[email protected]\n"; 
} 
print "\n"; 
+0

是的,这是一个可能的解决方案。但是如何在不使用外部工具的情况下完成这项工作?我想用make来解决它。 – 2012-02-15 09:15:38

+0

该方法类似于'gcc'使用'cpp - > .h'依赖关系生成'.dep'文件。 – 2012-02-18 21:31:45

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) $$< [email protected] 
endef 

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

请注意加倍的美元符号。在带有shell变量的食谱中,最终会有四个。

+0

它的工作原理!感谢您使用此模板。它为我节省了很多工作。 – 2012-02-15 10:50:12