我想在 makefile 中使用工具msgfmt从 .po 源生成 .mo 文件。.po 源针对每种语言,位于如下文件夹结构中:
$(projectpath)/locale/de/LC_MESSAGES
$(projectpath)/locale/fr/LC_MESSAGES
$(projectpath)/locale/en/LC_MESSAGES
生成的.mo 文件应位于类似的文件夹结构中:
$(buildpath)/locale/de/LC_MESSAGES
$(buildpath)/locale/fr/LC_MESSAGES
$(buildpath)/locale/en/LC_MESSAGES
在 makefile 中,我已成功为源和目标创建了 2 个变量:
PO_FILES := $(wildcard $(projectpath)/locale/*/LC_MESSAGES/*.po)
MO_FILES := $(subst $(projectpath)/locale/,$(buildpath)/locale/,$(subst .po,.mo,$(PO_FILES)))
并且我还能够为 MO_FILES 创建目标目录。
DIRS := $(sort $(dir $(MO_FILES)))
但是,我在定义依赖关系以触发生成时失败了。
以下选项不起作用:
%.mo:%.po
$(buildpath)/locale/%/LC_MESSAGES/%.mo: $(projectpath)/locale/%/LC_MESSAGES/%.po
我也尝试了其他几个组合,结果相同。Make 声称它没有制定目标的规则。
那么:
(用
cp
代替msgfmt
我没有的)。您要么必须为每个区域设置编写 mo:po 规则,要么使用一些 GNU make magic 和 call/eval 来通过循环创建规则:
如果我用它来运行“make”,将会发生以下情况:
这几乎直接来自 GNU make 手册,https://www.gnu.org/software/make/manual/make.html#Eval-Function