Gnuwin32、makefile、mkdir -p?

Gnuwin32、makefile、mkdir -p?

我已經安裝了 gnuwin32 core utils、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 上使用不同的 shell。但是安裝 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

CMDmkdir不再支援-pWindows 8+ 系統上的切換。這就是您收到此錯誤的原因。

正如我在評論中所說,不要指望一個 makefile/腳本能夠像這個一樣在 Windows 和 Linux 上運行。通常您需要提供不同的版本,針對更複雜的 makefile 為每個作業系統提供一個版本。

使用 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

使用 gnuwinmkdir

在 上使用雙引號mkdir。這將強制 Windows 搜尋可執行檔mkdir而不是 CMD 命令。

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

更新:在 Kali Linux、Linux Mint、Windows 7 中測試了雙引號,並且適用於所有這些系統。只要確保你的gnuwin\bin在你的系統路徑中

相關內容