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

Posted

技术标签:

【中文标题】如何在makefile中获取shell环境变量?【英文标题】:How to get a shell environment variable in a makefile? 【发布时间】:2015-05-07 13:50:41 【问题描述】:

当我进入时在shell中

echo $demoPath

打印出来

/usr/local/demo

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

【问题讨论】:

【参考方案1】:

如果您已导出环境变量:

export demoPath=/usr/local/demo

您可以在makefile 中简单地按名称引用它(make 导入您设置的所有环境变量):

DEMOPATH = $demoPath    # Or $(demoPath) if you prefer.

如果您没有导出环境变量,则在您导出它之前无法访问它,或者除非您在命令行上显式传递它:

make DEMOPATH="$demoPath" …

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

【讨论】:

"make 导入你设置的所有环境变量"。它有效!不错~,我以前不知道这个,非常感谢。 @jonathan_leffler 我被你的回答启发了,我做了一些不同的事情。我在调用 make 之前设置了 envvar 而不导出它:demoPath=/usr/local/demo make。您可能想对其进行测试,并可能更新您的答案。干杯! @A.D.是的,这是为特定命令设置环境变量值的另一种机制。这与询问如何访问现有变量的值而不是如何动态创建变量的问题有点相切。它并不妨碍它在某些时候成为一种有用的技术。【参考方案2】:
all:
    echo $PATH

或者只为一个命令更改 PATH:

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

【讨论】:

【参考方案3】:

对于那些想要一些官方文件来确认行为的人

make 中的变量可以来自 make 运行的环境。 make 启动时看到的每个环境变量都是 转换为具有相同名称和值的 make 变量。 但是,makefile 中的显式分配,或使用命令 参数,覆盖环境。 (如果指定了“-e”标志, 然后环境中的值会覆盖 makefile 中的分配。

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

【讨论】:

-e 提示是金!但是你忽略了一个重要的评论:“但这不是推荐的做法”,因为现在 any 变量可以被环境覆盖。【参考方案4】:

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

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

init.sh 脚本中导出变量 FOO

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

这样,当你运行 make target 时,在脚本运行之前定义的环境变量 HOMEPATH 将仅使用一个 $ 显示,但环境变量 在同一脚本中导出的 FOO 需要 $$ 才能显示

【讨论】:

以上是关于如何在makefile中获取shell环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Makefile 规则中将 env 变量传递给 shell 脚本

Makefile引用与环境变量

Linux开发基础知识shell语法整理

Linux开发基础知识shell语法整理

如何在Makefile操作中使用shell变量?

如何在 Ruby 脚本中为命令 shell 获取环境变量?