0

我想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.
  1. 为什么lint__static/js/ad_list.js不被俘虏lint__%
  2. 如果我取消第二个注释.PHONY,它会回显lint__static/js/ad_list.js,但不会调用pocketlint static/js/ad_list.js。为什么?

如果我的方法是错误的,那么正确的方法是什么?由于任务是独立的,如果make -j50能做我所期望的,我将不胜感激。

谢谢!

4

1 回答 1

1

目前尚不清楚其意图是什么:确实pocketlint写了一个名为 的文件lint__static/js/ad_list.js,还是真的是一个虚假的文件名?反正...

  1. 重读模式如何匹配的第二段:

    当目标模式不包含斜杠时(通常不包含),文件名中的目录名在与目标前缀和后缀比较之前从文件名中删除。在将文件名与目标模式进行比较之后,目录名以及结束它们的斜线被添加到由模式规则的先决条件模式和文件名生成的先决条件文件名中。

    简而言之,%通常只匹配文件名,而不是带有斜杠的路径名。所以lint__static/js/ad_list.js没有被捕获,因为实际上它只是ad_list.js被匹配到lint__%.

    如果您可以安排它以便输出文件pocketlintstatic/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/*.

  2. 对于虚假目标,隐式规则搜索被抑制(参见虚假目标,第 5 段)。因此,当虚假pocketlint时,从不考虑涉及的规则。lint__static/js/ad_list.js

    不清楚为什么结果是Nothing to be done for (phony) lint__static/js/ad_list.js而不是No rule to make target lint__static/js/ad_list.js,但我不会为此失眠!

于 2012-09-04T22:34:44.287 回答