makefile - 运行多个版本的测试并在 Makefile 中收集返回值
问题描述
我正在开发从 Emacs-22 运行到 Emacs26 的 Emacs 包,我想确认这些 Emacs 的测试通过了。
但是,由于每个日志都很长,所以我想将每个测试的返回值收集起来,并在最后清楚地显示出来。
我怎样才能在 Makefile 中写这个?要测试的 Emacs 列表已经ALL_EMACS_VERS
以数组(22.1 23.4 24.5 25.3 26.1)的形式获取,现在我运行测试如下。
EMACS ?= emacs
LOAD_PATH := -L $(dir $(lastword $(MAKEFILE_LIST)))
BATCH := $(EMACS) -Q --batch $(LOAD_PATH)
ALL_EMACS_VERS := $(shell compgen -c emacs- | grep -oP '(?<=emacs-)([0-9]|\.)+' | sort | uniq)
test:
$(BATCH) -l srt-tests.el -f srt-run-tests
debug-localtest:
for ver in $(ALL_EMACS_VERS); do \
echo "=== test by emacs-$${ver}... ==="; \
EMACS=emacs-$${ver} make test; \
done
我想获取有关测试通过或未通过的版本的信息,并输出如下。
=== test by emacs-22.1 ===
emacs-22.1 -Q --batch -L ./ -l srt-tests.el -f srt-run-tests
Running 30 tests...
GNU Emacs 22.1.1 (mac-apple-darwin)
of 2017-10-07 on osx339.sd.apple.com
[PASSED] simple:equal
[PASSED] simple:=
...
===== Run 30 Tests, 29 Expected, 1 Failed, 0 Errored =====
make[1]: Leaving directory '/Users/conao/Develop/git/.dotfiles/.emacs.d/local/26.1/site-lisp/srt.el'
=== test by emacs-23.4 ===
emacs-23.4 -Q --batch -L ./ -l srt-tests.el -f srt-run-tests
Running 30 tests...
GNU Emacs 23.4.1 (x86_64-apple-darwin, NS apple-appkit-1038.36)
of 2012-01-29 on bob.porkrind.org
[PASSED] simple:equal
[PASSED] simple:=
...
===== Run 30 Tests, 29 Expected, 1 Failed, 0 Errored =====
make[1]: Leaving directory '/Users/conao/Develop/git/.dotfiles/.emacs.d/local/26.1/site-lisp/srt.el'
...
(Emacs 24.5, 25.3, 26.1)
...
=== localtest completed!! ===
*FAILED* Emacs-22.1
*FAILED* Emacs-23.4
[PASSED] Emacs-24.5
*FAILED* Emacs-25.3
[PASSED] Emacs-26.1
解决方案
问题有两个部分。第一个是为一个测试提供所需的输出。如果(如您的问题的标题所示)这取决于过程的返回值,则此方法将起作用:
single-test:
(some-command && echo PASS) || echo FAIL
在你的情况下,这变成:
ARGS := -Q --batch $(LOAD_PATH) -l srt-tests.el -f srt-run-tests
test-emacs-22.1:
(emacs-22.1 $(ARGS) && echo [PASS] emacs-22.1) || echo *FAIL* emacs-22.1
第二部分是迭代一个版本列表。我建议使用模式规则:
ALL_EMACS_VERS := 22.1 23.4 24.5 25.3 26.1
TESTS := $(addprefix test-emacs-, $(ALL_EMACS_VERS))
all-tests: $(TESTS)
test-%:
($* $(ARGS) && echo [PASS] $*) || echo *FAIL* $*
最后,如果这些过程产生您希望抑制的输出:
test-%:
($* $(ARGS) > /dev/null && echo [PASS] $*) || echo *FAIL* $*
编辑:要在所有脚本输出后打印所有结果,最简单的方法是将它们保存在一个文件中,例如“结果”:
all-tests: $(TESTS)
@cat results
@rm results
test-%:
@($* $(ARGS) && echo [PASS] $* >> results) || echo *FAIL* $* >> results