我有一个现有的项目,我正在添加gettext支持。不幸的是,由于项目的结构和限制,我无法通过建议的方式将项目更改为automake。还不幸的是,我的make-fu非常弱,我在实现构建输出档案的规则时遇到了麻烦:
这是我到目前为止所拥有的
MSGSRC=msg/*.po
MSGOBJ=$(addprefix $(TARGET_BUILD_PATH)/$(target)/,$(MSG_SRC:.po=.mo))
$(TARGET_BUILD_PATH)/$(target)/msg/%.mo: msg/%.po
msgfmt -c $< -o $@
# Put in correct place
mkdir -p $(TARGET_BUILD_PATH)/$(target)/msg/$(*F)/LC_MESSAGES
cp $@ $(TARGET_BUILD_PATH)/$(target)/msg/$(*F)/LC_MESSAGES/myapp.mo
archive: $(MSGOBJ) (other objs....)
(make the archive tarball...)
现有代码的问题在于,由于某种原因,$(* F)只出现*而不是语言环境名称(.po文件名为en_US.po等)。它似乎也是不正确的,因为目标应该是真正的目标,而不是我拥有的hacky msgfmt和副本。目录结构很重要,因为makefile对于不同的交叉编译($(target))运行了几次,输出被存档到tarball中以便在设备上安装。
答案 0 :(得分:2)
我假设您可以使用GNU make。
首先,让make扩展通配符。这对后期的后处理非常重要:
MSGSRC=$(wildcard msg/*.po)
现在您应该获得MSGSRC和MSGOBJ中的文件名列表。此外,make手册将$( F)标记为过时,$ (名称的主干)应仅包含区域设置。所以,
mkdir -p $(TARGET_BUILD_PATH)/$(target)/msg/$*/LC_MESSAGES
应该做的很好,对于cp规则也一样。
答案 1 :(得分:1)
我做的略有不同。以下是我的po
文件:
$ find msg -type f
msg/bg_BG.po
msg/de_DE.po
这是Makefile
:
MSGLANGS=$(notdir $(wildcard msg/*po))
MSGOBJS=$(addprefix locale/,$(MSGLANGS:.po=.UTF-8/LC_MESSAGES/appname.mo))
gettext: $(MSGOBJS)
locale/%.UTF-8/LC_MESSAGES/appname.mo: msg/%.po
mkdir -p $(dir $@)
msgfmt -c -o $@ msg/$*.po
这些是生成的mo
文件:
$ find locale -type f
locale/bg_BG.UTF-8/LC_MESSAGES/appname.mo
locale/de_DE.UTF-8/LC_MESSAGES/appname.mo