
Я установил основные утилиты gnuwin32, make и gettext:
http://gnuwin32.sourceforge.net/packages/coreutils.htm
http://gnuwin32.sourceforge.net/packages/make.htm
http://gnuwin32.sourceforge.net/packages/gettext.htm
У меня есть makefile, который выглядит так:
.PHONY: po mo
po:
xgettext -Lpython --output=po/messages.pot vocelab/app.py vocelab/app.kv
msgmerge --update --no-fuzzy-matching --backup=off po/en.po po/messages.pot
msgmerge --update --no-fuzzy-matching --backup=off po/hu.po po/messages.pot
mo:
mkdir -p "data/locales/en/LC_MESSAGES"
mkdir -p "data/locales/hu/LC_MESSAGES"
msgfmt -c -o data/locales/en/LC_MESSAGES/langapp.mo po/en.po
msgfmt -c -o data/locales/hu/LC_MESSAGES/langapp.mo po/hu.po
Проблема в том, что команда mkdir встроена в cmd.exe. Несмотря на то, что в моем пути есть "c:\Program Files (x86)\GnuWin32\bin", встроенная команда имеет приоритет. Поэтому, когда я ввожу "make mo", я получаю эту ошибку:
A subdirectory or file data/locales/en/LC_MESSAGES already exists.
Я мог бы заменить mkdir на "c:\Program Files (x86)\GnuWin32\bin\mkdir.exe" в makefile, но это не кажется правильным. В другой системе у кого-то может быть другое расположение для gnuwin32.
Другими словами: mkdir.exe есть, но он конфликтует со встроенной командой cmd.exe. Другим вариантом было бы использование другой оболочки в Windows. Но установка подсистемы linux для Windows или установка cygwin потребовали бы гигабайты дискового пространства. Напротив, каталог gnu win32, необходимый для этого проекта, занимает всего 40 МБ.
Я нашел решение, которое действительно работает, но оно уродливо и непереносимо:
GNUWIN32=c:/Program Files (x86)/GnuWin32\bin
.PHONY: po mo
po:
"$(GNUWIN32)/xgettext" -Lpython --output=po/messages.pot vocelab/app.py vocelab/app.kv
"$(GNUWIN32)/msgmerge" --update --no-fuzzy-matching --backup=off po/en.po po/messages.pot
"$(GNUWIN32)/msgmerge" --update --no-fuzzy-matching --backup=off po/hu.po po/messages.pot
mo:
"$(GNUWIN32)/mkdir" -p "data/locales/en/LC_MESSAGES"
"$(GNUWIN32)/mkdir" -p "data/locales/hu/LC_MESSAGES"
"$(GNUWIN32)/msgfmt" -c -o data/locales/en/LC_MESSAGES/langapp.mo po/en.po
"$(GNUWIN32)/msgfmt" -c -o data/locales/hu/LC_MESSAGES/langapp.mo po/hu.po
решение1
CMD больше mkdir
не поддерживает -p
switch в системах Windows 8+. Вот почему вы получаете эту ошибку.
Как я уже сказал в комментарии, не ожидайте, что один makefile/скрипт будет работать как на Windows, так и на Linux, как этот. Обычно вам нужно будет предоставить разные версии, по одной для каждой ОС для более сложных makefile.
Чтобы устранить ошибку с CMD mkdir
(только для Windows):
if not exist "data/locales/en/LC_MESSAGES" mkdir "data/locales/en/LC_MESSAGES"
или для более короткой команды
en = "data/locales/en/LC_MESSAGES"
hu = "data/locales/hu/LC_MESSAGES"
if not exist $en mkdir $en
if not exist $hu mkdir $hu
Чтобы использовать gnuwinmkdir
Используйте двойные кавычки в mkdir
. Это заставит Windows искать исполняемый файл mkdir
вместо команды CMD.
"mkdir" -p "data/locales/en/LC_MESSAGES"
Обновлять:Протестировал двойные кавычки в Kali Linux, Linux Mint, Windows 7 и работает на всех из них. Просто убедитесь, что ваш gnuwin\bin
есть в системном Path