在单独的目录中使用相同的make文件

时间:2014-09-25 22:41:13

标签: makefile gnu-make

我在目录foo中有一个makefile,并希望在子目录bar中使用相同的makefile。我一直在做以下事情:

all:
   <do work in foo>
   cd bar; 
   make -f ../Makefile <target to make in bar>

当我尝试执行目标特定变量值时会变得非常混乱,因为我需要在make中调用bar时在命令行上传递它们。有更清洁的方法吗?

2 个答案:

答案 0 :(得分:1)

我无法从问题中看出以下解决方案是否满足您的需求,它可能 - 或者可能不适合您。

如果您的情况是您只想要相同的Makefile功能,include可能是一个解决方案。您可以在目录Makefile中创建bar,在其中您可以执行bar所需的所有操作,除此之外,您还可以:

include ../foo/Makefile

警告!这不是直接的。不能有两个同名的食谱。例如,如果您希望foo/MakefilerecipeBar执行all,并且您希望foo/MakefilerecipeFoo执行recipeBarall },以下无法使用

富/生成文件:

.PHONY: all
all:
    recipeFoo

酒吧/生成文件:

.PHONY: all
all:
    reciveBar

include foo/Makefile

相反,配方必须分成唯一的名称。但是,依赖规则可以存在多次,因此解决此警告并不是一个真正的挑战。因此,以下方法可行:

富/生成文件:

.PHONY: all
all: allFoo

.PHONY: allFoo
allFoo:
    recipeFoo

酒吧/生成文件:

.PHONY: all
all: allBar

.PHONY: allBar
allBar:
    recipeBar

include foo/Makefile

现在,如果您在make中运行bar,它将运行recipeFoorecipeBar。 如果序列对您很重要且recipeFoo必须在recipeBar之前运行,请allBar依赖于allFoo,如下所示:

酒吧/生成文件:

.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)

答案 1 :(得分:0)

bar../Makefile中创建一个链接(硬或符号,您的选择)。然后,正如卡尔在评论中指出的那样,你可以make -C bar,一切都应该有效。 (至少从gmake 3.81开始,首先切换到新目录,然后做它的事情。我不能代表gmake 4.0。)