【问题标题】:Using make to place message files in correct directory structure使用 make 将消息文件放置在正确的目录结构中
【发布时间】:2011-12-12 18:26:01
【问题描述】:

我有一个正在添加 gettext 支持的现有项目。不幸的是,由于项目的结构和限制,我无法通过推荐的将项目更改为 automake 的路线。同样不幸的是,我的 make-fu 很弱,我在执行规则来构建我的输出存档时遇到了麻烦:

  1. 获取 msg 子目录中的所有 .po 文件并对其运行 msgfmt 以生成 .mo 文件(在我的目标目录中)
  2. 将 .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...)

现有代码的问题在于,由于某种原因,$(*F) 只出现了 * 而不是语言环境名称(.po 文件被命名为 en_US.po 等)。这似乎也不正确,因为目标应该是真正的目标,而不是我拥有的 hacky msgfmt 和副本。目录结构很重要,因为 makefile 会针对不同的交叉编译 ($(target)) 运行几次,并且输出会归档到 tarball 中以便在设备上安装。

【问题讨论】:

    标签: makefile gettext


    【解决方案1】:

    我假设你可以使用 GNU make。

    首先,让 make 扩展通配符。这对于以后的后处理很重要:

    MSGSRC=$(wildcard msg/*.po)
    

    现在您应该获得 MSGSRC 和 MSGOBJ 中的文件名列表。此外,制作手册将 $(F) 标记为已过时,并且 $(名称的词干)应仅包含语言环境。所以,

    mkdir -p $(TARGET_BUILD_PATH)/$(target)/msg/$*/LC_MESSAGES
    

    应该做的很好,对于 cp 规则也是如此。

    【讨论】:

      【解决方案2】:

      我的做法略有不同。这是我的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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        相关资源
        最近更新 更多