Gnuwin32, makefile, mkdir -p?

Gnuwin32, makefile, mkdir -p?

Я установил основные утилиты 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не поддерживает -pswitch в системах 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

Связанный контент