使用make将消息文件放在正确的目录结构中

时间:2011-10-21 17:18:07

标签: makefile gettext

我有一个现有的项目,我正在添加gettext支持。不幸的是,由于项目的结构和限制,我无法通过建议的方式将项目更改为automake。还不幸的是,我的make-fu非常弱,我在实现构建输出档案的规则时遇到了麻烦:

  1. 获取msg子目录中的所有.po文件并对其运行msgfmt以生成.mo文件(在我的目标目录中)
  2. 将.po文件放在gettext所需的目录结构中:(dir)/(locale)/ LC_MESSAGES /(domainname).mo
  3. 这是我到目前为止所拥有的

    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中以便在设备上安装。

2 个答案:

答案 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