LINUX.ORG.RU

Создание переводов в Makefile

 


1

1

Сегодня я туплю больше, чем обычно!

Есть небольшой проектик, который должен (мне 100р) устанавливаться и удаляться командами sudo make install и sudo make uninstall. Структура проекта выглядит так:

├── Makefile
├── po
│   └── ru.po
└── script.py

По идее, нужно в цикле пробежаться по содержимому каталога po и герировать переводы:

for i in $(cd po/ && ls *.po | sed 's/\.po$//'); do \
	msgfmt --statistics po/$i.po -o "/usr/share/locale/$i/LC_MESSAGES/script.mo"; \
done

Тут и возникает проблема: для /usr/share/locale/$i/LC_MESSAGES/script.mo должны быть права 644, но как мне их правильно вписать в конструкцию цикла?


Ответ на: комментарий от undef

Потому что создать mo по нужному адресу и выдать ему права кажется чуточку короче, чем создание, установка, очистка. Я даже не понял, что делает:

all: $(patsubst %.po, %.mo, $(wildcard *.po))

%.mo: %.po
    msgfmt $< -o $@

Что я должен поправить под себя?

Panika
() автор топика
Последнее исправление: Panika (всего исправлений: 2)
Ответ на: комментарий от Panika
# $(wildcard *.po) - после вызова этой функции
# образуется ru.po en.po...
# получится $(patsubst %.po, %.mo, ru.po en.po...)).
# patsubst преобразует это в ru.mo en.mo...
# в итоге эта строка преобразуется в
# all: ru.mo en.mo...
all: $(patsubst %.po, %.mo, $(wildcard *.po))

# это преобразуется в кучу правил
# ru.mo: ru.po
#      msgfmt ru.po -o ru.mo
# en.mo: en.po
#      msgfmt en.po -o en.mo
# вместо $< подставляется предпосылка
# вместо $@ подставляется цель

%.mo: %.po
    msgfmt $< -o $@
undef ★★
()
Ответ на: комментарий от Panika

В GNU Make есть встроенный макроязык. Код, написанный выше, с помощью макроподстановок генерирует мейкфайл следующего вида:

all: ru.mo en.mo ...

ru.mo: ru.po
	msgfmt $< -o $@

en.mo: en.po
	msgfmt $< -o $@
...

Ты можешь написать такой мейкфайл вручную методом копипаста, но все переводы придется добавлять вручную. Макросы автоматом генерят все правила по текущему списку файлов из локального каталога.

annulen ★★★★★
()