web-dev-qa-db-ja.com

いくつかのディレクトリmakefile内のファイルに対する単純なループ

bashからディレクトリ内のすべてのファイルを簡単に印刷できます。

$ cat go.sh
BASEDIR=~/Downloads
MYDIR=${BASEDIR}/ddd
for f in $(ls ${MYDIR}); do echo $f; done

$ ./go.sh
m.txt
d.txt

makefileから同様のことを行おうとすると、うまく機能しません。

$ cat makefile
BASEDIR = ${HOME}/Downloads
MYDIR = ${BASEDIR}/ddd
all:
    for f in $(ls ${MYDIR}); do echo ${f}; done

$ make
for f in ; do echo ; done

そして、これはうまくいかない別のトライアルです:

$ cat makefile
BASEDIR = ${HOME}/Downloads
MYDIR = ${BASEDIR}/ddd
all:
    for f in $(Shell ls ${MYDIR}); do echo ${f}; done

$ make
for f in d.txt m.txt; do echo ; done
5
OrenIshShalom

@ Oo.oOの答え には少し問題があります。

Makefile内にfile/folderがtargetと同じ名前であり、そのtargetにいくつかの前提条件があり、そのフォルダーをループしたい場合、そのターゲットレシピが実行されます。

たとえば、buildという名前のフォルダーがあり、次のようなルールがあるとします。

build: clean server client

clean:
    @echo project cleaned!
server:
    @echo server built!
client:
    @echo client built!

特別なbuildフォルダーを含むフォルダーをループ処理するには、次のルールがあるとします。

MYDIR = .
ls: $(MYDIR)/*
    @echo $^

結果は次のようになります。

$ make ls
project cleaned!
server built!
client built!
build Makefile

@ Mike Pylypyshyn's solution を使用することをお勧めします。 makeドキュメント によると、この場合はforeach関数の方が適しています。

0
Zhwt