Gnuwin32, Makefile, mkdir -p?

955
nagylzs

Ich habe gnuwin32 core utils, 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 die eingebaute cmd.exe ist. Obwohl sich in meinem Pfad "c: \ Programme (x86) \ GnuWin32 \ bin" befindet, hat der integrierte Befehl Vorrang. Wenn ich also "make mo" eingebe, erhalte ich folgende Fehlermeldung:

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

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

Mit anderen Worten: Die Datei mkdir.exe ist vorhanden, kollidiert jedoch mit einem integrierten Befehl von cmd.exe. Die andere Option wäre die Verwendung einer anderen Shell unter Windows. Die Installation des Linux-Subsystems für Windows oder die Installation von cygwin würde jedoch Gigabyte Speicherplatz erfordern. Im Gegensatz dazu beträgt das für dieses Projekt benötigte gnu win32-Verzeichnis nur 40 MB.

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

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 
0

1 Antwort auf die Frage

1
Jimmy_A

Das CMD mkdirunterstützt das -pUmschalten auf Windows 8+ -Systemen nicht mehr. Deshalb erhalten Sie diesen Fehler.

Erwarten Sie nicht, dass ein Makefile / Skript sowohl unter Windows als auch unter Linux wie dieses ausgeführt wird. Normalerweise müssen Sie verschiedene Versionen angeben, eine für jedes Betriebssystem, um kompliziertere Makefiles zu erstellen.

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 

Gnuwin verwenden mkdir

Verwenden Sie doppelte Anführungszeichen für die mkdir. Dadurch wird erzwungen, dass Windows die ausführbare Datei mkdiranstelle des CMD-Befehls durchsucht .

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

Update: Das doppelte Anführungszeichen in Kali Linux, Linux Mint und Windows 7 wurde getestet und funktioniert bei allen. Stellen Sie einfach sicher, dass Sie gnuwin\binsich in Ihrem Systempfad befinden

Ich möchte mkdir von gnuwin32 verwenden. Ich denke, das war eindeutig in der Frage. Diese Option unterstützt den Schalter -p. Das von Ihnen vorgeschlagene if-Konstrukt funktioniert nicht unter Linux, nicht portabel. nagylzs vor 6 Jahren 0
@nagylzs Wenn Sie cygwin explizit verwenden möchten, ist Portabilität ein Problem, da nicht auf jedem Computer cygwin installiert werden muss oder sogar, wenn er sich an derselben Stelle befindet, an der sich Ihr Skript befindet ... Ja, dies funktioniert unter Windows aber nicht Linux. Deshalb geben Sie für jedes Betriebssystem unterschiedliche Parameter an. Ich habe Skripts und Makefiles für beide Betriebssysteme verwendet und jedes Mal, wenn ich eines für Windows und eines für Linux mache. Ich werde es morgen noch einmal anschauen und sehen, was ich tun kann Jimmy_A vor 6 Jahren 0
@nagylzs Aktualisierte Antwort. Denke, das löst dein Problem Jimmy_A vor 6 Jahren 0