在Python可用的情况下选择性启用测试程序 - automake

4 投票
1 回答
776 浏览
提问于 2025-04-16 22:33

我有一个用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 手册中的扩展

撰写回答