#makefile #gettext
#makefile #gettext
Вопрос:
У меня есть существующий проект, в котором я добавляю поддержку gettext. К сожалению, из-за структуры и ограничений проекта я не могу пройти рекомендуемый маршрут изменения проекта на automake. Также, к сожалению, мой make-fu довольно слаб, и у меня возникают проблемы с реализацией правил для создания моего выходного архива:
- Возьмите все файлы .po из вложенного каталога msg и запустите 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...)
Проблема с существующим кодом заключается в том, что по какой-то причине $(* 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