简单循环某个目录makefile中的文件

Ore*_*lom 10 bash ls 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
Run Code Online (Sandbox Code Playgroud)

当我尝试从中做类似的事情时,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
Run Code Online (Sandbox Code Playgroud)

这是另一个不起作用的试验:

$ 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
Run Code Online (Sandbox Code Playgroud)

Ore*_*lom 12

这是基于@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
Run Code Online (Sandbox Code Playgroud)


小智 11

从文档中也几乎是“真实的方式”

TEMPLATES_DIR = ./somedir

list: 
    $(foreach file, $(wildcard $(TEMPLATES_DIR)/*), echo $(file);)
Run Code Online (Sandbox Code Playgroud)


Oo.*_*.oO 9

也许你可以用纯粹的 Makefile 方式做到这一点?

MYDIR = .
list: $(MYDIR)/*
        @echo $^
Run Code Online (Sandbox Code Playgroud)

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

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

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