Makefile含空格路径SHELL变量跨Linux与MINGW64兼容方案问询
跨Linux/MINGW64环境Makefile SHELL变量兼容方案
核心解决思路:仅执行一次系统判断,定义通用执行前缀变量全局复用,不需要每次执行脚本都重复写判断逻辑。
实现代码
首先在Makefile最开头完成一次全局配置:
# 全局指定使用bash作为shell解释器 SHELL := /usr/bin/env bash # 仅执行一次跨平台兼容判断,定义统一的shell调用前缀 ifeq ($(OS),Windows_NT) # Windows环境下添加引号保留路径空格 SHELL_EXEC := "$(SHELL)" else # Linux环境下直接使用原始变量 SHELL_EXEC := $(SHELL) endif
后续所有需要调用shell脚本的场景,直接使用${SHELL_EXEC}即可:
test: clean build ${SHELL_EXEC} ./utils/tests.sh deploy: ${SHELL_EXEC} ./utils/deploy.sh lint: ${SHELL_EXEC} ./utils/lint.sh
原错误写法原因说明
你之前尝试的SHELL变量定义写法失败,是因为Make会将SHELL变量的内容整体解析为可执行文件路径,Windows下的写法把引号内嵌到变量中,会导致Make将"/usr/bin/env"(带引号的字符串)当做可执行文件查找,无法正确拆分env和bash两个参数,因此运行报错。
可选简化方案(满足前提可使用)
如果你的Linux和MINGW64环境都已经将bash加入系统PATH,也可以直接简化SHELL定义,完全避开空格问题:
SHELL := bash
该写法在两类环境下都可以直接使用${SHELL} ./utils/tests.sh执行,不需要额外判断,前提是所有运行环境的PATH中都能找到bash命令。
内容的提问来源于stack exchange,提问作者Benny Neugebauer
相关产品推荐
相关产品推荐

