刚开始使用 Makefile,我已经大量使用通过 args 覆盖变量的功能。但有时我必须覆盖三个或更多,这变得有点烦人。
所以我的问题是:Make 是否有内置功能来获取纯文本文件并覆盖某些变量? (就像我们对 dotenv 库所做的那样)
我能够实现此目的的唯一方法是创建一个内部 IF/ELSE IF/ELSE 块,由(例如)名为 env 的变量控制。它工作得很好,但我确实觉得它使整个 Makefile 不必要地臃肿。
谢谢。
目前还不清楚您在寻找什么,但您可以执行一些操作,例如将其添加到 makefile 的最后:
include $(wildcard local.mk)
然后,如果文件
local.mk
存在,它将被包含在内,并且其中的任何变量都将在调用配方时生效(因为它们是最后设置的)。
但是,如果您之前已经在直接上下文中使用过这些变量,则会出现问题。例如,如果您有:
FOO = foo
MYVAR := $(FOO)
all: ; @echo $(MYVAR)
include $(wildcard local.mk)
其中
local.mk
包含 FOO = bar
,这不会有帮助,因为 MYVAR
在引用包含文件之前已设置为 FOO
的值。
另一种选择是先放置
include
,然后小心地始终使用 ?=
而不是 =
,以便变量保留现有值:
include $(wildcard local.mk)
FOO ?= foo
MYVAR := $(FOO)
all: ; @echo $(MYVAR)
会起作用,但如果你忘记并使用
FOO = foo
,那么你的局部变量将不会生效。
如果您担心这一点,另一种选择是在
override
中使用 local.mk
;如果它包含 override FOO = bar
那么上面的第二种方法(首先是 include
)将起作用,即使您在 makefile 中重置了 FOO
,该设置将被忽略。但是,如果您这样做,那么您也无法在命令行上覆盖该值。