如何在GNU make中使用递归配方定义规则?

时间:2017-03-21 18:24:26

标签: recursion makefile

我想从一个顶级make文件中调用子文件夹中的make文件。

我的top make文件的示例如下所示,其中buildPath是make脚本中的参数:

.PHONY: testSystem

testSystem:
    $(MAKE) all -C $(buildPath)/Test1Build
    $(MAKE) all -C $(buildPath)/Test2Build
    $(MAKE) all -C $(buildPath)/Test3Build

此解决方案的问题是我必须列出所有子文件夹; Test1Build,Test2Build,Test3Build等。

是否有一种方法(使用make)来定义此规则,以便递归地找到收据中的子文件夹而不必全部列出它们? ......或者我可以用完全不同的方式解决这个问题吗?

所有子文件夹均以Test开头,以Build作为模式结束。

1 个答案:

答案 0 :(得分:1)

根本不难。一个简单的方法:

testSystem:
        for d in $(buildPath)/*/.; do \
            $(MAKE) all -C $$d; \
        done

然而,这有很多问题。这将是更加可靠和强大的:

subdirs := $(wildcard $(buildPath)/*/.)

testSystem: $(subdirs)

$(subdirs):
        $(MAKE) -C $@ all

.PHONY: testSystem $(subdirs)

一个警告:如果您使用并行make(-j),那么如果子目录的结果相互依赖,则可能会遇到第二个解决方案的问题。如果他们这样做,那么您必须在makefile中声明这些依赖关系:

$(buildPath)/foo/. : $(buildPath)/bar/.