在Python可用的情况下选择性启用测试程序 - automake
我有一个用C语言写的程序,使用automake和autoconf来构建,并且有两个测试套件。一个是单元测试套件,也是用C语言写的;另一个是端到端测试,目前是用Python写的。我希望“make check”命令总是运行单元测试,而端到端测试只在安装了Python的情况下运行。这是我现在的做法:
TESTS = unittests
if HAVE_PYTHON
TESTS += tester.py
tester_py_SOURCES = src/test/tester.py.in
tester.py: src/test/tester.py.in Makefile
$(SED) -e 's,[@]PYTHON[@],$(PYTHON),' < $< > $@
chmod +x $@
endif
HAVE_PYTHON
是通过配置脚本设置的,内容是:
AM_PATH_PYTHON([2.6],, [:])
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"])
在Unix系统上,这个方法是有效的,但在Windows上会出现“没有规则来生成tester.py.exe”的错误。此外,使用复制和替换的方法来正确设置#!
这一行,导致我无法将测试套件拆分成多个模块。
有没有更好的方法来实现这个?
1 个回答
5
你必须只在编译的东西中使用 _SOURCES
,所以它会加上 $(EXEEXT)
。试试这个:
TESTS = unittests
if HAVE_PYTHON
TESTS += tester.py
# Possibly use += here depending on the rest of your Makefile.am
check_SCRIPTS = tester.py
# I added $(srcdir) here so VPATH builds still work.
tester.py: $(srcdir)/src/test/tester.py.in Makefile
$(SED) -e 's,[@]PYTHON[@],$(PYTHON),' < $< > $@
chmod +x $@
endif
有没有什么原因让你不直接通过 configure.ac
来做替换呢?
AS_IF([test "$PYTHON" != ":"], [AC_CONFIG_FILES([src/test/tester.py])])
这样会使用 config.status
重新生成脚本,并自动生成重建规则。
编辑 1:
如果你真正想做的是在 make check
的过程中运行 Python 测试脚本,我建议你这样做:
check-local:
if HAVE_PYTHON
$(PYTHON) $(srcdir)/src/test/tester.py
endif
(我把 check-local
放在 if HAVE_PYTHON
外面,这样如果需要的话,你可以定义其他命令来作为 check-local
的一部分。)
你可能更喜欢这样写:
check-local:
test "$(PYTHON)" != ":" && $(PYTHON) $(srcdir)/src/test/tester.py
可以查看 automake 手册中的扩展。