目前我正在使用具有如下定义的 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