通过 Makefile 将目录添加到 PATH

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 不行。
  • 目标下的每个命令行都在单独的子 shell 中运行。(除了一些较旧的 BSD make 实现。)所以该export PATH行在一个 shell 上运行,然后立即终止。并不是说这条线首先会做任何事情——如果PATH在那个时候定义,那是因为它已经在 shell 的环境中了。

Make 用于自动构建事物。如果您想为交互式环境设置变量,这不是您应该考虑的工具。相反,写一个shell代码片段,以及是在当前shell:

. ./define-my-variables.sh
Run Code Online (Sandbox Code Playgroud)

在您的 makefile 中,在每个 subshel​​l 中获取脚本。您可以使用反斜杠来生成长命令;记住

  • 反斜杠-换行符序列被 make 剥离,因此 shell 不会在那里看到换行符。
  • 尽管如此,请记住在每行之前添加一个制表符。
  • 如果命令失败,Make 的错误行为是中止。默认情况下,shell 不会这样做,并且默认情况下不会注意到任何命令的失败,但最后一个命令失败,因此您需要运行set -e.
install:
    set -e; \
    . ./define-my-variables.sh; \
    mkdir -p bin; \
    …
Run Code Online (Sandbox Code Playgroud)

¹强制性说明:没有理智的方式。即使从调试器远程调用chdirviaptrace也不能像大多数 shell 那样工作,因为它们不喜欢改变当前目录。

  • 呃,我认为“你根本不能这样做”是不正确的。请参阅@Yeo 答案:https://unix.stackexchange.com/a/291973/176350 (2认同)

cjm*_*cjm 7

你不能。子make进程(如)不可能改变其父进程的环境。

你可以做类似的事情

$ eval `make pathupdate`
Run Code Online (Sandbox Code Playgroud)

pathupdate目标是这样的:

pathupdate:
    @echo PATH=\"$(PATH)\"
Run Code Online (Sandbox Code Playgroud)


Dan*_*nes 7

您的答案可以在这里找到: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 测试了这个,它对我来说很好用。