Gnuwin32, makefile, mkdir -p?

0

Eu instalei o gnuwin32 core utils, 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 que se parece com isso:

.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 embutido. Mesmo que eu tenha "c: \ Arquivos de Programas (x86) \ GnuWin32 \ bin" no meu caminho, o comando interno tem precedência. Então, quando eu digito "make mo", eu recebo este erro:

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

Eu poderia substituir o mkdir por "c: \ Arquivos de programas (x86) \ GnuWin32 \ bin \ mkdir.exe" no makefile, mas isso não parece correto. 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 interno do cmd.exe. A outra opção seria usar um shell diferente no Windows. Mas a instalação do subsistema linux para Windows ou a instalação do cygwin exigiria gigabytes de espaço em disco. Em contraste, o diretório win32 do gnu necessário para este projeto é de apenas 40MB.

Eu encontrei uma solução que realmente funciona, mas é feia e não é portável:

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
    
por nagylzs 25.09.2017 / 08:15

1 resposta

1

O CMD mkdir não suporta mais a comutação -p nos 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 tanto no Windows quanto 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 gnuwin mkdir

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

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

Atualização: Testei as aspas duplas no Kali Linux, no Linux Mint, no Windows 7 e funciona em todas elas. Apenas certifique-se de que seu gnuwin\bin esteja no caminho do seu sistema

    
por 25.09.2017 / 10:20