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 上使用不同的 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位于系统路径中即可

相关内容