我有一个非常简单Makefile
的方法source
来设置ENV变量.但如果我从中调用它,它就不起作用Makefile
我收到这个错误
make dev
source ./bin/authenticate.sh
make: source: No such file or directory
make: *** [dev] Error 1
Run Code Online (Sandbox Code Playgroud)
该脚本存在.
如果我在命令行中运行它,它的工作原理.
source ./bin/authenticate.sh
Works!
Run Code Online (Sandbox Code Playgroud)
这是我的 Makefile
test:
pytest -s
dev:
source ./bin/authenticate.sh
Run Code Online (Sandbox Code Playgroud)
我正在使用OSX.我不确定这是否会有所作为.
tldr; 丢失source
,请使用点(.
)
后面有更长的解释...
因为它不工作,make
正在寻找一个source
程序中$PATH
。之所以失败,source
是因为它是内置的(非POSIX)shell,而不是任何传统的类似UNIX的系统上的可执行程序。
我能够复制问题中显示的失败;在Ubuntu 16.04上使用GNU Make v4.1生成了以下(非常删节的)输出:
$ strace -f -s65536 -- make dev 2>&1 | grep 'authenticate'
read(3, "test:\n\tpytest -s\n\ndev:\n\tsource ./bin/authenticate.sh\n", 4096) = 53
write(1, "source ./bin/authenticate.sh\n", 29source ./bin/authenticate.sh
[pid 32100] execve("/usr/local/sbin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/usr/local/bin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/usr/sbin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/usr/bin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/sbin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/bin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
您会发现make
尝试查找该source
程序失败了六次。即,针对my的每个组成部分$PATH
。
如果source
更改为.
,则make
更改其策略;与其尝试查找和执行程序,不如将规则主体传递给系统外壳程序:
$ strace -f -s65536 -- make dev 2>&1 | grep 'authenticate'
read(3, "test:\n\tpytest -s\n\ndev:\n\t. ./bin/authenticate.sh\n", 4096) = 48
write(1, ". ./bin/authenticate.sh\n", 24. ./bin/authenticate.sh
[pid 32122] execve("/bin/sh", ["/bin/sh", "-c", ". ./bin/authenticate.sh"], [/* 82 vars */]) = 0
[pid 32122] open("./bin/authenticate.sh", O_RDONLY) = 3
Run Code Online (Sandbox Code Playgroud)
所使用的外壳类型make
决定了每个Makefile
规则中扩展哪些外壳内置。您可以make
像这样使用自己选择的外壳:
$ cat Makefile
SHELL = /bin/bash
test:
pytest -s
dev:
source ./bin/authenticate.sh
Run Code Online (Sandbox Code Playgroud)
由于bash
将内置定义source
为的同义词.
,因此source
现在使用的规则成功:
$ strace -f -s65536 -- make dev 2>&1 | grep 'authenticate'
read(3, "SHELL = /bin/bash\ntest:\n\tpytest -s\n\ndev:\n\tsource ./bin/authenticate.sh\n", 4096) = 71
write(1, "source ./bin/authenticate.sh\n", 29source ./bin/authenticate.sh
[pid 32573] execve("/bin/bash", ["/bin/bash", "-c", "source ./bin/authenticate.sh"], [/* 82 vars */]) = 0
[pid 32573] open("./bin/authenticate.sh", O_RDONLY) = 3
Run Code Online (Sandbox Code Playgroud)
参考文献:
归档时间: |
|
查看次数: |
2608 次 |
最近记录: |