### @configure_input@ # Copyright (C) 2010-2017 Free Software Foundation, Inc. # This file is part of GNU Emacs. # GNU Emacs is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # GNU Emacs is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs. If not, see . ### Commentary: ## Some targets: ## check: re-run all tests, writing to .log files. ## check-maybe: run all tests which are outdated with their .log file ## or the source files they are testing. ## filename.log: run tests from filename.el(c) if .log file needs updating ## filename: re-run tests from filename.el(c), with no logging ### Code: SHELL = @SHELL@ srcdir = @srcdir@ VPATH = $(srcdir) MKDIR_P = @MKDIR_P@ SEPCHAR = @SEPCHAR@ # We never change directory before running Emacs, so a relative file # name is fine, and makes life easier. If we need to change # directory, we can use emacs --chdir. EMACS = ../src/emacs EMACS_EXTRAOPT= # Command line flags for Emacs. # Apparently MSYS bash would convert "-L :" to "-L ;" anyway, # but we might as well be explicit. EMACSOPT = -batch --no-site-file --no-site-lisp -L "$(SEPCHAR)$(srcdir)" $(EMACS_EXTRAOPT) # Prevent any settings in the user environment causing problems. unexport EMACSDATA EMACSDOC EMACSPATH GREP_OPTIONS ## To run tests under a debugger, set this to eg: "gdb --args". GDB = # The locale to run tests under. Tests should work if this is set to # any supported locale. Use the C locale by default, as it should be # supported everywhere. TEST_LOCALE = C # The actual Emacs command run in the targets below. # Prevent any setting of EMACSLOADPATH in user environment causing problems. emacs = EMACSLOADPATH= LC_ALL=$(TEST_LOCALE) EMACS_TEST_DIRECTORY=$(srcdir) \ $(GDB) "$(EMACS)" $(EMACSOPT) .PHONY: all check all: check %.elc: %.el @echo Compiling $< @$(emacs) -f batch-byte-compile $< ## Ignore any test errors so we can continue to test other files. ## But compilation errors are always fatal. WRITE_LOG = > $@ 2>&1 || { stat=ERROR; cat $@; }; echo $$stat: $@ ## I'd prefer to use -emacs -f ert-run-tests-batch-and-exit rather ## than || true, since the former makes problems more obvious. ## I'd also prefer to @-hide the grep part and not the ## ert-run-tests-batch-and-exit part. ## ## We need to use $loadfile because: ## i) -L :$srcdir -l basename does not work, because we have files whose ## basename duplicates a file in lisp/ (eg eshell.el). ## ii) Although -l basename will automatically load .el or .elc, ## -l ./basename treats basename as a literal file (it would be nice ## to change this; bug#17848 - if that gets done, this can be simplified). ## ## Beware: it approximates 'no-byte-compile', so watch out for false-positives! SELECTOR_DEFAULT = (quote (not (tag :expensive-test))) SELECTOR_EXPENSIVE = nil ifdef SELECTOR SELECTOR_ACTUAL=$(SELECTOR) else ifndef MAKECMDGOALS SELECTOR_ACTUAL=$(SELECTOR_DEFAULT) else ifeq ($(MAKECMDGOALS),all) SELECTOR_ACTUAL=$(SELECTOR_DEFAULT) else ifeq ($(MAKECMDGOALS),check) SELECTOR_ACTUAL=$(SELECTOR_DEFAULT) else ifeq ($(MAKECMDGOALS),check-maybe) SELECTOR_ACTUAL=$(SELECTOR_DEFAULT) else SELECTOR_ACTUAL=$(SELECTOR_EXPENSIVE) endif ## Byte-compile all test files to test for errors (unless explicitly ## told not to), but then evaluate the un-byte-compiled files, because ## they give cleaner stacktraces. ## Beware: it approximates 'no-byte-compile', so watch out for false-positives! %.log: %.el elc=$ /dev/null; then \ ${MAKE} $$elc; \ fi; \ loadfile=$<; \ echo Testing $$loadfile; \ stat=OK ; \ ${MKDIR_P} $(dir $@) ; \ $(emacs) -l ert -l $$loadfile \ --eval "(ert-run-tests-batch-and-exit ${SELECTOR_ACTUAL})" ${WRITE_LOG} ELFILES = $(shell find ${srcdir} -path "${srcdir}/manual" -prune -o \ -path "*resources" -prune -o -name "*el" -print) ## .elc files may be in a different directory for out of source builds ELCFILES = $(patsubst %.el,%.elc, \ $(patsubst $(srcdir)%,.%,$(ELFILES))) LOGFILES = $(patsubst %.elc,%.log,${ELCFILES}) LOGSAVEFILES = $(patsubst %.elc,%.log~,${ELCFILES}) TESTS = $(subst ${srcdir}/,,$(LOGFILES:.log=)) ## If we have to interrupt a hanging test, preserve the log so we can ## see what the problem was. .PRECIOUS: %.log .PHONY: ${TESTS} ## The short aliases that always re-run the tests, with no logging. ## Define an alias both with and without the directory name for ease ## of use. define test_template $(1): @test ! -f ./$(1).log || mv ./$(1).log ./$(1).log~ @${MAKE} ./$(1).log WRITE_LOG= $(notdir $(1)): $(1) endef $(foreach test,${TESTS},$(eval $(call test_template,${test}))) ## Check that there is no 'automated' subdirectory, which would ## indicate an incomplete merge from an older version of Emacs where ## the tests were arranged differently. .PHONY: check-no-automated-subdir check-no-automated-subdir: test ! -d $(srcdir)/automated ## Include dependencies between test files and the files they test. ## We could do this without the file and eval directly, but then we ## would have to run Emacs for every make invocation, and it might not ## be available during clean. -include make-test-deps.mk ## Rerun all default tests. check: mostlyclean check-no-automated-subdir @${MAKE} check-doit SELECTOR="${SELECTOR_ACTUAL}" ## Rerun all default and expensive tests. .PHONY: check-expensive check-expensive: mostlyclean check-no-automated-subdir @${MAKE} check-doit SELECTOR="${SELECTOR_EXPENSIVE}" ## Re-run all tests which are outdated. A test is outdated if its ## logfile is out-of-date with either the test file, or the source ## files that the tests depend on. The source file dependencies are ## determined by a heuristic and does not identify the full dependency ## graph. See make-test-deps.emacs-lisp for details. .PHONY: check-maybe check-maybe: check-no-automated-subdir @${MAKE} check-doit SELECTOR="${SELECTOR_ACTUAL}" ## Run the tests. .PHONY: check-doit check-doit: ${LOGFILES} $(emacs) -l ert -f ert-summarize-tests-batch-and-exit $^ .PHONY: mostlyclean clean bootstrap-clean distclean maintainer-clean mostlyclean: -@for f in ${LOGFILES}; do test ! -f $$f || mv $$f $$f~; done rm -f *.tmp clean: -rm -f ${LOGFILES} ${LOGSAVEFILES} -rm make-test-deps.mk bootstrap-clean: clean -rm -f ${ELCFILES} distclean: clean rm -f Makefile maintainer-clean: distclean bootstrap-clean make-test-deps.mk: $(ELFILES) make-test-deps.emacs-lisp $(EMACS) --batch -l $(srcdir)/make-test-deps.emacs-lisp \ --eval "(make-test-deps \"$(srcdir)\")" \ 2> $@.tmp # Hack to elide any CANNOT_DUMP=yes chatter. sed '/\.log: /!d' $@.tmp >$@ rm -f $@.tmp