使用shell在makefile中查找globs

时间:2015-08-25 16:04:19

标签: shell makefile

我无法弄清楚如何在Makefile中获得所需的行为:

1)使用find将glob搜索扩展为/path/match/1/path/match/2等。

2)将该路径设置为Make变量

也许有人可以阅读我的想法并将此(不正确的)尝试解释为合法的Make命令?

Makefile DIRS := $(shell find ./web/{$$(FEATS)}/tests -name "*-spec.js")

为了执行/使用这个makefile,我提供了FEATS作为导出。

export FEATS=feature-a,feature-b make run-some-target

2 个答案:

答案 0 :(得分:3)

您正在执行的shell命令是

find ./web/{$(FEATS)}/tests -name "*-spec.js"

即。运行shell命令FEATS,将其输出替换为find的参数,然后运行find。要修复,你应该只提供一个$ - 符号,即

DIRS := $(shell find ./web/{$(FEATS)}/tests -name "*-spec.js")

发生的事情是make通常将$解释为替换的开始。但有时需要将文字$传递给命令,这可以通过$与另一个$之前完成。然后,Make会将其折叠为单个$

此外,当您调用make时,您正在使用export。导出无法正常工作,您可能需要执行以下操作之一:

# note the ';'
export FEATS=feature-a,feature-b; make run-some-target
# or
env FEATS=feature-a,feature-b make run-some-target
# or
FEATS=feature-a,feature-b make run-some-target
# or
make FEATS=feature-a,feature-b run-some-target

答案 1 :(得分:2)

ex-bart的answer是正确的, 但是当你不需要查找而只需要一个glob扩展(例如:web/*/tests/*-spec.js) 您可能对内置$(wildcard)命令感兴趣。

可悲的是,它不会处理{a,b}样式展开,只有?*。但如果你 我们愿意将您的语法更改为“a b”,您可以使用$(foreach) 内置迭代它们:

FEATS='feature-a feature-b' make

使用Makfile:

DIRS := $(foreach v,$(FEATS),$(wildcard web/$(v)/tests/*-spec.js))