Gnuwin32, 메이크파일, mkdir -p?

Gnuwin32, 메이크파일, mkdir -p?

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. 이렇게 하면 창에서 mkdirCMD 명령 대신 실행 파일을 검색하게 됩니다.

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

업데이트:Kali Linux, Linux Mint, Windows 7에서 큰따옴표를 테스트했으며 모두에서 작동합니다. 귀하의 gnuwin\bin시스템 경로에 있는지 확인하십시오.

관련 정보