我在foo
目录中有一个makefile,并且想在子目录bar
中使用相同的makefile。我一直在做以下事情:
all:
<do work in foo>
cd bar;
make -f ../Makefile <target to make in bar>
当我尝试定位特定的变量值时,这变得非常混乱,因为在
make
中调用bar
时需要在命令行中传递它们。有没有更清洁的方法可以做到这一点? 最佳答案
我无法从问题中看出以下解决方案是否满足您的需求,它可能会也可能不会为您服务。
如果您只是想使用相同的Makefile
功能,那么include
可能是一个解决方案。您可以在Makefile
目录中创建bar
,在其中您需要执行bar
特定的所有操作,此外,您还可以执行以下操作:
include ../foo/Makefile
警告! 这不是直截了当的。不能有两个同名食谱。例如,如果您希望
foo/Makefile
为recipeBar
进行all
,并且希望foo/Makefile
为recipeFoo
进行recipeBar
和all
,则无效:foo / Makefile:
.PHONY: all
all:
recipeFoo
bar / Makefile:
.PHONY: all
all:
reciveBar
include foo/Makefile
相反,必须将配方分离为唯一的名称。但是,依赖规则可以存在多次,因此解决此警告并不是真正的挑战。因此,以下方法将起作用:
foo / Makefile:
.PHONY: all
all: allFoo
.PHONY: allFoo
allFoo:
recipeFoo
bar / Makefile:
.PHONY: all
all: allBar
.PHONY: allBar
allBar:
recipeBar
include foo/Makefile
现在,如果您在
make
中运行bar
,它将运行recipeFoo
和recipeBar
。如果顺序对您很重要,并且
recipeFoo
必须在recipeBar
之前运行,则使allBar
取决于allFoo
,如下所示:bar / Makefile:
.PHONY: all
all: allBar
.PHONY: allBar
allBar: allFoo
recipeBar
include foo/Makefile
如果您希望在调用另一个
make
(建议使用$(MAKE)
而不是make
)时提供特定于目标的变量,则可以导出变量-产生相应的后果(某些Windows版本上存在环境空间溢出风险,。例如,如果您在
FOO
中具有目标all
的特定于目标的变量Makefile
,并且您希望在调用Submake.mak
时知道该变量,则它的工作方式如下:生成文件:
all: export FOO:=bar
.PHONY: all
all:
$(MAKE) -f Submake.mak
Submake.mak:
.PHONY: all
all:
echo $(FOO)
关于makefile - 在单独的目录中使用相同的make文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26049318/