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

#makefile #gettext

#makefile #gettext

Вопрос:

У меня есть существующий проект, в котором я добавляю поддержку gettext. К сожалению, из-за структуры и ограничений проекта я не могу пройти рекомендуемый маршрут изменения проекта на automake. Также, к сожалению, мой 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 и copy, которые у меня есть. Структура каталогов важна, потому что makefile запускается несколько раз для разных кросс-компиляций ($(target)), а выходные данные архивируются в архив для установки на устройства.

Ответ №1:

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

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

 MSGSRC=$(wildcard msg/*.po)
  

Теперь вы должны получить списки имен файлов в MSGSRC и MSGOBJ. Кроме того, в руководстве make $(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