2012-02-25 1 views
2

は、私はすべてのサブパスを取得するためにGNU make、パスを決定する方法はファイルかディレクトリですか?いくつかのパスから

PATHS = $(wildcard $(SOME_PATH)/*) 

を使用しています。

ファイルかディレクトリかどうかを知る必要があります。

どのように作成するのですか?

ありがとうございました。

PATHS=$(wildcard *) 
for f in $(PATHS); do \ 
    if test -d $$f; then echo "$$f: DIR"; fi; \ 
done 

答えて

8

John Marshallには効果がある方法がありますが、より安全な方法があります。すべてのディレクトリには常によく知られている単一のエントリがあり、それは "。"です。だから、何をしなければならないことです:ディレクトリのみが含まれているため

PATHS := $(wildcard $(SOME_PATH)/*) 
DIRS := $(patsubst %/.,%,$(wildcard $(addsuffix /.,$(PATHS)))) 
FILES := $(filter-out $(DIRS),$(PATHS)) 

ワイルドカードは、すべてのディレクトリ、およびディレクトリのみにマッチします「」。これは堅牢です。

Yehnanのやり方も同様ですが、PATHSの各要素に対してシェルを呼び出すため、効率が悪いです。ほとんどの場合、これはランタイム全体に大きな影響を与えませんが、シェルを実行するのではなくmakeの内部で行うことができれば、私はそれを好むでしょう。また、$(shell ...)を避けるための移植性を助けます。

+2

+1、非常に良いハック! –

+1

ありがとうございました。実行時間の差は重要です。 – yehnan

0

コードは標準bashの下で動作し、各見つかった要素のための印刷します:

ENTRIES := $(wildcard $(SOME_PATH)/*/) 
DIRS := $(patsubst %/,%,$(filter %/,$(ENTRIES))) 
FILES := $(filter-out %/,$(ENTRIES)) 

しかし、私は$(wildcard */)は、要求されたパターンと実際には一致しない(すなわち、そのようなエントリにはスラッシュが付いていない)ので、ファイルのエントリを生成する。

GNU Make 3.82はこのようなエントリを生成しますが、機能ではなくバグのようです。

1
PATHS = $(wildcard $(SOME_PATH)/*) 
DIRPATHS = $(foreach dir, $(wildcard $(PATHS)/*), $(shell test -d $(dir) && echo $(dir))) 
4
DIRS := $(patsubst %/,%,$(filter %/,$(wildcard $(SOME_PATH)/*/))) 
FILES := $(filter-out $(DIRS),$(wildcard $(SOME_PATH)/*)) 

次のように、それはまた、単に1 wildcardで行うことができることが表示されます:それは、ディレクトリの場合は、以下の

+0

助けてください。ありがとう。 – yehnan

0

これは厳密には質問に答えるものではありませんが、すべてのファイルのみを含む変数が必要な場合は、findがさらに速くなるかもしれません。別のプロセスを作成しても、

FILES := $(shell find $(SOME_PATH) -type -f) 

一つの利点は、あなたも、入力(すなわちSOME_PATH)として複数のパスを使用できることです。

関連する問題