Makefile中的假动态文件

时间:2012-09-04 18:43:58

标签: makefile

我想在所有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。为什么?
  3. 如果我的方法有误,那么正确的做法是什么?由于任务是独立的,如果make -j50能达到我的预期,我将不胜感激。

    谢谢!

1 个答案:

答案 0 :(得分:1)

目前还不清楚目的是什么:pocketlint写一个名为lint__static/js/ad_list.js的文件,还是真的是假文件名?总之...

  1. 重读How Patterns Match的第二段:

      

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

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

    如果您可以安排它以使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/*不同的输出(如果确实产生输出)。

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

    为什么结果没有什么可以为(假的) lint__static/js/ad_list.js而不是没有规则来制作目标 lint__static/js/ad_list.js,这是不明显的,但我不会因此失眠!