我在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/MakefilerecipeBar进行all,并且希望foo/MakefilerecipeFoo进行recipeBarall,则无效:

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,它将运行recipeFoorecipeBar
如果顺序对您很重要,并且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/

10-16 10:24