我正在尝试为 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