Gnuwin32、makefile、mkdir -p?

Gnuwin32、makefile、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 ディレクトリはわずか 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システムパスにあることを確認してください。

関連情報