Answers:
您根本无法做到这一点。make方法无法改变其父级环境(或当前目录,您可能会想到下一个)。
实际上,发生的事情比您想象的要少。
make
实现都反映PATH
了环境中对make 变量的分配。GNU make(可以在Linux和其他系统上找到)可以,但是BSD make不能。export PATH
行在shell中运行,该shell随后立即终止。并不是说这行首先要做任何事情-如果PATH
在那时定义,那是因为它已经在shell的环境中了。Make是用于自动构建事物的。如果要为交互式环境设置变量,那么这不是您应该使用的工具。相反,写一个shell代码片段,以及源是在当前shell:
. ./define-my-variables.sh
在您的makefile中,在每个subshell中提供脚本源。您可以使用反斜杠发出长命令;记住
set -e
。install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ 强制性说明:不可理智。即使chdir
通过ptrace
调试器进行远程调用也无法像大多数Shell一样工作,因为它们不希望将当前目录更改到他们的脚下。
您的答案可以在这里找到:https : //stackoverflow.com/a/8942216/367461
基本上,您应该这样做:
export PATH := $(shell pwd)/bin:$(PATH)
test:
mkdir -p ./bin
@echo $(PATH)
我在Fedora 23上使用GNU Make 4.0对此进行了测试,它对我来说很好用。
.SHELL: name=sh path=/path/to/wrapper-script
然后制作一个包装器脚本,例如export FOO=bar; exec bash "$@"
我将要问同样的问题,因为我无法使其他答案示例正常工作。
但是,我设法通过使用eval
命令为我实现了可行的解决方案。我不太确定为什么以前没有发布。
do_something:
$(eval export PATH=$(shell pwd)/bin:$(PATH))
@echo $(PATH)
注意:
PATH
更改是make自身内部的临时操作。从make退出后,PATH将重置为较早的值。
export PATH=…
上do_something:
线,你不需要eval
。