Gnu make 不会将变量导出到应用程序

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

我有一个项目,在哪里构建它,我使用以下命令

make PLAT=some_string
并且 Makefile 中的 $(PLAT) 按预期设置。我的问题是没有为 Makefile 中调用的应用程序设置它。

例如,我有一个由子 Makefile 调用的 Python 脚本,其中包含:

PLAT = os.getenv("PLAT")
并报告 PLAT 尚未设置。 在顶层 Makefile 中,我还添加了
export PLAT
但即使这样也不起作用。我发现变量没有被导出的原因非常令人沮丧。 我什至添加
$(info $(shell /usr/bin/env))
来尝试查看正在导出的内容,并且根据此 PLAT 未导出,即使 $(info $(PLAT)) 显示它已设置并且我也设置了
export PLAT
。 这是 Gnu make 4.2.1.

这是一个示例 Makefile,我做错了什么?

export PLAT
$(info PLAT: $(PLAT))

$(info $(shell /usr/bin/env | grep PLAT))
make -f test.mk PLAT=hi
PLAT: hi
QT_QPA_PLATFORMTHEME=qt5ct
make: *** No targets.  Stop.

如果我从 bash shell 设置 PLAT,它会按预期工作,但我似乎无法在 Makefile 本身中创建环境变量以从命令行传递到其他应用程序。

makefile gnu-make
1个回答
0
投票

GNU 将变量作为环境变量导出到它运行的程序中。然而,使用

shell
函数时有一个问题。
shell
函数看不到导出的变量,因为它在运行任何命令(包括
export
)之前执行。

要将变量

PLAT
传递给子 Makefile 或 Python 脚本,您应该将
export
与您正在运行的实际命令结合使用。

这是更正后的示例:

export PLAT

all:
    $(info PLAT: $(PLAT))
    @/usr/bin/env | grep PLAT
    @make -f test.mk
    @your_python_script.py

请注意,

all
目标下的命令将有权访问导出的
PLAT
变量。

此外,请确保您的子 Makefile 或 Python 脚本不会无意中覆盖或取消设置

PLAT
变量。

希望这有助于解决您的问题!

© www.soinside.com 2019 - 2024. All rights reserved.