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

发布于 2025-01-06 11:41:46 字数 476 浏览 0 评论 0原文

我使用 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) $< $@

I use a Makefile to do language translations/conversions.
For every language there is a rule to do the conversion from XML to a specific format.

How to combine following these similar patterns into one rule?
Adding more languages would bloat the code in this Makefile.

In this case I cannot change the suffix for targets (de_DE -> de_DE.txt).
That would make it easier!

Here is the Makefile:

# german translation
%.de_DE: %.de_DE.xml
    @java $(JAVA_PAR) $(CONVERTER) 
lt; $@

# turkish translation
%.tr_TR: %.tr_TR.xml
    @java $(JAVA_PAR) $(CONVERTER) 
lt; $@

# cz translation
%.cs_CZ: %.cs_CZ.xml
    @java $(JAVA_PAR) $(CONVERTER) 
lt; $@

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

万劫不复 2025-01-13 11:41:46

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 变量的配方中,您最终会得到四个。

GNU make supports this, but not in a way I find very maintainable:
the syntax and semantics are hard to grasp.

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))) \
)

Note the doubled dollar signs. In recipes with shell variables you'll end up with four.

和影子一齐双人舞 2025-01-13 11:41:46

您可以改为生成语言规则(例如 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) \
lt; \$@\n";
}
print "\n";

You can instead generate the language rules (e.g. perl mk_lang_rules.pl > lang_rules.make) and add include lang_rules.make to your makefile.
Where mk_lang_rules.pl is like the following for instance:

#!/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) \
lt; \$@\n";
}
print "\n";
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文