在某些目录makefile中对文件进行简单循环

时间:2019-01-03 10:46:09

标签: bash makefile ls

我可以轻松地从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

4 个答案:

答案 0 :(得分:2)

也许您可以纯粹通过Makefile方式来做到这一点?

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

您仍然可以像这样从Makefile运行命令

MYDIR = .
list: $(MYDIR)/*
        for file in $^ ; do \
                echo "Hello" $${file} ; \
        done

如果我是你,我宁愿不混合基于$(shell ...)的Makefile和bash循环。我宁愿将目录名传递给某个脚本并在其中运行循环-在脚本内部。

答案 1 :(得分:2)

这是根据@ Oo.oO编辑的答案:

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

$ make
d.txt
m.txt

答案 2 :(得分:0)

文档中的几乎“真实方法”

TEMPLATES_DIR = ./somedir

list: 
    $(foreach file, $(wildcard $(TEMPLATES_DIR)/*), echo $(file);)

答案 3 :(得分:0)

@Oo.oO's answer有点问题。

如果makefile中有任何文件/文件夹具有与目标相同的名称,并且该目标具有一些先决条件,并且您想循环浏览该文件夹,您将执行目标配方。

例如:如果您有一个名为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。根据{{​​3}},在这种情况下,foreach函数更适合。