从GNU Make中的子bash脚本导出环境变量

问题描述 投票:0回答:2

我有一个脚本“ set_env.py”,它输出以下uppon执行:

export MY_VAR_1=some_value
export MY_VAR_2=some_other_value

我无法更改此脚本,它是在当前环境中提供的。

此外,我还有一个看起来像这样的Makefile:

SHELL := /bin/bash

all: set_env
    env | grep MY_VAR    

set_env:
    eval ./set_env.py

使用此makefile,我希望grep列出我的两个变量,但是似乎未设置环境。

我怀疑这是因为make为每一行都创建了一个子环境,因此第一行中设置的变量在第二行中将不可用。

所以问题是,我将如何从我的Makefile中不可触摸的脚本中导出环境

bash makefile environment-variables export gnu-make
2个回答
2
投票
实际上,python的输出是有效的

make。然后,一种选择是将python的输出直接读取到makefile中。美中不足的是$(shell)没有切芥末。

include Environment.mk PHONY: test test: env | grep MY_VAR Environment.mk: ./set_env.py >$@-tmp mv $@-tmp $@
这是如何工作的?

make

试图做的第一件事是确保makefile本身是最新的。既然我们告诉它包含Environment.mkmake也必须确保它是最新的。
  • Make
Environment.mk]查找规则Python运行,创建Environment.mk
  • Environment.mk被读入,使用export属性创建两个
  • make
  • 变量
    makefile现在是最新的,因此
  • make
  • 继续执行目标(在这种情况下为test
  • Make
  • 运行test的配方,并导出具有export属性的所有变量。
    没有递归,但是您应该确保python总是吐出

    make兼容的语法。

    编辑

    正如@raspy指出的,这不是全部。就目前而言,一旦创建了Environment.mk,它永远不会被再生。

    如果set_env.py产生不同的输出,您应该通过添加依赖性来告诉

    make

    这些条件是什么。
    如果set_env.py需要很短的时间才能运行,我建议一个简单的.PHONY。这样,它将在您每次运行

    make

    时运行,并且Environment.mk永远不会过时。
    .PHONY: Environment.mk

    0
    投票
    恐怕递归品牌是您的朋友。
    © www.soinside.com 2019 - 2024. All rights reserved.