
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 ディレクトリはわずか 40 MB です。
実際に機能する解決策を見つけましたが、見た目が悪く、移植性がありません。
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
。そのため、このエラーが発生します。
コメントで述べたように、1 つの 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
gnuwinを使用するにはmkdir
には二重引用符を使用します。これにより、Windows はCMD コマンドではなくmkdir
実行可能ファイルを検索するようになります。mkdir
"mkdir" -p "data/locales/en/LC_MESSAGES"
アップデート:Kali Linux、Linux Mint、Windows 7で二重引用符をテストし、すべてで動作します。gnuwin\bin
システムパスにあることを確認してください。