Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Makefile中合并类似的规则?_Makefile - Fatal编程技术网

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

如何在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进行语言翻译/转换。 对于每种语言,都有一条规则可以将XML转换为特定格式

如何将以下类似模式组合成一条规则?
添加更多语言会使此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
会不会太松?是的,在这种情况下会是这样。