Makefile没有为xxx做什么

时间:2012-01-15 09:34:44

标签: javascript unix makefile google-closure-compiler

我很困惑。我见过一些类似的问题,但没有一个能解决我的问题;所以我有这个在线抓取的脚本,通过运行makefile自动压缩javascript文件:

concatenated.min.js: file1.js file2.js
   java -jar ~/bin/compiler.jar $(addprefix --js=,$^) >$@

我这个make文件在这里

JS_TARGETS = a.js b.js c.js d.js

CLOSURE = java -jar ~/bin/compiler.jar
CLOSURE_FLAGS = 

JS_MINIFIED = $(JS_TARGETS:.js=.min.js)
JS_GZIP = $(JS_TARGETS:.js=.js.gz)
JS_MIN_GZIP = $(JS_TARGETS:.js=.min.js.gz)

js: $(JS_TARGETS) $(JS_MINIFIED) $(JS_GZIP) $(JS_MIN_GZIP)

%.min.js: %.js
   $(CLOSURE) $(CLOSURE_FLAGS) --js=$< >$@

在与a.js,b.js,c.js和d.js相同的目录中,我有一个文件concat.min.js。然后,我运行make concat.min.js并且makefile给了我“没有为concat.min.js做任何事情”。

我还认为问题是因为我错过了$(addprefix --js=,$^) >$@规则中的%.min.js部分。但是,即使我将其添加到规则中,它似乎仍然给我同样的错误。我做错了什么/错字?感谢。

2 个答案:

答案 0 :(得分:1)

如果您没有concat.js文件,可能会发生这种情况。

答案 1 :(得分:1)

%.min.js: %.js行所说的是“如果文件foo.js比foo.min.js更新,那么foo.min.js已经过时了,以下是如何更新它” 。因此,如果您说make a.min.js,make会发现您(可能)没有a.min.js文件,所以它肯定不比a.js新,所以它会使它使用makefile中的命令。

你得到的消息是“你让我做了concat.min.js,但是没有比它更新的文件concat.js,所以......没有什么可做的”。

看看你提出的其他问题,我怀疑你想要的是:

concatenated.min.js: $(JS_TARGETS)
   java -jar ~/bin/compiler.jar $(addprefix --js=,$^) >$@

确保concatenated.min.jsJS_TARGETS中列出的每个文件都新。