Установка и использование пути к каталогу данных с помощью GNU AutoTools - PullRequest
2 голосов
/ 21 октября 2011

Я пытаюсь использовать GNU AutoTools для моего проекта C ++. Я написал configure.ac, makefile.am и т. Д. У меня есть несколько файлов, которые используются программой во время выполнения, например, файлы шаблонов, схемы XML и т. д. Итак, я устанавливаю / копирую эти файлы вдоль исполняемого файла, для чего я использую что-то вроде:

abcdir = $(bindir)/../data/abc/
abc_DATA = ../data/knowledge/abc.cc

Теперь он правильно копирует файл, и структура установки моей программы выглядит следующим образом:

<installation_dir>/bin/<executableFile>
<installation_dir>/data/abc/abc.cc

Теперь проблема в том, что в исходном коде я фактически использую эти файлы (abc.cc и т. Д.), И для этого мне нужен путь, где находятся эти файлы, чтобы открыть их. Одно решение состоит в том, чтобы определить (используя AC_DEFINE) некоторую переменную, например. _ABC_PATH_ это указывает на путь установки, но как именно это сделать? ИЛИ есть ли лучший способ сделать это. Например, в исходном коде я делаю что-то вроде:

...
ifstream input(<path-to-abc-folder> + "abc.cc"); // how to find <path-to-abc-folder>?
..

1 Ответ

4 голосов
/ 21 октября 2011

Решение AC_DEFINE в принципе хорошо, но требует расширения в виде оболочки.То есть _ABC_PATH_ будет расширяться до "$ {bindir} /../ data / abs", а не /data/abc.

Один из способов - определить путь с помощью флага -D, который расширяетсяmake:

myprogram_CPPFLAGS += -D_ABC_PATH='\"${abcdir}\"'

, которая в принципе работает нормально, но вы должны включить config.status в зависимости myprogram.

Если у вас есть несколько таких переменных подстановки, вам следуетразверните файл paths.h, который генерируется automake с правилом вроде:

paths.h : $(srcdir)/paths.h.in config.status
     sed -e 's:@ABC_PATH@:${abcdir}:' $< > $@

В качестве примечания вы знаете о $ {prefix} и $ {datarootdir} и друзьях, don 'ты?Если нет, лучше прочитайте их;$ {bindir} / .. не обязательно равен $ {prefix}, если пользователь установил $ {exec_prefix}.

...