/ / Gnuwin32, makefile, mkdir -p? - Windows, Gnuwin32

Gnuwin32, makefile, mkdir -p? - Windows, Gnuwin32

Ich habe gnuwin32 core utils installiert, make und gettext:

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 derjenige istintegrierte cmd.exe. Obwohl ich "c: Program Files (x86) GnuWin32bin" auf meinem Pfad habe, hat der eingebaute Befehl Vorrang. Wenn ich also "make mo" eingebe, bekomme ich folgenden Fehler:

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

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

Mit anderen Worten: das mkdir.exe ist da, aber es widerspricht einem eingebauten Befehl von cmd.exe. Die andere Möglichkeit wäre, unter Windows eine andere Shell zu verwenden. Die Installation des Linux-Subsystems für Windows oder von Cygwin würde jedoch Gigabyte 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 hässlich und nicht portabel ist:

GNUWIN32=c:/Program Files (x86)/GnuWin32bin

.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

Antworten:

2 fĂĽr Antwort â„– 1

Die CMD mkdir unterstĂĽtzt nicht -p Schalten Sie Windows 8+ Systeme nicht mehr ein. Deshalb erhalten Sie diesen Fehler.

Wie ich in dem Kommentar sagte, erwarte das nichtmakefile / script läuft sowohl unter Windows als auch unter Linux. Normalerweise müssen Sie verschiedene Versionen bereitstellen, eine für jedes Betriebssystem, um kompliziertere Makefiles zu erstellen.

Um den Fehler mit CMD zu ĂĽberwinden 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

Den Gnuwin benutzen mkdir

Verwenden Sie doppelte AnfĂĽhrungszeichen fĂĽr die mkdir. Dadurch wird Windows gezwungen, die ausfĂĽhrbare Datei zu durchsuchen mkdir anstelle des CMD-Befehls.

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

Aktualisieren: Getestet das doppelte AnfĂĽhrungszeichen in Kali Linux, Linux Mint, Windows 7 und funktioniert auf allen. Stellen Sie einfach sicher, dass Ihre gnuwinbin ist in Ihrem Systempfad