10 make path environment-variables
我在将我在 Makefile 中修改的 PATH 导出到当前终端时遇到了一些麻烦。我正在尝试添加到 PATH,即 Makefile 目录所在的 bin 文件夹。
这是 makefile 的相关片段:
PATH := $(shell pwd)/bin:$(PATH)
install:
mkdir -p ./bin
export PATH
echo $(PATH)
Run Code Online (Sandbox Code Playgroud)
echo 打印正确,但如果我在终端中重做 echo,PATH 保持不变。
Gil*_*il' 16
你根本无法做到这一点。没有办法¹ make 进程可以更改其父级的环境(或其当前目录,您接下来可能会想到)。
事实上,发生的事情比你想象的还要少。
make实现都反映了PATH对环境中make变量的赋值;GNU make(可在 Linux 和其他系统上找到)可以,但 BSD make 不行。export PATH行在一个 shell 上运行,然后立即终止。并不是说这条线首先会做任何事情——如果PATH在那个时候定义,那是因为它已经在 shell 的环境中了。Make 用于自动构建事物。如果您想为交互式环境设置变量,这不是您应该考虑的工具。相反,写一个shell代码片段,以及源是在当前shell:
. ./define-my-variables.sh
Run Code Online (Sandbox Code Playgroud)
在您的 makefile 中,在每个 subshell 中获取脚本。您可以使用反斜杠来生成长命令;记住
set -e.install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
Run Code Online (Sandbox Code Playgroud)
¹强制性说明:没有理智的方式。即使从调试器远程调用chdirviaptrace也不能像大多数 shell 那样工作,因为它们不喜欢改变当前目录。
你不能。子make进程(如)不可能改变其父进程的环境。
你可以做类似的事情
$ eval `make pathupdate`
Run Code Online (Sandbox Code Playgroud)
当pathupdate目标是这样的:
pathupdate:
@echo PATH=\"$(PATH)\"
Run Code Online (Sandbox Code Playgroud)
您的答案可以在这里找到:https : //stackoverflow.com/a/8942216/367461
基本上,你应该这样做:
export PATH := $(shell pwd)/bin:$(PATH)
test:
mkdir -p ./bin
@echo $(PATH)
Run Code Online (Sandbox Code Playgroud)
我在 Fedora 23 上用 GNU Make 4.0 测试了这个,它对我来说很好用。