在 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
的需要。
我正在开发一个 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
的需要。