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

Jia*_*lin 81 shell makefile

在我进入时的shell中

echo $demoPath
Run Code Online (Sandbox Code Playgroud)

它打印

/usr/local/demo
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 111

如果您已导出环境变量:

export demoPath=/usr/local/demo
Run Code Online (Sandbox Code Playgroud)

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

DEMOPATH = ${demoPath}    # Or $(demoPath) if you prefer.
Run Code Online (Sandbox Code Playgroud)

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

make DEMOPATH="${demoPath}" …
Run Code Online (Sandbox Code Playgroud)

如果您使用的是C shell派生,请替换setenv demoPath /usr/local/demoexport命令.

  • "make import你设置的所有环境变量".它有效!很好〜,我以前对此一无所知,非常感谢你. (2认同)

Dmi*_*nko 27

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

.env

DEMO_PATH=/usr/local/demo
Run Code Online (Sandbox Code Playgroud)

生成文件

include .env

demo-path:
    echo ${DEMO_PATH}
Run Code Online (Sandbox Code Playgroud)

阅读更多

  • 为什么这不是公认的答案? (3认同)
  • 这使得它在 mac 上对我有用。谢谢! (2认同)

g10*_*ang 18

all:
    echo ${PATH}
Run Code Online (Sandbox Code Playgroud)

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

all:
    PATH=/my/path:${PATH} cmd
Run Code Online (Sandbox Code Playgroud)


Dyn*_* Fu 17

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

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

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

  • `-e` 提示是黄金!但是您忽略了一个重要的评论:“但这不是推荐的做法”,因为现在*任何*变量都可以被环境覆盖。 (2认同)

Ali*_*Ali 16

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

target:
        . ./init.sh; \
        echo ${HOMEPATH}:$${FOO};
Run Code Online (Sandbox Code Playgroud)

init.sh脚本中导出变量 FOO

$ cat ./init.sh
#!/bin/bash
export FOO=foo:
Run Code Online (Sandbox Code Playgroud)

这样,当您运行 make target 时,脚本运行之前定义的环境变量HOMEPATH将仅使用一个$显示,但在make 文件内执行的init.sh脚本中导出的环境变量FOO将需要$$为了显示