Использование make для размещения файлов сообщений в правильной структуре каталогов - PullRequest
2 голосов
/ 21 октября 2011

У меня есть проект, в который я добавляю поддержку gettext. К сожалению, из-за структуры и ограничений проекта я не могу пройти рекомендованный путь изменения проекта до автоматизированного. К сожалению, мой make-fu довольно слабый, и у меня возникают проблемы с реализацией правил для создания выходного архива:

  1. Возьмите все .po файлы в подкаталоге msg и запустите на них 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 и т. Д.). Это также кажется неправильным, потому что цель должна быть реальной целью, а не хакерским msgfmt и копией, которые у меня есть. Структура каталогов важна, поскольку make-файл запускается несколько раз для разных кросс-компиляций ($ (target)), а выходные данные архивируются в tar-архив для установки на устройства.

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Я предполагаю, что вы можете использовать GNU make.

Прежде всего, давайте расширим шаблоны.Это важно для последующей постобработки:

MSGSRC=$(wildcard msg/*.po)

Теперь вы должны получить списки имен файлов в MSGSRC и MSGOBJ.Кроме того, make manual помечает $ ( F) как устаревший, а $ (основа имени) должен содержать только локаль.Таким образом,

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

должно хорошо справиться с задачей, то же самое для правила cp.

1 голос
/ 12 октября 2012

Я делаю это немного по-другому.Вот мои 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
...