Gnuwin32, archivo MAKE, mkdir -p?

Gnuwin32, archivo MAKE, mkdir -p?

He instalado las utilidades principales de gnuwin32, make y gettext:

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

Tengo un archivo MAKE que se parece a esto:

.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

El problema es que el comando mkdir es el cmd.exe integrado. Aunque tengo "c:\Program Files (x86)\GnuWin32\bin" en mi ruta, el comando integrado tiene prioridad. Entonces, cuando escribo "make mo", aparece este error:

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

Podría reemplazar mkdir con "c:\Program Files (x86)\GnuWin32\bin\mkdir.exe" en el archivo MAKE, pero eso no parece correcto. En un sistema diferente, alguien podría tener una ubicación diferente para gnuwin32.

En otras palabras: mkdir.exe está ahí, pero entra en conflicto con un comando integrado de cmd.exe. La otra opción sería utilizar un shell diferente en Windows. Pero instalar el subsistema Linux para Windows o instalar cygwin requeriría gigabytes de espacio en disco. Por el contrario, el directorio gnu win32 necesario para este proyecto es de sólo 40 MB.

Encontré una solución que realmente funciona, pero es fea y no portátil:

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

Respuesta1

El CMD ya mkdirno admite -pel cambio en sistemas Windows 8+. Es por eso que aparece este error.

Como dije en el comentario, no espere que un archivo MAKE/script se ejecute tanto en Windows como en Linux como lo hace este. Por lo general, necesitarás proporcionar diferentes versiones, una para cada sistema operativo para archivos MAKE más complicados.

Para superar el error con CMD mkdir(solo para Windows):

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

o para un comando más corto

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

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

Para usar el gnuwinmkdir

Utilice comillas dobles en mkdir. Esto obligará a Windows a buscar el ejecutable mkdiren lugar del comando CMD.

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

Actualizar:Probé la comilla doble en Kali Linux, Linux Mint, Windows 7 y funciona en todos ellos. Solo asegúrate de que gnuwin\binestés en la ruta de tu sistema.

información relacionada