gnuMake,如何覆盖环境变量

gnuMake,如何覆盖环境变量

目前我正在使用具有如下定义的 Makefiles

MYLIB=/.../mylib-1.2.34

问题是这些对于不同的开发人员来说是不同的,并且每次签出后都必须重新编辑文件是一件痛苦的事情。

所以我尝试导出特定的环境变量,然后执行

MYLIBX:=$(MYLIB_ENV)
MYLIBX?=MYLIB

问题是,如果未定义 MYLIB_ENV,它仍然会创建一个空的 MYLIBX,因此 ?= 不起作用。有没有一种干净的方法来完成这个非常基本的事情?

我正在使用多年来开发的一组“丰富”的 make 文件,这些文件可以执行各种操作,例如互相生成和调用,因此无法进行深入的更改。

解决方案

双重洗牌。 MYLIB 已定义。

MYLIB_ENV?=MYLIB
MYLIB:=MYLIB_ENV

答案1

问题在于

MYLIB:=$(MYLIB_ENV)
MYLIB?=/.../mylib-1.2.34

总是MYLIB在第一行中定义,因此第二行从不适用。

在这种情况下,典型的方法就是

MYLIB?=/.../mylib-1.2.34

这样,各个开发人员就可以在命令make行上从 shell 指定自己的值

make MYLIB=...

或者在运行之前在他们的环境中make

export MYLIB=...
make

(这样他们就可以设置一次,例如在他们的 shell 启动脚本中,然后忘记它)。

如果你只是跑

make

如果不指定 的值,则使用MYLIB默认值。/.../mylib-1.2.34

另一种选择是确定 Makefile 的存储位置,但这并不适用于所有情况(特别是如果 Makefile 的路径包含空格)。

答案2

目前还不清楚你到底想要什么。但是,如果您希望需要将 make 变量 MYLIB 的设置覆盖为与 Makefile 中指定的内容不同的设置,而不必为此编辑 Makefile,则非常简单:在调用中,make指定MYLIB具有您选择的值的命令行,例如:

make -f yourmakefile yourtarget MYLIB="I_need_my_personal_value"

另一种方法:

MYLIB := ORIGINAL_VALUE

ifneq '$(MYLIB_ENV)' ''
MYLIB := $(MYLIB_ENV)
endif

相关内容