Support partial rebuilds. #833

This commit is contained in:
ccd0 2016-04-12 08:11:36 -07:00
parent 0df9bfe374
commit 18f0b779c3
4 changed files with 140 additions and 28 deletions

View File

@ -22,11 +22,15 @@ cat := node tools/cat.js
cat_deps := tools/cat.js
jshint_deps := .jshintrc node_modules/jshint/package.json
sources := \
groups := 0 1 2 3 4 5 6 7 8 9 10 11 12 13
sources0 := \
src/General/Config.coffee \
src/General/Globals.coffee \
src/General/Globals.coffee
sources1 := \
src/General/$$.coffee \
src/General/CrossOrigin.coffee \
src/General/CrossOrigin.coffee
sources2 := \
src/classes/Callbacks.coffee \
src/classes/Board.coffee \
src/classes/Thread.coffee \
@ -39,31 +43,44 @@ sources := \
src/classes/SimpleDict.coffee \
src/classes/ShimSet.coffee \
src/classes/Connection.coffee \
src/classes/Fetcher.coffee \
src/classes/Fetcher.coffee
sources3 := \
src/General/Polyfill.coffee \
src/General/Header.coffee \
src/General/Index.coffee \
src/General/Build.coffee \
src/General/Get.coffee \
src/General/UI.coffee \
src/General/BuildTest.coffee \
$(sort $(wildcard src/Filtering/*.coffee)) \
$(sort $(wildcard src/Quotelinks/*.coffee)) \
src/General/BuildTest.coffee
sources4 := \
$(sort $(wildcard src/Filtering/*.coffee))
sources5 := \
$(sort $(wildcard src/Quotelinks/*.coffee))
sources6 := \
src/Posting/QR.coffee \
src/Posting/Captcha.coffee \
$(sort $(wildcard src/Posting/Captcha.*.coffee)) \
src/Posting/PassLink.coffee \
src/Posting/PostSuccessful.coffee \
$(sort $(wildcard src/Posting/QR.*.coffee)) \
$(sort $(wildcard src/Images/*.coffee)) \
$(sort $(wildcard src/Linkification/*.coffee)) \
$(sort $(wildcard src/Menu/*.coffee)) \
$(sort $(wildcard src/Monitoring/*.coffee)) \
$(sort $(wildcard src/Archive/*.coffee)) \
$(sort $(wildcard src/Miscellaneous/*.coffee)) \
$(sort $(wildcard src/Posting/QR.*.coffee))
sources7 := \
$(sort $(wildcard src/Images/*.coffee))
sources8 := \
$(sort $(wildcard src/Linkification/*.coffee))
sources9 := \
$(sort $(wildcard src/Menu/*.coffee))
sources10 := \
$(sort $(wildcard src/Monitoring/*.coffee))
sources11 := \
$(sort $(wildcard src/Archive/*.coffee))
sources12 := \
$(sort $(wildcard src/Miscellaneous/*.coffee))
sources13 := \
src/General/Settings.coffee \
src/General/Main.coffee
sources := $(foreach i,$(groups),$(sources$(i)))
imports := \
node_modules/font-awesome/package.json \
$(wildcard src/Linkification/icons/*.png) \
@ -91,11 +108,13 @@ testbds := $(foreach f,$(subst .crx,.crx.zip,$(bds)),test$(f))
jshint := $(foreach f,script-crx eventPage script-userscript,.events/jshint.$(f))
jshint_parts := $(foreach t,crx userscript,$(foreach i,$(parts),.events/jshint.script$(i)-$(t))) .events/jshint.eventPage
default : install
all : bds install
.events tmp testbuilds builds :
.events tmp tmp/parts testbuilds builds :
$(MKDIR)
.events/npm : npm-shrinkwrap.json | .events
@ -108,14 +127,23 @@ node_modules/%/package.json : .events/npm
.tests_enabled :
echo false> .tests_enabled
tmp/script.coffee : $(sources) $(cat_deps) | tmp
$(cat) $(sources) $@
define rules_group
tmp/script-%.coffee : tmp/script.coffee $(imports) $(template_deps)
$(template) $< $@ type=$*
tmp/parts/script$1.coffee : $$(sources$1) $(cat_deps) | tmp/parts
$(cat) $$(sources$1) $$@
tmp/script-%.js : tmp/script-%.coffee $(coffee_deps)
$(coffee) $<
tmp/parts/script$1-%.coffee : tmp/parts/script$1.coffee $(imports) $(template_deps)
$(template) $$< $$@ type=$$*
tmp/parts/script$1-%.js : tmp/parts/script$1-%.coffee $(coffee_deps)
$(coffee) $$<
endef
$(foreach i,$(groups),$(eval $(call rules_group,$(i))))
tmp/script-%.js : $(foreach i,$(groups),tmp/parts/script$(i)-%.js) tools/cat-coffee.js
node tools/cat-coffee.js $(foreach i,$(groups),tmp/parts/script$(i)-$*.js) $@
tmp/eventPage.js : src/General/eventPage.coffee $(coffee_deps) | tmp
$(coffee) -o tmp src/General/eventPage.coffee
@ -169,23 +197,30 @@ builds/% : testbuilds/% $(jshint) | builds
test.html : README.md template.jst tools/markdown.js node_modules/marked/package.json node_modules/lodash/package.json
node tools/markdown.js
.jshintrc : src/meta/jshint.json $(template_deps)
$(template) $< .jshintrc
tmp/parts/.jshintrc : src/meta/jshint.json $(template_deps) | tmp/parts
$(template) $< $@ stage=parts
.events/jshint.% : tmp/%.js $(jshint_deps) | .events
.jshintrc : src/meta/jshint.json $(template_deps)
$(template) $< $@ stage=full
.events/jshint.% : tmp/%.js .jshintrc node_modules/jshint/package.json | .events
$(BIN)jshint $<
echo -> $@
.events/jshint_parts.% : tmp/parts/%.js tmp/parts/.jshintrc node_modules/jshint/package.json | .events
$(BIN)jshint $<
echo -> $@
install.json :
echo {}> $@
.events/install : $(testbds) $(jshint) install.json tools/install.js | .events
.events/install : $(testbds) $(jshint_parts) install.json tools/install.js | .events
node tools/install.js
echo -> $@
.SECONDARY :
.PHONY: default all clean cleanall testbds bds jshint install
.PHONY: default all clean cleanall testbds bds jshint jshint_parts install
clean :
$(RMDIR) tmp testbuilds .events
@ -200,4 +235,6 @@ bds : $(bds)
jshint : $(jshint)
jshint_parts : $(jshint_parts)
install : .events/install

View File

@ -40,6 +40,15 @@
"GM_openInTab",
"GM_xmlhttpRequest"
],
"globals": [
"$$",
"c",
"Conf",
"d",
"doc",
"E",
"g"
],
"min": {
"chrome": "33",
"firefox": "26",

View File

@ -19,7 +19,17 @@
"cloneInto": true,
"unsafeWindow": true,
"chrome": true<%=
readJSON('package.json').meta.grants.map(x => `,\n "${x}": true`).join('')
%>
meta.grants.map(x => `,\n "${x}": true`
).join('')
%><% if (stage === 'parts') { %>
meta.globals.map(x => `,\n "${x}": true`
<% } %><% if (stage === 'parts') { %>
fs.readdirSync('src')
.map(x => fs.readdirSync(`src/${x}`))
.reduce((x,y) => x.concat(y))
.filter(x => /^[$A-Z]\w*\.coffee/.test(x))
.map(x => x.split('.')[0])
.map(x => `,\n "${x}": true`
<% } %>
}
}

56
tools/cat-coffee.js Normal file
View File

@ -0,0 +1,56 @@
var fs = require('fs');
var inputFiles = process.argv.slice(2, -1);
var allVars = [];
var allHelperNames = [];
var allHelperValues = {};
var allBodies = [];
for (var file of inputFiles) {
var inputText = fs.readFileSync(file, 'utf8').replace(/\r\n/g, '\n');
var parts = inputText.match(/^\(function\(\) {\n var ([\w$]+(?:, [\w$]+)*)((?:,\n [\w$]+ = .*)*);\n\n([^]*)\n\n}\)\.call\(this\);\n$/);
if (!parts) throw new Error(`${file}: unexpected format`);
var vars = parts[1].split(', ');
for (var v of vars) {
if (allVars.indexOf(v) >= 0) {
throw new Error(`${file}: reused variable name ${v}`);
}
if (allHelperNames.indexOf(v) >= 0) {
throw new Error(`${file}: variable clashes with helper ${v}`);
}
allVars.push(v);
}
var helpers = parts[2].split(',\n ').slice(1);
for (var h of helpers) {
var hparts = h.match(/^([\w$]+) = (.*)$/);
var hn = hparts[1];
var hv = hparts[2];
if (allVars.indexOf(hn) >= 0) {
throw new Error(`${file}: helper clashes with variable ${v}`);
}
if (allHelperNames.indexOf(hn) >= 0) {
if (allHelperValues[hn] !== hv) {
throw new Error(`${file}: redefined helper ${hn}`);
}
} else {
allHelperNames.push(hn);
allHelperValues[hn] = hv;
}
}
var body = parts[3];
allBodies.push(body);
}
var varText = allVars.sort().join(', ');
var helperText = allHelperNames.map(hn => `,\n ${hn} = ${allHelperValues[hn]}`).join('');
var bodyText = allBodies.join('\n\n');
var outputText = `(function() {\n var ${varText}${helperText};\n\n${bodyText}\n\n}).call(this);\n`;
var outputName = process.argv[process.argv.length - 1];
fs.writeFileSync(outputName, outputText);