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

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

我有一个正在添加gettext支持的现有项目。不幸的是,由于该项目的结构和限制,我无法通过建议的路线将该项目改为automake。同样不幸的是,我的make-fu非常弱,我在实现构建输出归档的规则时遇到了困难:

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

    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