Я установил gnuwin32 core utils, make и gettext:

http://gnuwin32.sourceforge.net/packages/coreutils.htm
http://gnuwin32.sourceforge.net/packages/make.htm
http://gnuwin32.sourceforge.net/packages/gettext.htm

У меня есть make-файл, который выглядит так:

.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» в make-файле, но это не так. В другой системе у кого-то может быть другое местоположение для 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 ответ1

1

CMD mkdir больше не поддерживает ключ -p в системах Windows 8+. Вот почему вы получаете эту ошибку.

Как я сказал в комментарии, не ожидайте, что один make-файл / скрипт будет работать как в Windows, так и в Linux, как этот. Обычно вам нужно предоставлять разные версии, по одной для каждой ОС, для более сложных make-файлов.

Чтобы преодолеть ошибку с 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

Использовать gnuwin mkdir

Используйте двойные кавычки на mkdir . Это заставит Windows искать исполняемый файл mkdir вместо команды CMD.

"mkdir" -p "data/locales/en/LC_MESSAGES"

Обновление: протестировано двойное цитирование в Kali Linux, Linux Mint, Windows 7 и работает на всех из них. Просто убедитесь, что ваш gnuwin\bin находится в вашей системной папке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .