Make - 使用 dotenv 之类的东西覆盖变量

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

刚开始使用 Makefile,我已经大量使用通过 args 覆盖变量的功能。但有时我必须覆盖三个或更多,这变得有点烦人。

所以我的问题是:Make 是否有内置功能来获取纯文本文件并覆盖某些变量? (就像我们对 dotenv 库所做的那样)

我能够实现此目的的唯一方法是创建一个内部 IF/ELSE IF/ELSE 块,由(例如)名为 env 的变量控制。它工作得很好,但我确实觉得它使整个 Makefile 不必要地臃肿。

谢谢。

makefile gnu-make
1个回答
0
投票

目前还不清楚您在寻找什么,但您可以执行一些操作,例如将其添加到 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
,该设置将被忽略。但是,如果您这样做,那么您也无法在命令行上覆盖该值。

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