OS X 中的递归 Make 传递目标

OS X 中的递归 Make 传递目标

我正在尝试为 OS X 上的 GNU Makefile 编写一个递归clean目标(GNU Make 3.81 - 来自 XCode)。根据 GNU Make 文档,我提出了以下内容:

主生成文件

ALLSUBMAKES=$(wildcard ./*/Makefile)
ALLSUBDIRS=$(patsubst %/Makefile,%,$(ALLSUBMAKES))
.PHONY: submakes clean $(ALLSUBDIRS)

submakes: $(ALLSUBDIRS)

clean: $(ALLSUBDIRS)

$(ALLSUBDIRS):
    $(MAKE) -C $@

子制作 Makefile

mainTarget:
    #do something here

clean:
    #some clean operation

问题:

我发现$(MAKE)仅传递make可执行文件的完整路径名,忽略目标和所有其他命令行选项(例如-j5)。mainTarget当我make clean在顶层发出时,所有子制作最终都会执行。实现这种递归清洁目标的正确方法是什么?或者如何将目标与所有命令行参数一起传递给子制作?

答案1

我看到完成此操作的方法是将所有目标收集到进入每个子目录的一条规则中:

build clean install:
     @for dir in $(ALLSUBDIRS); do $(MAKE) -C "$$dir" $@; done

您也许可以使用MAKEFLAGS自动导出到子品牌的内置变量执行某些操作。


您可以尝试将所需的操作添加到目标后,然后拆分此伪目标以稍后再次提取操作:

default: $(addsuffix .default,$(ALLSUBDIRS))
clean:   $(addsuffix .clean,$(ALLSUBDIRS))

%.default:
        $(MAKE) -C $*
%.clean:
        $(MAKE) -C $* clean

相关内容