从make调用其他makefile

时间:2015-07-26 16:00:13

标签: makefile mingw

我看到了this个问题,但仍然无法让make正确调用另一个Makefile。这是我的Makefile

base:
    cd Base && $(MAKE)

Base是我当前目录的子目录,其中有一个不同的Makefile用于编译所述文件夹中的文件。但是,当我调用make时,我只是得到nothing to be done for base,而当我从命令行执行cd Base && make时,我得到预期的行为(即编译发生)。如果Makefile中的Base出现问题,以下是此内容的副本:

CC=g++
CFLAGS=-O3 -Wall -pedantic -Werror -c
LINK=g++
LFLAGS=-O3

SRC=main.cpp
OBJ=..\lib\main.o
EXE=..\bin\test.exe

all: $(EXE)

$(EXE): $(OBJ) $(SRC)
    $(LINK) $(LFLAGS) $(OBJ) -o $(EXE)

..\lib\main.o: main.cpp
    $(CC) $(CFLAGS) $< -o $@

1 个答案:

答案 0 :(得分:0)

我不确定$(MAKE)是多少(我假设只是&#39; make&#39;)但是我的makefile文件是以级联的方式设置的,其中一个调用另一个为了涵盖所有子目录。

每个makefile都有一些共同的目标,例如&#39; all&#39;并且&#39;清洁&#39; 然后我刚才委托给子目录的makefile看起来像这样:

.PHONY : all
all:
    cd SubDir1 && make $@
    cd SubDir2 && make $@
    ...

.PHONY : clean
clean:
    cd SubDir1 && make $@
    cd SubDir2 && make $@
    ...

$ @是一个automatic variable,它将取代目标(&#39;所有&#39;或者&#39;清除&#39;在上面的示例中)。

这使您可以运行&#39; make&#39;,&#39; make clean&#39;,&#39; make all&#39;甚至&#39; make clean all&#39;从顶级目录开始,它将通过makefile中为相应目标指定的子目录进行递归。所以如果你跑得干干净的话。在顶部,将使用&#39; make clean&#39;来调用makefile列表中的所有目录。

即使您没有共同的目标,您仍然可以使用此技术。只需为每个目录的makefile更改自动变量$ @和相应的目标。