выборочное включение тестовой программы, если доступен Python - automake - PullRequest
3 голосов
/ 30 июля 2011

У меня есть программа, написанная на 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, но взрывается с «без правил, чтобы сделать tester.py.exe» в Windows. Кроме того, метод копирования и замены для правильной строки #! означает, что я не могу разбить набор тестов на несколько модулей.

Есть ли лучший способ сделать это?

1 Ответ

4 голосов
/ 30 июля 2011

Вы должны использовать _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:

Если вы действительно хотите запустить скрипт тестера python как часть make check, я бы сделал это:

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

См. расширение в руководстве по автоматике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...