name := 4chan-X ifdef ComSpec BIN := $(subst /,\,node_modules/.bin/) RMDIR := -rmdir /s /q RM := -del CP = copy /y $(subst /,\,$<) $(subst /,\,$@) MKDIR = -mkdir $(subst /,\,$@) ESC_DOLLAR = $$ else BIN := node_modules/.bin/ RMDIR := rm -rf RM := rm -rf CP = cp $< $@ MKDIR = mkdir -p $@ ESC_DOLLAR = \$$ endif coffee := $(BIN)coffee -c --no-header coffee_deps := node_modules/coffee-script/package.json template := node tools/template.js template_deps := package.json tools/template.js node_modules/lodash/package.json node_modules/esprima/package.json cat := node tools/cat.js cat_deps := tools/cat.js capitalized = $(filter-out a,$(foreach x,$1,$(subst a $(x),,$(sort a $(x))))) parts := \ Config platform classes \ $(sort $(call capitalized, \ $(subst src/,,$(wildcard src/*)) \ )) \ Main intermediate := LICENSE src/meta/fbegin.js tmp/declaration.js tmp/globals.js $(foreach p,$(parts),tmp/$(p).js) src/meta/fend.js # remove extension when sorting so X.coffee comes before X.Y.coffee sources = \ $(subst !,.coffee,$(sort $(subst .coffee,!, \ $(wildcard src/$1/*.coffee src/main/$1.coffee)))) imports_Config := \ src/Archive/archives.json \ src/css/custom.css imports_Monitoring := \ src/meta/icon128.png imports_Miscellaneous := \ src/css/report.css imports_Main := \ $(filter-out src/css/custom.css src/css/report.css,$(wildcard src/css/*.css)) \ tmp/font-awesome.css \ tmp/style.css imports_font_awesome := \ node_modules/font-awesome/css/font-awesome.css \ node_modules/font-awesome/fonts/fontawesome-webfont.woff imports_style := \ $(wildcard src/css/linkIcons/*.png) crx_contents := script.js eventPage.js icon16.png icon48.png icon128.png manifest.json release := \ $(foreach f, \ $(foreach c,. -beta.,$(name)$(c)crx updates$(c)xml $(name)$(c)user.js $(name)$(c)meta.js) \ $(name)-noupdate.crx \ $(name)-noupdate.user.js \ $(name).zip \ ,builds/$(f)) script := $(foreach f,$(filter-out %.crx %.zip,$(release)),test$(f)) $(foreach t,crx crx-beta crx-noupdate,$(foreach f,$(crx_contents),testbuilds/$(t)/$(f))) crx := $(foreach f,$(filter %.crx %.zip,$(release)),test$(f)) jshint := $(foreach f,globals $(subst platform,platform_crx platform_userscript,$(parts)),.events/jshint.$(f)) default : script jshint install all : release jshint install .events tmp testbuilds builds : $(MKDIR) .events/npm : npm-shrinkwrap.json | .events npm install echo -> $@ node_modules/% : .events/npm .tests_enabled : echo false> .tests_enabled tmp/font-awesome.css : src/css/font-awesome.css $(imports_font_awesome) $(template_deps) | tmp $(template) $< $@ tmp/style.css : src/css/style.css $(imports_style) $(template_deps) | tmp $(template) $< $@ .events/declare : $(wildcard src/*/*.coffee) tools/declare.js | .events tmp node tools/declare.js echo -> $@ tmp/declaration.js : .events/declare tmp/globals.js : src/main/globals.js version.json $(template_deps) | tmp $(template) $< $@ define rules_part tmp/$1.jst : $$(call sources,$1) $(cat_deps) | tmp $(cat) $$(call sources,$1) $$@ tmp/$1.coffee : tmp/$1.jst $$(filter-out %.coffee,$$(wildcard src/$1/*.* src/$1/*/*.* src/$1/*/*/*.*)) $$(imports_$1) .tests_enabled $(template_deps) $(template) $$< $$@ tmp/$1.js : tmp/$1.coffee $(coffee_deps) tools/globalize.js $(coffee) $$< node tools/globalize.js $$@ $$(call sources,$1) endef $(foreach i,$(filter-out platform,$(parts)),$(eval $(call rules_part,$(i)))) tmp/platform.jst : $(call sources,platform) $(cat_deps) | tmp $(cat) $(subst $$,$(ESC_DOLLAR),$(call sources,platform)) $@ tmp/platform_%.coffee : tmp/platform.jst $(template_deps) $(template) $< $@ type=$* tmp/platform_%.js : tmp/platform_%.coffee $(coffee_deps) $(coffee) $< node tools/globalize.js $@ $(subst $$,$(ESC_DOLLAR),$(call sources,platform)) tmp/eventPage.js : src/main/eventPage.coffee $(coffee_deps) | tmp $(coffee) -o tmp src/main/eventPage.coffee define rules_channel testbuilds/crx$1 : $$(MKDIR) testbuilds/crx$1/script.js : src/meta/botproc.js $(subst platform,platform_crx,$(intermediate)) $(cat_deps) | testbuilds/crx$1 $(cat) src/meta/botproc.js $(subst platform,platform_crx,$(intermediate)) $$@ testbuilds/crx$1/eventPage.js : tmp/eventPage.js | testbuilds/crx$1 $$(CP) testbuilds/crx$1/icon%.png : src/meta/icon%.png | testbuilds/crx$1 $$(CP) testbuilds/crx$1/manifest.json : src/meta/manifest.json version.json $(template_deps) | testbuilds/crx$1 $(template) $$< $$@ type=crx channel=$1 testbuilds/updates$1.xml : src/meta/updates.xml version.json $(template_deps) | testbuilds/crx$1 $(template) $$< $$@ type=crx channel=$1 testbuilds/$(name)$1.crx.zip : \ $(foreach f,$(crx_contents),testbuilds/crx$1/$(f)) \ package.json version.json tools/zip-crx.js node_modules/jszip/package.json node tools/zip-crx.js $1 testbuilds/$(name)$1.crx : testbuilds/$(name)$1.crx.zip package.json tools/sign.js node_modules/crx/package.json node tools/sign.js $1 testbuilds/$(name)$1.meta.js : src/meta/metadata.js src/meta/icon48.png version.json $(template_deps) | testbuilds $(template) $$< $$@ type=userscript channel=$1 testbuilds/$(name)$1.user.js : src/meta/botproc.js testbuilds/$(name)$1.meta.js $(subst platform,platform_userscript,$(intermediate)) $(cat_deps) $(cat) src/meta/botproc.js testbuilds/$(name)$1.meta.js $(subst platform,platform_userscript,$(intermediate)) $$@ endef $(eval $(call rules_channel,)) $(eval $(call rules_channel,-beta)) $(eval $(call rules_channel,-noupdate)) testbuilds/$(name).zip : testbuilds/$(name)-noupdate.crx.zip $(CP) builds/% : testbuilds/% | builds $(CP) test.html : README.md template.jst tools/markdown.js node_modules/marked/package.json node_modules/lodash/package.json node tools/markdown.js tmp/.jshintrc : src/meta/jshint.json tmp/declaration.js tmp/globals.js $(template_deps) | tmp $(template) $< $@ .events/jshint.% : tmp/%.js tmp/.jshintrc node_modules/jshint/package.json | .events $(BIN)jshint $< echo -> $@ install.json : echo {}> $@ .events/install : $(script) install.json tools/install.js | .events node tools/install.js echo -> $@ .SECONDARY : .PHONY: default all clean cleanall script crx release jshint install clean : $(RMDIR) tmp testbuilds .events $(RM) .tests_enabled cleanall : clean $(RMDIR) builds script : $(script) crx : $(crx) release : $(release) jshint : $(jshint) install : .events/install