在 Makefile 变量中保存带空格的路径

Save path with spaces in Makefile variable

我正在开发一个 Makefile,它在 Linux 环境和 Windows 环境(通过 MINGW64)中执行。该脚本有一个指向应该使用的 shell 命令的变量:

SHELL:=/usr/bin/env bash

稍后,该变量被用于 运行 一个 shell 脚本:

${SHELL} ./utils/tests.sh

在 Linux 上工作得很好,但在 Windows 上使用 MINGW64 (Git Bash) 它失败了,因为 /usr/bin/env 被替换为 C:/Program Files/Git/usr/local 并且“Program Files”中有一个 space 字符中断了 Makefile 中的路径。

要解决 Windows 上的问题,我可以将 ${SHELL} 放在引号中以确保保留 space 字符:

"${SHELL}" ./utils/tests.sh

但是,这在 Linux 环境中是中断的,因为它现在变成了一个字符串并且 "/usr/bin/env bash" 不可执行。

所以我想到了这个解决方案:

ifeq ($(OS),Windows_NT)
    "${SHELL}" ./utils/tests.sh
else
    ${SHELL} ./utils/tests.sh
endif

这现在可以在两种环境(Linux 和 MINGW64)中工作,但它的缺点是在我想要 运行 脚本的任何地方都有 5 行代码。理想情况下,我只想为变量赋值一次。我试过了,但它也不起作用:

ifeq ($(OS),Windows_NT)
    SHELL:="/usr/bin/env" bash
else
    SHELL:=/usr/bin/env bash
endif

test: clean build
    ${SHELL} ./utils/tests.sh

有没有人能巧妙地解决我的问题?

您可以替换:

SHELL:=/usr/bin/env bash

使用其中之一(或任何直接指向 Bash 的可执行文件的路径):

SHELL:=/bin/bash
SHELL:=/usr/bin/bash
SHELL:=bash

这将从等式中消除 space。


话虽如此,您也应该能够直接 运行 命令,即:

./utils/tests.sh

而不是:

${SHELL} ./utils/tests.sh

这将完全消除设置和使用变量 SHELL 的需要。