
gnuwin32 핵심 유틸리티, make 및 gettext를 설치했습니다.
http://gnuwin32.sourceforge.net/packages/coreutils.htm
http://gnuwin32.sourceforge.net/packages/make.htm
http://gnuwin32.sourceforge.net/packages/gettext.htm
다음과 같은 makefile이 있습니다.
.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
문제는 mkdir 명령이 cmd.exe에 내장되어 있다는 것입니다. 경로에 "c:\Program Files (x86)\GnuWin32\bin"이 있더라도 내장 명령이 우선 적용됩니다. 그래서 "make mo"를 입력하면 다음 오류가 발생합니다.
A subdirectory or file data/locales/en/LC_MESSAGES already exists.
makefile에서 mkdir을 "c:\Program Files (x86)\GnuWin32\bin\mkdir.exe"로 바꿀 수 있지만 이는 올바르지 않은 것 같습니다. 다른 시스템에서는 누군가 gnuwin32의 위치가 다를 수 있습니다.
즉, mkdir.exe가 있지만 cmd.exe의 내장 명령과 충돌합니다. 다른 옵션은 Windows에서 다른 셸을 사용하는 것입니다. 그러나 Windows용 Linux 하위 시스템을 설치하거나 cygwin을 설치하려면 기가바이트의 디스크 공간이 필요합니다. 대조적으로, 이 프로젝트에 필요한 gnu win32 디렉토리는 40MB에 불과합니다.
실제로 작동하는 솔루션을 찾았지만 보기 흉하고 이식성이 없습니다.
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
답변1
CMD는 Windows 8+ 시스템에서 더 이상 스위치를 mkdir
지원하지 않습니다 . -p
이것이 바로 이 오류가 발생하는 이유입니다.
내가 댓글에서 말했듯이, 하나의 makefile/스크립트가 이와 같이 Windows와 Linux 모두에서 실행될 것이라고 기대하지 마십시오. 일반적으로 더 복잡한 makefile의 경우 각 OS마다 하나씩 다양한 버전을 제공해야 합니다.
CMD로 오류를 해결하려면 mkdir
(Windows에만 해당):
if not exist "data/locales/en/LC_MESSAGES" mkdir "data/locales/en/LC_MESSAGES"
또는 더 짧은 명령의 경우
en = "data/locales/en/LC_MESSAGES"
hu = "data/locales/hu/LC_MESSAGES"
if not exist $en mkdir $en
if not exist $hu mkdir $hu
그누윈을 사용하려면mkdir
에는 큰따옴표를 사용하십시오 mkdir
. 이렇게 하면 창에서 mkdir
CMD 명령 대신 실행 파일을 검색하게 됩니다.
"mkdir" -p "data/locales/en/LC_MESSAGES"
업데이트:Kali Linux, Linux Mint, Windows 7에서 큰따옴표를 테스트했으며 모두에서 작동합니다. 귀하의 gnuwin\bin
시스템 경로에 있는지 확인하십시오.