如何在Makefile中合并类似的规则?
我使用Makefile进行语言翻译/转换。 对于每种语言,都有一条规则可以将XML转换为特定格式 如何将以下类似模式组合成一条规则?如何在Makefile中合并类似的规则?,makefile,Makefile,我使用Makefile进行语言翻译/转换。 对于每种语言,都有一条规则可以将XML转换为特定格式 如何将以下类似模式组合成一条规则? 添加更多语言会使此Makefile中的代码膨胀 在这种情况下,我无法更改目标的后缀(de_de->de_de.txt)。 那就容易多了 以下是生成文件: # german translation %.de_DE: %.de_DE.xml @java $(JAVA_PAR) $(CONVERTER) $< $@ # turkish translati
添加更多语言会使此Makefile中的代码膨胀 在这种情况下,我无法更改目标的后缀(de_de->de_de.txt)。 那就容易多了 以下是生成文件:
# 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) $< $@
#德语翻译
%.de_de:%.de_de.xml
@java$(java_PAR)$(转换器)$<$@
#土耳其语翻译
%.tr_tr:%.tr_tr.xml
@java$(java_PAR)$(转换器)$<$@
#cz翻译
%.cs_CZ:%.cs_CZ.xml
@java$(java_PAR)$(转换器)$<$@
您可以生成语言规则(例如perl mk\u lang\u rules.pl>lang\u rules.make
)并将包含lang\u rules.make
添加到make文件中。
其中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";
#/usr/bin/perl
严格使用;
使用警告;
我的%langs=(
“德语”=>“德语”,
“土耳其语”=>“tr_tr”,
“cz”=>“cs_cz”,
);
foreach my$lang(键%langs){
my$code=$langs{$lang};
打印“\n#$lang translation\n”;
打印“%.$code:%.$code.xml\n”;
打印“\t\@java\$(java\u PAR)\$(转换器)\$<\$@\n”;
}
打印“\n”;
您可以生成语言规则(例如perl mk\u lang\u rules.pl>lang\u rules.make
)并将包含lang\u rules.make
添加到make文件中。
其中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";
#/usr/bin/perl
严格使用;
使用警告;
我的%langs=(
“德语”=>“德语”,
“土耳其语”=>“tr_tr”,
“cz”=>“cs_cz”,
);
foreach my$lang(键%langs){
my$code=$langs{$lang};
打印“\n#$lang translation\n”;
打印“%.$code:%.$code.xml\n”;
打印“\t\@java\$(java\u PAR)\$(转换器)\$<\$@\n”;
}
打印“\n”;
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))) \
)
LANGS:=de_de tr_tr cs_cs en_US nl_nl
定义语言模板
#翻译
%.$1:%.$1.xml
@java$(java_PAR)$(转换器)$$<$$@
恩德夫
美元(每升美元,每兰格美元)\
$(eval$(调用语言模板,$(l)))\
)
请注意美元翻倍的迹象。在使用shell变量的配方中,您将得到四个变量。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))) \
)
LANGS:=de_de tr_tr cs_cs en_US nl_nl
定义语言模板
#翻译
%.$1:%.$1.xml
@java$(java_PAR)$(转换器)$$<$$@
恩德夫
美元(每升美元,每兰格美元)\
$(eval$(调用语言模板,$(l)))\
)
请注意美元翻倍的迹象。在具有shell变量的配方中,您将得到四个。是的,这是一种可能的解决方案。但是如何在不使用外部工具的情况下完成这项工作呢?我想用make来解决这个问题。这种方法类似于
gcc
如何使用cpp->.h
依赖项生成.dep
文件。是的,这是一种可能的解决方案。但是如何在不使用外部工具的情况下完成这项工作呢?我想用make来解决这个问题。这种方法类似于gcc
如何生成.dep
文件和cpp->.h
依赖项。它很有效!感谢您提供此模板。它为我节省了很多工作。它很有效!感谢您提供此模板。这节省了我很多工作。%:%.xml
会不会太松?是的,在这种情况下会是这样。%:%.xml
会不会太松?是的,在这种情况下会是这样。