Недавно я преобразовал свою систему сборки в automake/autoconf. В моем проекте у меня есть несколько модульных тестов, которым нужны файлы входных данных в каталоге, откуда они запускаются. Когда я запускаю make distcheck и он пытается выполнить сборку VPATH, эти тесты терпят неудачу, потому что они явно не запускаются из каталога, в котором находятся входные файлы. Мне было интересно, есть ли какое-то быстрое решение для этого. Например, могу ли я как-то сказать системе, чтобы она не запускала эти тесты на make distcheck (но все же запускала их на make check)? Или перейти в каталог, где находятся файлы, перед запуском тестов?
сделать distcheck и тесты, которым нужны входные файлы
Ответы (2)
У меня была та же проблема, и я использовал решение, похожее на решение Уильяма. Мой Makefile.am выглядит примерно так:
EXTRA_DIST = testdata/test1.dat
AM_CPPFLAGS = -DDATADIR=\"$(srcdir)/\"
Затем в моем модульном тесте я использую определение DATADIR:
string path = DATADIR "/testdata/test1.dat"
Это работает с make check
и make distcheck
.
Типичное решение состоит в том, чтобы написать тесты так, чтобы они искали в исходном каталоге файлы данных. Например, вы можете сослаться на $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 таким образом в лучшем случае ненадежна, и было бы лучше написать тесты так, чтобы они искали в исходном каталоге файлы данных.
EXTRA_DIST = datafile
в Makefile.am и cp ${srcdir}/datafile .
в test.in должно работать. Однако, если тест выполняется из исходного каталога, попытка копирования завершится ошибкой из-за прав на запись. Я подозреваю, что у вас есть некоторые тесты, которые запускаются из каталога сборки, а некоторые — из исходного каталога. (Тесты с именем *.in
(вероятно) запускаются из каталога сборки, тогда как другие тесты запускаются из исходного каталога.)
- person William Pursell; 09.07.2012
*.log
и *.trs
в исходном каталоге (что уже плохо), но все еще ищет их в директорию сборки и, естественно, не находит их там (что фатально).
- person VZ.; 12.01.2017