在Makefile中设置PATH时出现问题

Phi*_*ton 9 makefile

我是make和Makefiles的新手,但是我正在尝试为我的下一个项目创建一个而且我遇到了PATH问题.我一直收到错误:"没有这样的文件或目录"

我已经创建了一个简单的目标test,它使用mocha运行我的所有测试.

Mocha作为本地节点模块安装,因此可以在其中找到其可执行文件./node_modules/.bin/mocha.我正在改变我的PATH,如本教程中所述,所以我可以将其称为mocha而不是键入完整路径,但似乎有些东西不起作用.

这是我到目前为止所拥有的:

export PATH := node_modules/.bin:$(PATH)

test:
    which mocha
    mocha

.PHONY: test
Run Code Online (Sandbox Code Playgroud)

当我运行时,make test我得到以下输出:

which mocha
node_modules/.bin/mocha
mocha
make: mocha: No such file or directory
make: *** [test] Error 1
Run Code Online (Sandbox Code Playgroud)

正如您从输出中看到的那样,which mocha正确地打印了mocha可执行文件的路径,但是当我只是运行时mocha,它找不到它.

我究竟做错了什么?关于Makefiles中可变范围或持久性的更多图片我是否缺少?

PS如果它很重要,我正在使用Mac和XCode开发人员工具附带的make版本.这是我跑步时得到的make -v

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-apple-darwin11.3.0
Run Code Online (Sandbox Code Playgroud)

tom*_*tom 10

在OSX中,您还需要设置SHELL:

PATH  := node_modules/.bin:$(PATH)
SHELL := /bin/bash
Run Code Online (Sandbox Code Playgroud)


Mad*_*ist 8

我无法重现您的结果(在GNU/Linux系统上使用GNU make 3.81).似乎Apple系统的工作方式可能存在一些差异,或者Apple已经对他们发布的GNU make版本进行了某种修补,导致了这个问题.

GNU make有两种运行配方的方法:正常方式,它调用shell并将配方传递给要运行的shell,以及"快速路径",如果make看到命令"足够简单"(也就是说,如果它不包含shell特殊字符),它会将命令切换成单词并直接执行命令而不调用shell.后者要快得多,但由于它是直接调用的,它继承了PATHGNU make本身的设置而不是shell.

似乎由于某种原因,Apple发布的GNU make版本无法正常工作,因为它没有正确地为GNU make直接运行的命令设置环境,通过"快速路径".

我对GNU制作邮件列表中讨论的内容有一个非常模糊的回忆,但是在花了一些时间搜索之后,我无法想出任何东西.

您可以通过强制命令使用慢速路径,通过引入一些shell特殊字符(通配符;,管道等)来"修复"此问题.或者您可以使用程序的完全限定路径.

或者,您可以获取GNU make的源代码并自行构建; 如果这种差异是苹果公司"修复"的结果,应该让它更好地运作.或者从自制软件或端口安装GNU make,这也将为您提供具有更多功能的更新版本.

  • 要检查的另一件事是将`mocha`的调用更改为:`:; mocha`.这样做将绕过GNU make的快速路径处理并强制它调用shell.如果这样可行,那么我更加怀疑Apple版本的GNU make有些奇怪. (2认同)