我正在尝试学习Make并在我的应用程序中构建一个Makefile,以帮助我构建和最小化我的.js文件,以便稍后使用组合加载器服务器应用程序。
我想要完成的是,当我运行make时,它将仅复制到自上次运行以来已更改的.js文件的构建目录,然后缩小该文件并生成-min。 js复制。最后,我需要始终确保生成一个新的meta.js文件。
我已经粘贴了我在下面工作的内容,但问题是它不是只选择已更改的.js文件,而是每次运行时都会选择每个文件。我错过了如何让Make在这个例子中只选择已更改的文件。
BOOKIE_JS = bookie/static/js/bookie
JS_BUILD_PATH = bookie/static/js/build
JS_META_SCRIPT = scripts/js/generate_meta.py
jsbuild: $(JS_BUILD_PATH)/bookie/meta.js
clean_js:
rm -rf $(JS_BUILD_PATH)/*
$(JS_BUILD_PATH)/bookie/meta.js: $(BOOKIE_JS)/y*-min.js
$(JS_META_SCRIPT) -n YUI_MODULES -s $(BOOKIE_JS)/y* -o $(JS_BUILD_PATH)/bookie/meta.js
$(BOOKIE_JS)/y*-min.js: $(BOOKIE_JS)/y*.js
scripts/js/jsmin_all.py $(JS_BUILD_PATH)/bookie
# this is the part that runs for each .js file and I'd like it to only run for the *modified* files
$(BOOKIE_JS)/y*.js: $(JS_BUILD_PATH)/bookie
cp $@ $(JS_BUILD_PATH)/bookie/
$(JS_BUILD_PATH)/bookie:
mkdir $(JS_BUILD_PATH)/bookie
clean: clean_js
.PHONE: clean clean_js
当前输出:
cp bookie/static/js/bookie/yapi.js bookie/static/js/build/bookie/
cp bookie/static/js/bookie/ymodel.js bookie/static/js/build/bookie/
cp bookie/static/js/bookie/ytagcontrol.js bookie/static/js/build/bookie/
cp bookie/static/js/bookie/yview.js bookie/static/js/build/bookie/
scripts/js/jsmin_all.py bookie/static/js/build/bookie
scripts/js/generate_meta.py -n YUI_MODULES -s bookie/static/js/bookie/y* -o bookie/static/js/build/bookie/meta.js
我只想查看已更改文件的cp。
答案 0 :(得分:3)
我认为您打算制作pattern rule,但使用了错误的语法。例如,这个:
$(BOOKIE_JS)/y*-min.js: $(BOOKIE_JS)/y*.js
scripts/js/jsmin_all.py $(JS_BUILD_PATH)/bookie
表示每个$(BOOKIE_JS)/y*-min.js
文件都依赖于$(BOOKIE_JS)/y*.js
个文件 - 所有这些文件,而不仅仅是具有相似名称的文件。如果你这样做:
$(BOOKIE_JS)/y%-min.js: $(BOOKIE_JS)/y%.js
scripts/js/jsmin_all.py $(JS_BUILD_PATH)/bookie
然后必须在每一侧用相同的字符串替换%
,因此例如$(BOOKIE_JS)/yapi-min.js
仅取决于$(BOOKIE_JS)/yapi.js