Makefile 查看在子 makefile 中设置的环境变量,即使我没有调用那个



我想使用一个makefile构建同一软件的两个变体。代码通过查看环境变量VARIANT来知道要构建哪一个。我知道环境变量不能在配方中设置,所以我想我应该根据变量调用不同的子Makefile。

这些是我的makefiles:

Makefile:

all: variant1 variant2
variant1:
include Makefile.variant1
variant2:
include Makefile.variant2

Makefile.variant1:

VARIANT := variant1
publishv1: [rest of recipe]

Makefile.variant2:

VARIANT := variant2
publishv2: [rest of recipe]

两者的[食谱的其余部分]本质上是一样的,只是代码选择了VARIANT,并且基于此有所不同。

问题是,如果我尝试

发布变量1

或仅

制作publishv1

它仍在从Makefile.variant2中获取VARIANT。如果我注释掉Makefile.variant2中的环境变量,它将构建变量1。

有没有其他方法可以用makefiles做到这一点?

编辑

所以这就是我目前正在做的事情,它很有效:

Makefile.var1

export VARIANT=var1
include Makefile.common

Makefile.var2

export VARIANT=var2
include Makefile.common

Makefile.common

publish: [python files that use VARIANT]

因此,为了制作任何一种变体,我运行

make-f Makefile.varX发布

我想做的是能够从一个makefile构建一个或两个。根据你的建议,我尝试过这个,但不起作用:

export VARIANT
variant1: VARIANT:=variant1
variant1: publish
variant2: VARIANT:=variant2
variant2: publish
publish: [python files that use VARIANT]

有没有办法做我想做的事?

首先,这些不是环境变量。它们是生成变量(或生成宏(。

其次,我不确定include操作有什么魔力,但这一切都是导入文件的内容,就像你在第一个makefile中键入它一样。所以在你的情况下,就好像你写了这样的makefile:

all: variant1 variant2
variant1:
VARIANT := variant1
publishv1: [rest of recipe]
variant2:
VARIANT := variant2
publishv2: [rest of recipe]

这不像在像variant1这样的目标之后粘贴include,会以某种方式使include仅在该目标运行时调用,或者类似的情况。

第三,你应该摆脱这样一种观念:;呼叫";目标;makefile不是过程语言,目标也不是被调用的函数。

执行此操作的方式完全取决于您希望VARIANT变量执行什么操作:如何使用它。你没有向我们展示任何与此相关的东西。

如果你只想在配方中使用它,那么你可以使用特定于目标的变量来处理这个问题:

all: variant1 variant2
export VARIANT
variant1: VARIANT := variant1
variant1: publish
variant2: VARIANT := variant2
variant2: publish
publish:
[rest of recipe using $(VARIANT)]

ETA

好的,那么您的注释说您希望将这个make变量提供到命令进行调用的环境中。这很简单,您只需要从makefile中导出它;添加:

export VARIANT

最新更新