我需要编写一个makefile代码,它将获取特定路径下所有目录的列表,并提取dir名称并将其连接到字符串。 到目前为止我所拥有的是
list-dir:
for dir in $(wildcard mypath/*/); do \
echo $$dir ; \
done
然而,这会返回一个完整的目录路径,例如
mypath/a/
mypath/b/
mypath/c/
从这里我需要能够获得a,b和c并将它们连接到foo-所以我需要的是
foo-a
foo-b
foo-c
我试图用gnu函数做的任何事情,例如patsubst或basename输出是
list-dir:
for dir in $(wildcard mypath/*/); do \
echo $$dir ; \
$(patsubst %\,,$$dir) ; \
done
mypath/a/: is a directory
mypath/b/: is a directory
mypath/c/: is a directory
我不明白这里没有正确调用的内容。
答案 0 :(得分:2)
您想要的结果可由make
计算而不使用
任何目标或食谱:
Makefile(1)
DIRS := $(patsubst %,foo-%,$(notdir $(wildcard mypath/*)))
$(info $(DIRS))
的运行方式如下:
$ make
foo-c foo-b foo-a
make: *** No targets. Stop.
在这样的食谱中使用计算结果:
Makefile(2)
DIRS := $(patsubst %,foo-%,$(notdir $(wildcard mypath/*)))
.PHONY: all
all:
echo $(DIRS)
的运行方式如下:
$ make
echo foo-c foo-b foo-a
foo-c foo-b foo-a
或者你可以写一个包含食谱的目标 shell脚本输出结果:
Makefile(3)
.PHONY: all
all:
for d in $$(ls mypath); do \
echo "foo-"$$d; \
done
的运行方式如下:
$ make
for d in $(ls mypath); do \
echo "foo-"$d; \
done
foo-a
foo-b
foo-c
make
已经做到了
运行任何目标的配方之前的$(...)
评估。食谱
在完成所有$(...)
次评估后,为任何目标运行,
由shell命令组成,仅 。到你的食谱时:
list-dir:
for dir in $(wildcard mypath/*/); do \
echo $$dir ; \
$(patsubst %\,,$$dir) ; \
done
运行,它是:
for dir in mypath/c/ mypath/b/ mypath/a/; do \
echo $dir ; \
$dir ; \
done
显然会失败。这是因为$(patsubst %\,,$$dir)
由make
评估
当它解析配方时,由于$$dir
的扩展为$dir
,并且存在
与%\
$dir
中的$(patsubst %\,,$$dir)
不匹配,即整个$dir
表达式
评估结果为$dir
,并在食谱中替换为minDate
。