我在目录foo
中有一个makefile,并希望在子目录bar
中使用相同的makefile。我一直在做以下事情:
all:
<do work in foo>
cd bar;
make -f ../Makefile <target to make in bar>
当我尝试执行目标特定变量值时会变得非常混乱,因为我需要在make
中调用bar
时在命令行上传递它们。有更清洁的方法吗?
答案 0 :(得分:1)
我无法从问题中看出以下解决方案是否满足您的需求,它可能 - 或者可能不适合您。
如果您的情况是您只想要相同的Makefile
功能,include
可能是一个解决方案。您可以在目录Makefile
中创建bar
,在其中您可以执行bar
所需的所有操作,除此之外,您还可以:
include ../foo/Makefile
警告!这不是直接的。不能有两个同名的食谱。例如,如果您希望foo/Makefile
为recipeBar
执行all
,并且您希望foo/Makefile
为recipeFoo
执行recipeBar
,all
},以下无法使用:
富/生成文件:
.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
,它将运行recipeFoo
和recipeBar
。
如果序列对您很重要且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。)