
我已經安裝了 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
不再支援-p
Windows 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
在你的系統路徑中