diff --git a/Makefile b/Makefile index 671a6f1222ffb9..bccdc9afa054ab 100644 --- a/Makefile +++ b/Makefile @@ -99,19 +99,39 @@ test/gc/node_modules/weak/build/Release/weakref.node: $(NODE_EXE) --directory="$(shell pwd)/test/gc/node_modules/weak" \ --nodedir="$(shell pwd)" -build-addons: $(NODE_EXE) - rm -rf test/addons/doc-*/ +# Implicitly depends on $(NODE_EXE), see the build-addons rule for rationale. +test/addons/.docbuildstamp: doc/api/addons.markdown + $(RM) -r test/addons/doc-*/ $(NODE) tools/doc/addon-verify.js - $(foreach dir, \ - $(sort $(dir $(wildcard test/addons/*/*.gyp))), \ - $(NODE) deps/npm/node_modules/node-gyp/bin/node-gyp rebuild \ - --directory="$(shell pwd)/$(dir)" \ - --nodedir="$(shell pwd)" && ) echo "build done" + touch $@ + +ADDONS_BINDING_GYPS := \ + $(filter-out test/addons/doc-*/binding.gyp, \ + $(wildcard test/addons/*/binding.gyp)) + +# Implicitly depends on $(NODE_EXE), see the build-addons rule for rationale. +test/addons/.buildstamp: $(ADDONS_BINDING_GYPS) | test/addons/.docbuildstamp + # Cannot use $(wildcard test/addons/*/) here, it's evaluated before + # embedded addons have been generated from the documentation. + for dirname in test/addons/*/; do \ + $(NODE) deps/npm/node_modules/node-gyp/bin/node-gyp rebuild \ + --directory="$$PWD/$$dirname" \ + --nodedir="$$PWD"; \ + done + touch $@ + +# .buildstamp and .docbuildstamp need $(NODE_EXE) but cannot depend on it +# directly because it calls make recursively. The parent make cannot know +# if the subprocess touched anything so it pessimistically assumes that +# .buildstamp and .docbuildstamp are out of date and need a rebuild. +# Just goes to show that recursive make really is harmful... +# TODO(bnoordhuis) Force rebuild after gyp or node-gyp update. +build-addons: $(NODE_EXE) test/addons/.buildstamp test-gc: all test/gc/node_modules/weak/build/Release/weakref.node $(PYTHON) tools/test.py --mode=release gc -test-build: all build-addons +test-build: | all build-addons test-all: test-build test/gc/node_modules/weak/build/Release/weakref.node $(PYTHON) tools/test.py --mode=debug,release @@ -119,8 +139,9 @@ test-all: test-build test/gc/node_modules/weak/build/Release/weakref.node test-all-valgrind: test-build $(PYTHON) tools/test.py --mode=debug,release --valgrind -test-ci: - $(PYTHON) tools/test.py -p tap --logfile test.tap --mode=release message parallel sequential +test-ci: | build-addons + $(PYTHON) tools/test.py -p tap --logfile test.tap --mode=release \ + addons message parallel sequential test-release: test-build $(PYTHON) tools/test.py --mode=release diff --git a/test/addons/.gitignore b/test/addons/.gitignore index ff6b007943190d..bde1cf3ab9662b 100644 --- a/test/addons/.gitignore +++ b/test/addons/.gitignore @@ -1,3 +1,5 @@ +.buildstamp +.docbuildstamp Makefile *.Makefile *.mk diff --git a/tools/doc/addon-verify.js b/tools/doc/addon-verify.js index f87cfecdf5fbb4..4d1aaab3cc75a6 100644 --- a/tools/doc/addon-verify.js +++ b/tools/doc/addon-verify.js @@ -25,12 +25,9 @@ for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; if (token.type === 'heading') { if (files && Object.keys(files).length !== 0) { - verifyFiles(files, function(err) { - if (err) - console.log(err); - else - console.log('done'); - }); + verifyFiles(files, + console.log.bind(null, 'wrote'), + function(err) { if (err) throw err; }); } files = {}; } else if (token.type === 'code') { @@ -51,7 +48,7 @@ function once(fn) { }; } -function verifyFiles(files, callback) { +function verifyFiles(files, onprogress, ondone) { var dir = path.resolve(verifyDir, 'doc-' + id++); files = Object.keys(files).map(function(name) { @@ -78,17 +75,19 @@ function verifyFiles(files, callback) { fs.mkdir(dir, function() { // Ignore errors + var done = once(ondone); var waiting = files.length; - for (var i = 0; i < files.length; i++) - fs.writeFile(files[i].path, files[i].content, next); + files.forEach(function(file) { + fs.writeFile(file.path, file.content, function(err) { + if (err) + return done(err); - var done = once(callback); - function next(err) { - if (err) - return done(err); + if (onprogress) + onprogress(file.path); - if (--waiting === 0) - done(); - } + if (--waiting === 0) + done(); + }); + }); }); }