Поиск файлов данных в программе на C, созданной с помощью Autotools - PullRequest
2 голосов
/ 30 июня 2011

У меня есть программа на C, созданная с помощью Autotools. В src/Makefile.am я определяю макрос с путем к установленным файлам данных:

AM_CPPFLAGS = -DAM_INSTALLDIR='"$(pkgdatadir)"'

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

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

AM_CPPFLAGS = -DAM_INSTALLDIR='"$(pkgdatadir)"' -DAM_TOPDIR='"$(abs_top_srcdir)"'

Теперь мне бы хотелось следующее поведение:

  1. Если двоичный файл был установлен через make install, используйте AM_INSTALLDIR для извлечения файлов данных.
  2. Если двоичный файл не был установлен, используйте AM_TOPDIR для извлечения файлов данных.

Возможно ли это? Есть ли лучший подход к этой проблеме?

Ответы [ 3 ]

5 голосов
/ 30 июня 2011

Что я делаю (в https://http://rhdunn.github.com/cainteoir/) это:

const char *basedir = getenv("CAINTEOIR_DATADIR");
if (!basedir)
    basedir = DATADIR "/" PACKAGE; // e.g. /usr/share/cainteoir-engine

и затем запустите его (в tests / harness.py) как:

CAINTEOIR_DATADIR=`pwd`/data src/apps/metadata/metadata test_file.epub

Это тогда позволяет пользователю изменить местоположение, где получить данные, если они хотят.

3 голосов
/ 04 июля 2011

Хорошее решение - сделать программу способной использовать конфигурацию времени выполнения, предложенную reece.Если по какой-то причине вы не хотите, чтобы его можно было настраивать во время выполнения, распространенным решением является создание тестового двоичного файла, отличного от установленного двоичного файла (с этим связаны и другие проблемы, в частности обеспечение того, чтобы тестируемая программаповедение, которое согласуется с установленной программой.) Простой способ сделать это что-то вроде:

bin_PROGRAMS = foo
check_PROGRAMS = test-foo
test_foo_SOURCES = $(foo_SOURCES)
AM_CPPFLAGS = -DINSTALLDIR='"$(pkgdatadir)"'
test_foo_CPPFLAGS = -DINSTALLDIR='"$(abs_top_srcdir)"'

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

Обратите внимание, что я изменил имя с AM_INSTALLDIR на INSTALLDIR.Automake резервирует имена, начинающиеся с «AM_», для собственного использования, и, используя это имя, вы нажимаете на пространство имен Automake.

0 голосов
/ 20 июля 2011

Сначала немного дополнительной информации: файлы данных находятся в активной разработке, и у меня есть несколько сценариев, которые должны вызывать двоичные файлы с использованием локальных файлов данных, тогда как установленные двоичные файлы должны использовать стабильные установленные файлы данных.

В моем первоначальном решении использовалась переменная окружения, предложенная reece.Но я не хотел управлять настройкой переменных среды в разных местах, и я не хотел, чтобы из-за ошибки возникали неправильные файлы данных.

Таким образом, в результате я решил определить макросы для обоих местоположений во время сборки и добавить флаг (-local) в двоичные файлы, чтобы принудительно использовать локальные файлы данных.

...