我无法弄清楚如何在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
答案 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))