GNU Makefile获取目录名和concat字符串

时间:2017-05-22 15:57:18

标签: string makefile directory gnu-make gnu

我需要编写一个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

我不明白这里没有正确调用的内容。

1 个答案:

答案 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