Gnuwin32, makefile, mkdir -p?

Gnuwin32, makefile, mkdir -p?

Eu instalei os utilitários principais gnuwin32, make e gettext:

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

Eu tenho um makefile parecido com este:

.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

O problema é que o comando mkdir é o cmd.exe integrado. Mesmo que eu tenha "c:\Program Files (x86)\GnuWin32\bin" no meu caminho, o comando interno tem precedência. Então, quando digito "make mo", recebo este erro:

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

Eu poderia substituir mkdir por "c:\Program Files (x86)\GnuWin32\bin\mkdir.exe" no makefile, mas isso não parece certo. Em um sistema diferente, alguém pode ter um local diferente para o gnuwin32.

Em outras palavras: o mkdir.exe está lá, mas entra em conflito com um comando integrado do cmd.exe. A outra opção seria usar um shell diferente no Windows. Mas instalar o subsistema Linux para Windows ou instalar o cygwin exigiria gigabytes de espaço em disco. Por outro lado, o diretório gnu win32 necessário para este projeto tem apenas 40 MB.

Encontrei uma solução que realmente funciona, mas é feia e não é 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

Responder1

O CMD mkdirnão oferece -pmais suporte para switch em sistemas Windows 8+. É por isso que você recebe esse erro.

Como eu disse no comentário, não espere que um makefile/script seja executado no Windows e no Linux como este. Normalmente você precisará fornecer versões diferentes, uma para cada sistema operacional para makefiles mais complicados.

Para superar o erro com CMD mkdir(somente para Windows):

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

ou para um comando mais curto

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 o gnuwinmkdir

Use aspas duplas no mkdir. Isso forçará o Windows a pesquisar o executável mkdirem vez do comando CMD.

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

Atualizar:Testei as aspas duplas no Kali Linux, Linux Mint, Windows 7 e funciona em todos eles. Apenas certifique-se de que você gnuwin\binesteja no caminho do sistema

informação relacionada