我是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)
我无法重现您的结果(在GNU/Linux系统上使用GNU make 3.81).似乎Apple系统的工作方式可能存在一些差异,或者Apple已经对他们发布的GNU make版本进行了某种修补,导致了这个问题.
GNU make有两种运行配方的方法:正常方式,它调用shell并将配方传递给要运行的shell,以及"快速路径",如果make看到命令"足够简单"(也就是说,如果它不包含shell特殊字符),它会将命令切换成单词并直接执行命令而不调用shell.后者要快得多,但由于它是直接调用的,它继承了PATH
GNU make本身的设置而不是shell.
似乎由于某种原因,Apple发布的GNU make版本无法正常工作,因为它没有正确地为GNU make直接运行的命令设置环境,通过"快速路径".
我对GNU制作邮件列表中讨论的内容有一个非常模糊的回忆,但是在花了一些时间搜索之后,我无法想出任何东西.
您可以通过强制命令使用慢速路径,通过引入一些shell特殊字符(通配符;
,管道等)来"修复"此问题.或者您可以使用程序的完全限定路径.
或者,您可以获取GNU make的源代码并自行构建; 如果这种差异是苹果公司"修复"的结果,应该让它更好地运作.或者从自制软件或端口安装GNU make,这也将为您提供具有更多功能的更新版本.