Makefile 在单独的目录中使用相同的make文件
我在目录Makefile 在单独的目录中使用相同的make文件,makefile,gnu-make,Makefile,Gnu Make,我在目录foo中有一个makefile,希望在子目录bar中使用相同的makefile。我一直在做以下工作: all: <do work in foo> cd bar; make -f ../Makefile <target to make in bar> 全部: 光碟条; make-f../Makefile 当我在bar中调用make时,在命令行上传递特定于目标的变量值时,这会变得非常混乱。有更简洁的方法吗?在栏中创建指向。/Makefile的链
foo
中有一个makefile,希望在子目录bar
中使用相同的makefile。我一直在做以下工作:
all:
<do work in foo>
cd bar;
make -f ../Makefile <target to make in bar>
全部:
光碟条;
make-f../Makefile
当我在
bar
中调用make
时,在命令行上传递特定于目标的变量值时,这会变得非常混乱。有更简洁的方法吗?在栏中创建指向。/Makefile
的链接(硬链接或符号链接,由您选择)。然后,正如卡尔在评论中指出的那样,你可以制作-C条码
,一切都应该正常。(至少从gmake 3.81开始,先切换到新目录,然后再执行它的操作。我不能代表gmake 4.0说话。)我无法从以下问题判断以下解决方案是否适合您的需要,它可能适合您,也可能不适合您
如果您的情况是您只是想要相同的Makefile
功能可用,include
可能是一个解决方案。您可以在目录bar
中创建一个Makefile
,您可以在其中执行bar
所需的所有操作,此外,您还可以执行以下操作:
include ../foo/Makefile
警告这不能直接工作。不能有两个同名食谱。例如,如果希望foo/Makefile
为all
执行recipeBar
,并且希望foo/Makefile
为all
执行recipeFoo
和recipeBar
,则以下操作不起作用:
foo/Makefile:
.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
.PHONY: all
all: allBar
.PHONY: allBar
allBar: allFoo
recipeBar
include foo/Makefile
bar/Makefile:
.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
.PHONY: all
all: allBar
.PHONY: allBar
allBar: allFoo
recipeBar
include foo/Makefile
相反,配方必须被分割成唯一的名称。然而,依赖性规则可能存在多次,因此绕过此警告并不是一个真正的挑战。因此,以下方法可行:
foo/Makefile:
.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
.PHONY: all
all: allBar
.PHONY: allBar
allBar: allFoo
recipeBar
include foo/Makefile
bar/Makefile:
.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
.PHONY: all
all: allBar
.PHONY: allBar
allBar: allFoo
recipeBar
include foo/Makefile
现在,如果在bar
中运行make
,它将运行RecipeFo
和recipeBar
。
如果顺序对您很重要,并且recipeFoo
必须在recipeBar
之前运行,请使allBar
依赖于allFoo
,如下所示:
bar/Makefile:
.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
.PHONY: all
all: allBar
.PHONY: allBar
allBar: allFoo
recipeBar
include foo/Makefile
如果您希望在调用另一个make
(我建议使用$(make)
而不是make
)时可以使用特定于目标的变量,则可以导出您的变量,并产生相应的后果(某些Windows版本存在环境空间溢出风险)
例如,如果在Makefile
中为targetall
设置了一个特定于目标的变量FOO
,并且在调用Submake.mak
时希望该变量是已知的,则其工作原理如下:
生成文件:
all: export FOO:=bar
.PHONY: all
all:
$(MAKE) -f Submake.mak
Submake.mak:
.PHONY: all
all:
echo $(FOO)
make-C-bar
与cd-bar&&make
这条规则是等价的(结果)(它实际上不能像写的那样工作,但没关系)用于调用Make infoo
并使其在bar
中重新调用。是否要调用Make infoo
或在bar
中?如果问题是通过子Make传输变量,则可能需要使用$(Make)
在这里会有一些用处吗?尽管如此,我不知道这里需要什么,也不知道当前的makefile实际在做什么(尽管它看起来做得很糟糕)。@Carl yes确实这个问题需要更多的关注……来自OP:)