
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 mkdir
não oferece -p
mais 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 mkdir
em 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\bin
esteja no caminho do sistema