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 替换。