如何在Make中使用配方来运行几个不同的Makefile?

时间:2014-02-13 20:52:37

标签: makefile

我继承了一个具有多个顶级Makefile的项目,每个类似于运行固件映像的非常相似的平台。他们的名字如下:

Makefile.apple.mak Makefile.banana.mak ...

所以每次我想构建一个特定的图像时,我都会运行该命令 make -f Makefile.apple.mak //默认是发布

许多代码在构建的不同图像之间共享。这样做的一个问题是,有时当进行编译并为Apple平台工作时,它会破坏香蕉平台。有一大堆#ifdefs根据Makefile指定的平台有条件地包含或排除代码。我知道,这是一个烂摊子,非常需要一个重构(我提到我继承了这个吗?)

为了在进行更改后轻松构建所有固件映像并在一个平台上声明好,我想要一个包装Makefile来调用一个或所有可用固件映像的构建。

我目前正在研究这种蛮力方法。我知道必须有一种更有效的方法来做到这一点。如果可能的话,我也不知道如何将额外的参数传递给这个外部Makefile(即make apple debug)。任何帮助表示赞赏。

.PHONY: all
all: cleanall releaseall

.PHONY: cleanall
cleanall:
    make -f Makefile.apple.mak clean    # Can I instead call apple target with an arg?
    make -f Makefile.banana.mak clean   # Can I instead call banana target with an arg?

.PHONY: releaseall
releaseall:
    make -f Makefile.apple.mak
    make -f Makefile.banana.mak

.PHONY: apple
apple:
    make -f Makefile.apple.mak # how do I pass in the <clean | debug | release> args?

.PHONY: banana
banana:
    make -f Makefile.banana.mak # how do I pass in ...

1 个答案:

答案 0 :(得分:1)

(顺便说一下,你永远不想用make来调用递归make。总是使用$(MAKE)

执行此操作的方法是构造编码图像的目标名称以及要构建的图像的目标。然后你可以使用make先决条件。

因此,举例来说,你可以这样做:

IMAGES := apple banana ...

all: cleanall releaseall

cleanall: $(IMAGES:%=%.clean)
releaseall: $(IMAGES)

$(IMAGES):
        $(MAKE) -f Makefile.$@.mak

$(IMAGES:%=%.clean):
        $(MAKE) -f Makefile.$(basename $@).mak clean

.PHONY: all cleanall releaseall $(IMAGES) $(IMAGES:%=%.clean)

这也允许您运行make apple.clean来清除apple目录或其他任何内容。

您还可以添加更多目标,例如debug等。