build: make ci test addons in test/addons
authorBen Noordhuis <info@bnoordhuis.nl>
Tue, 18 Aug 2015 19:29:59 +0000 (21:29 +0200)
committerBen Noordhuis <info@bnoordhuis.nl>
Tue, 25 Aug 2015 10:03:57 +0000 (12:03 +0200)
Make `make test-addons` part of the `make test-ci` target.

Use order-only prerequisites to make generating and building the add-ons
concurrency-safe when $JOBS > 1 and fudge the dependency on $(NODE_EXE)
so that add-ons are only rebuilt when needed instead of all the time.

PR-URL: https://github.com/nodejs/node/pull/2428
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Reviewed-By: Rod Vagg <rod@vagg.org>
Makefile
test/addons/.gitignore

index 671a6f1..bccdc9a 100644 (file)
--- 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
index ff6b007..bde1cf3 100644 (file)
@@ -1,3 +1,5 @@
+.buildstamp
+.docbuildstamp
 Makefile
 *.Makefile
 *.mk