Makefile with source get error`没有这样的文件或目录`

时间:2017-05-18 15:34:37

标签: macos makefile

我有一个非常简单的Makefile正在做source来设置ENV变量。但如果我从Makefile

调用它,它就不起作用

我收到此错误

make dev
source ./bin/authenticate.sh
make: source: No such file or directory
make: *** [dev] Error 1

该脚本存在。

如果我在命令行中运行它,它可以工作。

source ./bin/authenticate.sh
Works!

这是我的Makefile

test:
    pytest -s

dev:
    source ./bin/authenticate.sh

我正在使用OSX。我不确定这是否会产生影响。

2 个答案:

答案 0 :(得分:3)

tldr;失去let nib = UINib(nibName: "MessageTableViewCell", bundle: nil) tableView.register(nib, forCellReuseIdentifier: "messageTableViewCell") ,使用点(source

更多解释如下...

这不起作用,因为.make中寻找source 程序。之所以失败,是因为$PATH是内置的(非POSIX)外壳程序,而不是任何常规的类似UNIX的系统上的可执行程序。

我能够复制问题中显示的失败;在Ubuntu 16.04上使用GNU Make v4.1生成了以下(非常删节的)输出:

source

您可以看到$ 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) 六次失败的尝试来找到make程序;即我的source的每个组成部分一个。

如果将$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 使用的shell类型决定了每个make规则中扩展哪些shell内置函数。您可以像这样告诉Makefile使用您选择的外壳:

make

由于$ cat Makefile SHELL = /bin/bash test: pytest -s dev: source ./bin/authenticate.sh 将内置bash定义为source的同义词,因此使用.的规则现在成功了:

source

参考文献:

答案 1 :(得分:0)

cd bin && source authenticate.sh它有效