一个Makefile,在许多子目录中使用

我正在寻找一个makefile,它在当前目录的所有子目录中调用它自己的目标。我想出了这个作为一个起点:
SUBDIRS := $(shell find . -maxdepth 1 -type d | sed -e 's/^/"/;s/$$/"/')

all:
        @for d in $(SUBDIRS); do 
                ($(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C "$$d" gallery.html); 
        done

gallery.html:
        echo "Making galleryn";
这是解决问题的正确方法吗? 这真的是发现责备并正确引用它们的“最干净”方式吗? 我很高兴使用GNU make扩展。     
已邀请:
你所拥有的基本上是一个混淆的shell脚本 - 你没有使用make本身的任何功能。 您的子目录名称是否包含空格字符?如果是这样,那么
make
可能根本就不是工作的正确工具:它真的想要使用以空格分隔的单词列表,并且没有引用的概念可以帮助它处理路径中的空格。 如果子目录名称包含空格字符,我会将内容拆分为单独的shell脚本和makefile,如下所示:
#/bin/sh
find . -maxdepth 1 -type d | while read d; do
    make -f `dirname $0`/Makefile -C "$d" gallery.html
done
gallery.html:
        echo "Making galleryn";
(请记住,如果子目录中有更多带有空格的路径,make仍然是一个糟糕的选择) 如果子目录名称不包含空格字符,那么可以使事情变得更加简单,并且您还可以避免递归make调用(google“递归使其被视为有害”,原因如下):
SUBDIRS := $(wildcard */)

all: $(SUBDIRS:%=%/gallery.html)

%/gallery.html:
    cd $* && echo "Making gallery in `pwd`n"
    
只有当
gallery.html
具有一些复杂的本地先决条件时,这种递归才有意义,即使这样,它也可能不是最好的方法。这种对makefile名称的敏感性是一个非常糟糕的迹象。但如果这就是你想要的,我建议做出以下改变:
.PHONY: $(SUBDIRS)
all: $(SUBDIRS)

$(SUBDIRS):
    $(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C $@ gallery.html
    

要回复问题请先登录注册