--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
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