Makefile 使用make将消息文件放置在正确的目录结构中
我有一个正在添加gettext支持的现有项目。不幸的是,由于该项目的结构和限制,我无法通过建议的路线将该项目改为automake。同样不幸的是,我的make-fu非常弱,我在实现构建输出归档的规则时遇到了困难:Makefile 使用make将消息文件放置在正确的目录结构中,makefile,gettext,Makefile,Gettext,我有一个正在添加gettext支持的现有项目。不幸的是,由于该项目的结构和限制,我无法通过建议的路线将该项目改为automake。同样不幸的是,我的make-fu非常弱,我在实现构建输出归档的规则时遇到了困难: 获取msg子目录中的所有.po文件,并对其运行msgfmt以生成.mo文件(在我的目标目录中) 将.po文件放入gettext:(dir)/(locale)/LC_MESSAGES/(domainname).mo所需的目录结构中 这是我到目前为止所拥有的 MSGSRC=msg/*.po
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...)
MSGSRC=msg/*.po
MSGOBJ=$(addprefix$(TARGET\u BUILD\u PATH)/$(TARGET)/,$(MSG\u SRC:.po=.mo))
$(目标\构建\路径)/$(目标)/msg/%.mo:msg/%.po
msgfmt-c$<-o$@
#放在正确的地方
mkdir-p$(目标构建路径)/$(目标)/msg/$(*F)/LC\u消息
cp$@$(目标构建路径)/$(目标)/msg/$(*F)/LC\u消息/myapp.mo
存档:$(MSGOBJ)(其他OBJ…)
(使存档成为tarball…)
现有代码的问题是,出于某种原因,$(*F)只显示*而不是区域名称(.po文件名为en_US.po等)。这似乎也不正确,因为目标应该是真正的目标,而不是我的黑客msgfmt和副本。目录结构很重要,因为makefile会针对不同的交叉编译($(目标))运行几次,并且输出会归档到tarball中,以便在设备上安装。我假设您可以使用GNU make 首先,让make展开通配符。这对于以后的后处理很重要:
MSGSRC=$(wildcard msg/*.po)
现在您应该可以在MSGSRC和MSGOBJ中获得文件名列表。此外,make手动标记$(F)为过时,而$(名称的词干)只应包含区域设置。所以
mkdir -p $(TARGET_BUILD_PATH)/$(target)/msg/$*/LC_MESSAGES
这个技巧应该做得很好,cp规则也是一样。我做的有点不同。以下是我的
po
文件:
$ find msg -type f
msg/bg_BG.po
msg/de_DE.po
$ find locale -type f
locale/bg_BG.UTF-8/LC_MESSAGES/appname.mo
locale/de_DE.UTF-8/LC_MESSAGES/appname.mo
这是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 msg -type f
msg/bg_BG.po
msg/de_DE.po
$ find locale -type f
locale/bg_BG.UTF-8/LC_MESSAGES/appname.mo
locale/de_DE.UTF-8/LC_MESSAGES/appname.mo