我无法阻止make
将任何变量传达给子制作。我已阅读手册并遵循了他们的建议(重置MAKEOVERRIDES
和MAKEFLAGS
),但我认为它仍然无法正常工作。
考虑以下原型 Makefile:
${warning $(MAKEOVERRIDES)}
${warning $(MAKEFLAGS)}
${warning $(VAR)}
none:
$(MAKE) -f Makefile MAKEOVERRIDES= MAKEFLAGS= all
all:
echo done!
如果我make VAR=10 none
,我得到以下信息:
Makefile:2: VAR=10
Makefile:3:
Makefile:4: 10
make -f Makefile MAKEOVERRIDES= MAKEFLAGS= all
make[1]: Entering directory `/home/adriano/sandbox/makes'
Makefile:2:
Makefile:3:
Makefile:4: 10
echo done!
done!
make[1]: Leaving directory `/home/adriano/sandbox/makes'
意思make
是与子制作的通信VAR
。这是正确的行为吗?
我试过了unexport VAR
,bash -c make ...
但没有任何运气。
编辑:我已将none
's recipe 修改为:bash -c "echo $$MAKEOVERRIDES $$MAKEFLAGS $$VAR" ; make ...
通过这种方式,我发现 VAR 实际上是通过 make 为要执行的命令创建的环境而不是通过其他变量传递的(其他变量也以这种方式传递给 make)。
我想我现在的问题是:如何创建一个新的外壳/环境来运行我的子制作?
编辑:有人问我为什么要这样做;我会试着在这里回答这个问题。
我有一个“模块”,它使用一个名为 CONFIG 的变量。为了构建这个模块,我需要构建另一个部分不相关的“模块”,它也使用 CONFIG,但具有不同的值。问题是当我尝试构建“子模块”时,CONFIG 包含“超级模块”的值。我可以在制作“子模块”时指定 CONFIG ,但是两个模块都使用许多具有相同名称的变量,并且试图指定它们都会使模块紧密耦合,这是我无法承受的。
怎么会这么难……