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
中为target
all
设置了一个特定于目标的变量
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 in
foo
并使其在
bar
中重新调用。是否要调用Make in
foo
或在
bar
中?如果问题是通过子Make传输变量,则可能需要使用
$(Make)
在这里会有一些用处吗?尽管如此,我不知道这里需要什么,也不知道当前的makefile实际在做什么(尽管它看起来做得很糟糕)。@Carl yes确实这个问题需要更多的关注……来自OP:)