GNU Makefile 获取目录名和连接字符串
GNU Makefile get directory names and concat string
我需要编写一个 makefile 代码来获取特定路径下所有目录的列表并提取目录名称并将其连接成一个字符串。
我目前拥有的是
list-dir:
for dir in $(wildcard mypath/*/); do \
echo $$dir ; \
done
但是这个 returns 一个完整的目录路径,例如
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
我不明白这里叫错了什么。
您想要的结果可以通过 make
计算而无需使用
任何目标或配方:
生成文件 (1)
DIRS := $(patsubst %,foo-%,$(notdir $(wildcard mypath/*)))
$(info $(DIRS))
哪个运行像:
$ make
foo-c foo-b foo-a
make: *** No targets. Stop.
在这样的食谱中使用计算结果:
生成文件(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 脚本输出结果:
生成文件(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
的 make-expansion 是 $dir
,并且有
$dir
中的 %\
不匹配,整个 $(patsubst %\,,$$dir)
表达式
计算结果为 $dir
,并在配方中被 $dir
替换。
我需要编写一个 makefile 代码来获取特定路径下所有目录的列表并提取目录名称并将其连接成一个字符串。 我目前拥有的是
list-dir:
for dir in $(wildcard mypath/*/); do \
echo $$dir ; \
done
但是这个 returns 一个完整的目录路径,例如
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
我不明白这里叫错了什么。
您想要的结果可以通过 make
计算而无需使用
任何目标或配方:
生成文件 (1)
DIRS := $(patsubst %,foo-%,$(notdir $(wildcard mypath/*)))
$(info $(DIRS))
哪个运行像:
$ make
foo-c foo-b foo-a
make: *** No targets. Stop.
在这样的食谱中使用计算结果:
生成文件(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 脚本输出结果:
生成文件(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
的 make-expansion 是 $dir
,并且有
$dir
中的 %\
不匹配,整个 $(patsubst %\,,$$dir)
表达式
计算结果为 $dir
,并在配方中被 $dir
替换。