我想在所有pocketlint
个文件上运行**/*.js
。
.PHONY: lint_js2
LINT_JS = $(wildcard static/js/*.js static/js/**/*.js)
LINT_JS_TARGETS = $(addprefix lint__,$(LINT_JS))
#.PHONY: $(LINT_JS_TARGETS)
lint_js2: $(LINT_JS_TARGETS)
echo $<
lint__%: %
pocketlint $<
然而,我收到此错误:
make: *** No rule to make target `lint__static/js/ad_list.js', needed by `lint_js2'. Stop.
lint__static/js/ad_list.js
未捕获lint__%
?.PHONY
,它会回显lint__static/js/ad_list.js
,但不会调用pocketlint static/js/ad_list.js
。为什么?如果我的方法有误,那么正确的做法是什么?由于任务是独立的,如果make -j50
能达到我的预期,我将不胜感激。
谢谢!
答案 0 :(得分:1)
目前还不清楚目的是什么:pocketlint
写一个名为lint__static/js/ad_list.js
的文件,还是真的是假文件名?总之...
重读How Patterns Match的第二段:
当目标模式不包含斜杠(通常不包含斜杠)时,文件名中的目录名将从文件名中删除,然后再与目标前缀进行比较和后缀。在将文件名与目标模式进行比较之后,目录名以及结束它们的斜杠将被添加到从模式规则的先决条件模式和文件名生成的先决条件文件名中。
简而言之,%
通常只匹配文件名,而不是带有斜杠的路径名。因此,lint__static/js/ad_list.js
未被捕获,因为实际上只有ad_list.js
与lint__%
匹配。
如果您可以安排它以使pocketlint
的输出文件为static/js/lint__ad_list.js
等,那么可以使其工作:
LINT_JS_TARGETS = $(foreach f,$(LINT_JS),$(dir $f)lint__$(notdir $f))
lint__%: %
pocketlint $<
或者,您可以通过使目标模式为路径名(包含斜杠)来使%
匹配路径名:
LINT_JS_TARGETS = $(addprefix linted/,$(LINT_JS))
linted/%: %
pocketlint $<
此时%
= static/js/ad_list.js
符合模式规则。
在任何一种情况下,你都必须让pocketlint
产生与lint__static/*
不同的输出(如果确实产生输出)。
虚假目标的隐式规则搜索被抑制(参见Phony Targets,第5段)。因此,当pocketlint
是假的时候,从不考虑涉及lint__static/js/ad_list.js
的规则。
为什么结果没有什么可以为(假的) lint__static/js/ad_list.js
而不是没有规则来制作目标 lint__static/js/ad_list.js
,这是不明显的,但我不会因此失眠!