我有一个用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”的问题.同样,获得#!的复制和替换技术.右行表示我无法将测试套件分解为多个模块.
有一个更好的方法吗?
解决方法:
您必须仅将_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 tester脚本,则可以这样做:
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
请参见自动制作手册中的extending.