2011-02-19 31 views
0

私は、現在のディレクトリのすべてのサブディレクトリ内にターゲットを呼び出す1つのmakefileを書きたいと考えています。私は出発点として、このを作ってみた:多くのサブディレクトリで使用される1つの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. 本当にdiretoriesを見つけてそれらを正しく引用する "最もクリーンな"方法ですか?

私はGNU make拡張機能を使って十分満足です。

答えて

2

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

サブディレクトリ名には空白文字が含まれていますか?そうであれば、makeはおそらく単に仕事のための適切なツールではありません。スペースで区切られた単語のリストを使って作業することが本当に必要で、パス内のスペースに対処するのに役立つ引用の概念はありません。

サブディレクトリ名に空白文字が含まれている場合はそのように、私は、別のシェルスクリプトとメイクファイルに物事を分割します:

#/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は依然として貧しい選択かもしれません)

サブディレクトリ名にスペース文字が含まれていない場合、はるかに単純化することができ、あなたはまた、再帰的なメーク呼び出し(理由については「有害とみなさ再帰的なメイクを」グーグル)を回避することができます:gallery.htmlは、いくつかの複雑なローカルの前提条件を持っている場合にのみ、再帰のこの種のは理にかなって

SUBDIRS := $(wildcard */) 

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

%/gallery.html: 
    cd $* && echo "Making gallery in `pwd`\n" 
+0

名前には空白が含まれていますが、修正しようとしていた問題の一部でした。私はシェルスクリプトを使ってそれを呼び出すという考えが好きです。 (私は後で自分自身の機能を使用するつもりですが、私はここでその例を明確にしようとしていました) – Flexo

2

を、それでも、それはおそらく最善の方法ではありません。そして、メイクファイルの名前に対するこの感受性は非常に悪い兆候です。しかし、それがあなたが望むならば、私は以下の変更を提案します:

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

$(SUBDIRS): 
    $(MAKE) -f "../$(lastword $(MAKEFILE_LIST))" -C [email protected] gallery.html 
+0

これは、私が書いた "すべて"の目標よりもずっといいです、ありがとう! – Flexo

+0

@awoodland:このメイクファイルは '-j'フレンドリであることに注意してください。 (あなたのメイクファイルはすべてのサブメークをシリアル化しました。)これは常によく書かれたmakeのサインです。 – bobbogo

関連する問題