如何在makefile中获取一个shell环境变量?

197

在shell中当我输入

echo $demoPath

它打印出来了

/usr/local/demo

我该如何在makefile中获取变量$demoPath的值?

5个回答

295

如果您已经导出了环境变量:

export demoPath=/usr/local/demo

如果您在makefile中设置了环境变量,您可以通过名称简单地引用它(make会导入您设置的所有环境变量):

DEMOPATH = ${demoPath}    # Or $(demoPath) if you prefer.
如果您没有导出环境变量,它在您导出之前将无法访问,除非您在命令行中明确地传递它。

如果您没有导出环境变量,它在您导出之前将无法访问,除非您在命令行中明确地传递它:

make DEMOPATH="${demoPath}" …

如果您正在使用C shell衍生版,请将export命令替换为setenv demoPath /usr/local/demo


7
让导入所有你设置的环境变量。 它有效!太好了~我以前不知道这个,非常感谢。 - Jialin
@jonathan_leffler,我受到了你的回答的启发,做了一些不同的事情。在调用make之前,我设置了环境变量而没有导出它:demoPath=/usr/local/demo make。你可能想测试一下,或者更新你的答案。干杯! - A.D.
@A.D. 是的,这是另一种为特定命令设置环境变量值的机制。这与问题略有关联,问题是如何访问现有变量的值,而不是如何即时创建一个变量。但这并不妨碍它在某些情况下成为一种有用的技术。 - Jonathan Leffler
要注意一些特殊的变量不会自动导入。例如,$(SHELL) 确定 make 用于执行命令的 shell,其初始化为 /bin/sh 而不是环境中的值。 - Mark Reed

29
all:
    echo ${PATH}

或者仅针对一个命令更改PATH:

all:
    PATH=/my/path:${PATH} cmd

28

对于那些希望有正式文件证实此行为的人

在 make 中,变量可以来自其运行环境。当 make 启动时,它看到的每个环境变量都会转换成一个同名和同值的 make 变量。然而,在 makefile 中或使用命令参数进行显式赋值会覆盖环境变量。(如果指定了“-e”标志,则来自环境的值将覆盖 makefile 中的赋值。)

https://www.gnu.org/software/make/manual/html_node/Environment.html


5
“-e”提示很重要!但是你遗漏了一个重要的说明:“但是这不是推荐的做法”,因为现在任何变量都可以被环境覆盖。 - moi

21
如果您的.env文件位于同一目录中,您可以使用include .env语句:

.env

.env

DEMO_PATH=/usr/local/demo

Makefile

include .env

demo-path:
    echo ${DEMO_PATH}

阅读更多


你能提供一些GNU Make文档的参考资料吗?这样会更好,以便更深入地了解解决方案。 - Franco Gil
1
@FrancoGil 完成 - Dmitry Grinko
2
这让我在Mac上成功了。谢谢! - Sharif Elfouly
如果你想要在sh/bash shell中使用一个脚本文件,你也可以在.env文件中使用语法export DEMO_PATH=/usr/local/demo,就像这样. .env - John
2
为什么这个答案没有被接受呢? - undefined

17

如果你在同一个脚本中导出变量,你需要使用两个$$而不是$, 如果你的Makefile看起来像这样:

target:
        . ./init.sh; \
        echo ${HOMEPATH}:$${FOO};

init.sh脚本中,你导出了变量FOO。

$ cat ./init.sh
#!/bin/bash
export FOO=foo:

这样,当你运行make目标时,之前定义的环境变量HOMEPATH只需使用一个$显示,但在你的make文件中执行的init.sh脚本中导出的环境变量FOO需要使用$$来显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接