2012-02-15 17 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