シェル コマンドを使用せずに、gmake コマンドのみでサブディレクトリを一覧表示する方法もあります。
test:
@echo $(filter %/, $(wildcard lib/*/))
これにより、末尾に'/'
. それを削除するには、代替パターンを使用できます。
subdirs = $(filter %/, $(wildcard lib/*/))
test:
@echo $(subdirs:%/=%)
次に、各サブディレクトリでメイクファイルを実行するルールを実際に作成するには、小さなトリックを使用できます。存在しないディレクトリに偽のターゲットを作成します。この場合、例はどんな説明よりも多くのことを教えてくれると思います:
FULL_DIRS =$(filter %/, $(wildcard lib/*/))
LIB_DIRS =$(FULL_DIRS:%/=%)
DIRS_CMD =$(foreach subdir, $(LIB_DIRS), make-rule/$(subdir))
make-rule/%:
cd $* && $(MAKE)
all: DIRS_CMD
基本的に、ターゲット'all'
は前提条件としてすべてのサブディレクトリをリストします。たとえば、LIB_DIRS
含まれているlib/folder1 lib/folder2
場合、展開は次のようになります。
all: make-rule/lib/folder1 make-rule/lib/folder2
その後、「make」はルールを実行するために、'all'
各前提条件を既存のターゲットと一致させようとします。この場合、ターゲットは'make-rule/%:'
で'$*'
、文字列を抽出するために'make-rule/'
使用され、レシピの引数として使用されます。たとえば、最初の前提条件は次のように一致して展開されます。
make-rule/lib/folder1:
cd lib/folder1 && $(MAKE)