在GNU makefile的SHELL变量中使用环境变量

3
在一个 makefile 文件中,我有以下内容:
SHELL = $(SOME_DIRECTORY)/sh

showme:
    echo $(SHELL)

这是在MS Windows上的情况。现状是makePATH中(或直接被调用),但是一个可接受的shell(即sh.exe)不在PATH中。全局修改PATH变量以包含sh.exe不是一个选项(Cygwin、msysgit等之间存在潜在冲突)。因此,make默认使用Windows的命令处理器cmd.exe,这几乎不理想。
然而,可以设置一个系统级环境变量,而不是PATH。所以我有个聪明的想法,将包含sh.exe的目录路径放入SOME_DIRECTORY中,然后在makefile中使用它作为SHELL变量。但由于某种令人沮丧的原因,它并没有起作用。
make
echo sh.exe
sh.exe

如果我使用除 SHELL 以外的任何变量并将其 echo,那么它会打印出预期的结果。但是这当然不能达到改变 shell 的预期效果。
我在这里漏掉了什么?我需要做什么才能让具有自定义用户名(即不是 SHELLPATH 等)的环境变量影响 make 使用的 shell 呢?

很不幸,make在Windows上与shell的行为非常复杂,因为Windows没有一个像样的shell。GNU make手册中有关于Windows特定行为的讨论:http://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html 如果这不能解答你的问题,我建议你在make-w32@gnu.org邮件列表上提问,该列表专门用于关于Windows上GNU make的问题 - 那里有很多非常熟悉此事的人。 - MadScientist
使用Cygwin make。非常兼容和跨平台。(例如,您的示例在那里运行良好。) - bobbogo
1个回答

0
你使用的是哪个版本?GNU make (gmake) 3.82 是最常见的版本,应该能按照你的期望工作。正如MadScientist所指出的那样,在Windows下,gmake在处理SHELL时会有不同的行为。
你应该能够将SHELL设置为现有可执行文件的完整路径,gmake将使用它来执行命令。
然而:如果SHELL未设置或设置为不存在的文件,则gmake将使用ComSpec的值(注意大小写)作为shell。
你正在使用测试路径上的exe吗?所以$(SOME_DIRECTORY)/sh是一个现有的exe吗?(请注意,你可以省略'.exe',gmake会为你提供它,但文件必须存在)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接