0

我正在寻找在当前目录的所有子目录中编写一个调用目标的单个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 gallery\n";
  1. 这是解决问题的正确方法吗?
  2. 这真的是发现目录并正确引用它们的“最干净”的方式吗?

我很高兴使用 GNU make 扩展。

4

2 回答 2

2

你所拥有的本质上是一个混淆的 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 gallery\n";

(请记住,如果您的子目录中有更多带有空格的路径,那么 make 仍然是一个糟糕的选择)

如果子目录名称不包含空格字符,那么事情可以变得更简单,并且您还可以避免递归 make 调用(谷歌“递归 make 被认为是有害的”原因):

SUBDIRS := $(wildcard */)

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

%/gallery.html:
    cd $* && echo "Making gallery in `pwd`\n"
于 2011-02-19T16:28:54.013 回答
2

这种递归只有在具有一些复杂的本地先决条件时才有意义gallery.html,即使那样它也可能不是最好的方法。这种对 makefile 名称的敏感性是一个非常糟糕的迹象。但如果这就是你想要的,我建议进行以下更改:

.PHONY: $(SUBDIRS)
all: $(SUBDIRS)

$(SUBDIRS):
    $(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C $@ gallery.html
于 2011-02-19T16:28:57.430 回答