Gnuwin32, Makefile, mkdir -p?

Gnuwin32, Makefile, mkdir -p?

Ich habe die GnuWin32-Kernprogramme „make“ und „gettext“ installiert:

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

Ich habe ein Makefile, das so aussieht:

.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

Das Problem ist, dass der Befehl mkdir der einzige integrierte Befehl in cmd.exe ist. Obwohl ich „c:\Program Files (x86)\GnuWin32\bin“ in meinem Pfad habe, hat der integrierte Befehl Vorrang. Wenn ich also „make mo“ eingebe, erhalte ich diesen Fehler:

A subdirectory or file data/locales/en/LC_MESSAGES already exists.

Ich könnte mkdir im Makefile durch "c:\Program Files (x86)\GnuWin32\bin\mkdir.exe" ersetzen, aber das scheint nicht richtig zu sein. Auf einem anderen System hat jemand vielleicht einen anderen Speicherort für gnuwin32.

Mit anderen Worten: mkdir.exe ist vorhanden, steht aber im Konflikt mit einem integrierten Befehl von cmd.exe. Die andere Möglichkeit wäre, eine andere Shell unter Windows zu verwenden. Die Installation des Linux-Subsystems für Windows oder die Installation von Cygwin würde jedoch Gigabyte an Festplattenspeicher erfordern. Im Gegensatz dazu ist das für dieses Projekt benötigte GNU Win32-Verzeichnis nur 40 MB groß.

Ich habe eine Lösung gefunden, die tatsächlich funktioniert, aber sie ist hässlich und nicht portierbar:

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

Antwort1

Die CMD mkdirunterstützt -pSwitch auf Windows 8+-Systemen nicht mehr. Deshalb erhalten Sie diesen Fehler.

Wie ich im Kommentar sagte, erwarten Sie nicht, dass ein Makefile/Skript sowohl unter Windows als auch unter Linux läuft, wie dies hier der Fall ist. Normalerweise müssen Sie bei komplizierteren Makefiles verschiedene Versionen bereitstellen, eine für jedes Betriebssystem.

So beheben Sie den Fehler mit CMD mkdir(nur für Windows):

if not exist "data/locales/en/LC_MESSAGES" mkdir "data/locales/en/LC_MESSAGES"

oder für einen kürzeren Befehl

en = "data/locales/en/LC_MESSAGES"
hu = "data/locales/hu/LC_MESSAGES"

if not exist $en mkdir $en
if not exist $hu mkdir $hu

Um den gnuwin zu verwendenmkdir

Setzen Sie doppelte Anführungszeichen in das mkdir. Dadurch wird Windows gezwungen, nach der ausführbaren Datei mkdirstatt nach dem CMD-Befehl zu suchen.

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

Aktualisieren:Habe das Anführungszeichen in Kali Linux, Linux Mint und Windows 7 getestet und es funktioniert auf allen. Stelle einfach sicher, dass es gnuwin\binsich in deinem Systempfad befindet .

verwandte Informationen