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. それは本当にディレクトリを発見して正しく引用するための「最もクリーンな」方法ですか?

GNUmake拡張機能を使用して十分満足しています。

4

2 に答える 2

2

そこにあるのは、本質的に難読化されたシェル スクリプトです。make 自体の機能は使用していません。

サブディレクトリ名に空白文字が含まれていますか? もしそうなら、それmakeはおそらく仕事に適したツールではありません.スペースで区切られた単語のリストを実際に操作したいのですが、パス内のスペースを処理するのに役立つ引用の概念がありません.

サブディレクトリ名に空白文字が含まれている場合は、次のように別のシェル スクリプトと 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 呼び出しを回避することもできます (理由については、Google の「再帰的な 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、複雑なローカルの前提条件がある場合にのみ意味があり、その場合でもおそらく最善の方法ではありません。そして、メイクファイルの名前に対するこの敏感さは、非常に悪い兆候です。ただし、それが必要な場合は、次の変更をお勧めします。

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

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