如果 Python 可用,则有选择地启用测试程序 - automake

zwo*_*wol 4 python automake portability

我有一个用 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
Run Code Online (Sandbox Code Playgroud)

HAVE_PYTHON 由配置脚本设置

AM_PATH_PYTHON([2.6],, [:])
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"])
Run Code Online (Sandbox Code Playgroud)

这在 Unix 上正常工作,但在 Windows 上因“没有规则来制作 tester.py.exe”而爆炸。此外,使#!线路正确的复制和替换技术意味着我无法将测试套件分解为多个模块。

有一个更好的方法吗?

Jac*_*lly 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
Run Code Online (Sandbox Code Playgroud)

有什么理由不只是通过 进行替换configure.ac吗?

AS_IF([test "$PYTHON" != ":"], [AC_CONFIG_FILES([src/test/tester.py])])
Run Code Online (Sandbox Code Playgroud)

这将使用config.status并自动生成重建规则重新制作脚本。

编辑 1:

如果您真正想做的是将 python 测试程序脚本作为 的一部分运行make check,我会这样做:

check-local:
if HAVE_PYTHON
        $(PYTHON) $(srcdir)/src/test/tester.py
endif
Run Code Online (Sandbox Code Playgroud)

(我把 放在check-local外面,if HAVE_PYTHON这样你就可以定义其他命令作为 的一部分运行check-local,如果需要的话。)

你可能更喜欢写这个,而不是:

check-local:
        test "$(PYTHON)" != ":" && $(PYTHON) $(srcdir)/src/test/tester.py
Run Code Online (Sandbox Code Playgroud)

请参阅automake 手册中的扩展