2014-09-25 163 views
3

我在目录foo中有一个makefile,并且希望在子目录bar中使用相同的makefile。我一直在做以下几点:在一个单独的目录中使用相同的make文件

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

当我尝试做目标特定变量的值,因为我需要在bar调用make当通过他们在命令行上这变得非常混乱。有没有更干净的方法来做到这一点?

+0

'''让-C bar'''相当于(在结果)作为'''CD杆&& make''' – Carl 2014-09-25 23:02:02

+0

这条规则(不能实际工作书面,但没关系)在'foo'中调用make,并在'bar'中重新调用它自己。你想在'foo'或者'bar'中调用Make吗? – Beta 2014-09-26 02:31:34

+0

如果问题是通过子变量传递变量,那么可能使用'$(MAKE)'在这里有用处?这就是说,我实际上并没有明白这里需要什么,或者目前的makefile实际上在做什么(尽管看起来好像很糟糕)。 – 2014-10-02 19:21:01

回答

0

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

1

我无法从问题中判断下列解决方案是否满足您的需求,它可能 - 或者可能不 - 为你工作。

如果你的情况是,你只是想要相同的Makefile功能可用,include可能是一个解决方案。您可以在目录中,你做你需要具体到bar一切bar创建Makefile,除此之外,你这样做:

include ../foo/Makefile 

买者!这不直接工作。不能有两个同名的食谱。例如,如果你想foo/MakefileallrecipeBar,并且要foo/MakefilerecipeFoorecipeBarall以下不起作用

富/ Makefile文件:

.PHONY: all 
all: 
    recipeFoo 

酒吧/ Makefile:

.PHONY: all 
all: 
    reciveBar 

include foo/Makefile 

取而代之的是,配方必须分成独特的n埃姆斯。但是,依赖关系规则可能存在多次,所以解决此警告并不是真正的挑战。所以,下面的工作:

富/ Makefile文件:

.PHONY: all 
all: allFoo 

.PHONY: allFoo 
allFoo: 
    recipeFoo 

酒吧/ Makefile文件:

.PHONY: all 
all: allBar 

.PHONY: allBar 
allBar: 
    recipeBar 

include foo/Makefile 

现在,如果你在运行barmake,它会运行recipeFoorecipeBar。 如果序列对自己和recipeFoo必须recipeBar之前运行,使allBar依赖allFoo,像这样的:如果你希望你的特定目标变量打电话时,请

.PHONY: all 
all: allBar 

.PHONY: allBar 
allBar: allFoo 
    recipeBar 

include foo/Makefile 

酒吧/ Makefile文件另一个make(为此我推荐使用$(MAKE)而不是make),您可以导出变量 - 相应的后果(某些Windows版本的环境空间溢出风险,

例如,如果你有一个具体的目标变量FOOMakefile目标all,并希望在调用Submake.mak当变量是已知的,它的工作原理是这样的:

的Makefile:

all: export FOO:=bar 
.PHONY: all 
all: 
    $(MAKE) -f Submake.mak 

Submake.mak:

.PHONY: all 
all: 
    echo $(FOO) 
相关问题