我已经安装了 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 上使用不同的 shell。但安装 Windows 的 linux 子系统或安装 cygwin 需要数 GB 的磁盘空间。相比之下,该项目所需的 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,您需要提供不同的版本,每个操作系统一个。
使用 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
位于系统路径中即可