我可以轻松地从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
答案 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函数更适合。