--- /dev/null
+## This file is called GNUmakefile because Makefile is git ignored. Rename
+## when this is autoconf'd
+
+
+EMACS=../src/emacs
+
+DIRS=$(filter-out .,$(subst ./,,$(shell find . -maxdepth 1 -type d)))
+
+## alas "all" is an ELPA package
+build-all: $(DIRS)
+
+define package_template
+$(1): $(1)/$(1)-pkg.el
+
+$(1)/$(1)-pkg.el:
+ $$(EMACS) --batch --load package-build.el --eval '(package-build-prepare "$(1)")'
+
+endef
+
+$(foreach dir,$(DIRS),$(eval $(call package_template,$(dir))))
+
+define test_template
+$(1)-test:
+ $$(EMACS) --batch --load package-test.el --eval '(assess-discover-run-and-exit-batch-dir "$(1)")'
+endef
+
+$(foreach dir,$(DIRS),$(eval $(call test_template,$(dir))))
+
+test: $(patsubst %,%-test,$(DIRS))
--- /dev/null
+(defun assess-discover-tests (directory)
+ "Discover tests in directory.
+
+Tests must conform to one (and only one!) of several naming
+schemes.
+
+ - End with -test.el
+ - End with -tests.el
+ - Start with test-
+ - Any .el file in a directory called test
+ - Any .el file in a directory called tests
+
+Each of these is tried until one matches. So, a top-level file
+called \"blah-test.el\" will prevent discovery of files in a
+tests directory."
+ (or
+ ;; files with
+ (directory-files directory nil ".*-test.el$")
+ (directory-files directory nil ".*-tests.el$")
+ (directory-files directory nil "test-.*.el$")
+ (let ((dir-test
+ (concat directory "test/")))
+ (when (file-exists-p dir-test)
+ (mapcar
+ (lambda (file)
+ (concat dir-test file))
+ (directory-files dir-test nil ".*.el"))))
+ (let ((dir-tests
+ (concat directory "tests/")))
+ (when (file-exists-p dir-tests)
+ (mapcar
+ (lambda (file)
+ (concat dir-tests file))
+ (directory-files dir-tests nil ".*.el"))))))
+
+(defun assess-discover--load-all-tests (directory)
+ (mapc
+ 'load
+ (assess-discover-tests directory)))
+
+(defun assess-discover-load-tests ()
+ (interactive)
+ (assess-discover--load-all-tests default-directory))
+
+;;;###autoload
+(defun assess-discover-run-batch (&optional selector)
+ (assess-discover--load-all-tests default-directory)
+ (ert-run-tests-batch selector))
+
+;;;###autoload
+(defun assess-discover-run-and-exit-batch (&optional selector)
+ (assess-discover--load-all-tests default-directory)
+ (ert-run-tests-batch-and-exit selector))
+
+(defun assess-discover-run-and-exit-batch-dir (directory)
+ (let ((default-directory directory))
+ (assess-discover-run-and-exit-batch)))