我想使用一个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