сделать distcheck и тесты, которым нужны входные файлы

Недавно я преобразовал свою систему сборки в automake/autoconf. В моем проекте у меня есть несколько модульных тестов, которым нужны файлы входных данных в каталоге, откуда они запускаются. Когда я запускаю make distcheck и он пытается выполнить сборку VPATH, эти тесты терпят неудачу, потому что они явно не запускаются из каталога, в котором находятся входные файлы. Мне было интересно, есть ли какое-то быстрое решение для этого. Например, могу ли я как-то сказать системе, чтобы она не запускала эти тесты на make distcheck (но все же запускала их на make check)? Или перейти в каталог, где находятся файлы, перед запуском тестов?


person Martin Wiebusch    schedule 04.07.2012    source источник


Ответы (2)


У меня была та же проблема, и я использовал решение, похожее на решение Уильяма. Мой Makefile.am выглядит примерно так:

EXTRA_DIST = testdata/test1.dat

AM_CPPFLAGS = -DDATADIR=\"$(srcdir)/\"

Затем в моем модульном тесте я использую определение DATADIR:

string path = DATADIR "/testdata/test1.dat"

Это работает с make check и make distcheck.

person David Marek    schedule 15.08.2012

Типичное решение состоит в том, чтобы написать тесты так, чтобы они искали в исходном каталоге файлы данных. Например, вы можете сослаться на $srcdir в тесте или преобразовать test в test.in и сослаться на @srcdir@.

Если все ваши тесты находятся в исходном каталоге, вы можете запустить все тесты в этом каталоге, установив TESTS_ENVIRONMENT в Makefile.am:

TESTS_ENVIRONMENT = cd $(srcdir) &&

Это не удастся, если некоторые из ваших тестов созданы с помощью configure и поэтому живут только в каталоге сборки, и в этом случае вы можете выборочно cd с чем-то вроде:

 TESTS_ENVIRONMENT = { test $${tst} = mytest && cd $(srcdir); true; } &&

Попытка использовать TESTS_ENVIRONMENT таким образом в лучшем случае ненадежна, и было бы лучше написать тесты так, чтобы они искали в исходном каталоге файлы данных.

person William Pursell    schedule 06.07.2012
comment
Мои тесты находятся в src/some/path, а файлы данных находятся в том же каталоге. Я попробовал трюк TESTS_ENVIRONMENT = cd $(srcdir) &&, но он не сработал, потому что теперь он больше не находит исполняемый файл теста. Копирование необходимых файлов данных в текущий каталог также не работает, потому что в сборке VPATH у вас, по-видимому, нет прав на запись в каталог, в котором выполняются тесты. - person Martin Wiebusch; 09.07.2012
comment
@Martin, у вас нет доступа для записи в исходный каталог, но у вас есть доступ для записи в каталог сборки. Как вы копируете файл? Простое добавление EXTRA_DIST = datafile в Makefile.am и cp ${srcdir}/datafile . в test.in должно работать. Однако, если тест выполняется из исходного каталога, попытка копирования завершится ошибкой из-за прав на запись. Я подозреваю, что у вас есть некоторые тесты, которые запускаются из каталога сборки, а некоторые — из исходного каталога. (Тесты с именем *.in (вероятно) запускаются из каталога сборки, тогда как другие тесты запускаются из исходного каталога.) - person William Pursell; 09.07.2012
comment
Это выглядело именно так, как я искал, но, к сожалению, это не работает с Automake 1.15: при этом он создает файлы *.log и *.trs в исходном каталоге (что уже плохо), но все еще ищет их в директорию сборки и, естественно, не находит их там (что фатально). - person VZ.; 12.01.2017