Git for Windows环境下强制GNU Make指定Shell及参数的方法
Git for Windows中GNU Make自定义Shell的问题
在Git for Windows(MSYS2简化发行版)中运行GNU Make 3.81(编译目标为i386-pc-mingw32),期望它能像Unix系统中一样工作,但始终无法修改默认SHELL。GNU Make为适配MS-DOS做了大量兼容处理,试过官方文档里的所有方法都无效。
调试输出显示Make默认会自动设置Shell:
$ make -d GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i386-pc-mingw32 find_and_set_shell path search set default_shell = C:/Program Files/Git/usr/bin/sh.exe ...
编写了简单Makefile测试:
SHELL := /usr/bin/bash info: $(info path is $(PATH)) $(info shell is $(SHELL))
尽管bash.exe已在PATH中,Make仍使用默认Shell。尝试过将bash.exe放到默认sh.exe的同一目录,也遵循文档中的Unix路径转换建议,均无效。
只有使用绝对路径才能生效:
- Windows格式:
SHELL := C:/Program Files/Git/usr/bin/bash.exe - MSYS路径格式:
SHELL := /c/Program Files/Git/usr/bin/bash.exe
但此时.SHELLFLAGS选项仍被忽略。在Unix系统中只需设置export SHELL = /bin/bash -xe即可传递参数,但在当前环境下:
export SHELL = C:/Program Files/Git/usr/bin/bash.exe .SHELLFLAGS = --help something: missingcommand
运行结果:
$ make something /usr/bin/bash: line 1: missingcommand: command not found
(至少现在能正确调用bash了,但.SHELLFLAGS完全没起作用)
目前有两个核心问题:
- 有没有办法覆盖GNU Make的所有MS-DOS兼容逻辑,强制使用指定的Shell?(讽刺的是,如果GNU Make支持
SHELL=/bin/bash -xec这种写法,在MSYS2/Git for Windows中就能正常工作) - 如何在该环境下正确设置SHELL和.SHELLFLAGS,同时保证Makefile能在Unix系统中正常使用?
内容的提问来源于stack exchange,提问作者gcb
相关产品推荐
相关产品推荐

