我有一个项目,在哪里构建它,我使用以下命令
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 本身中创建环境变量以从命令行传递到其他应用程序。
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
变量。
希望这有助于解决您的问题!