2009-06-08 4 views
3

В этом случае я использую c с autoconf, но вопрос применяется в другом месте.В системах GNU/Linux Где я должен загружать данные приложения?

У меня есть файл glade xml, который необходим во время выполнения, и я должен сообщить приложение, где оно есть. Я использую autoconf для определения переменной в моем коде, которая указывает на «указанный префиксный каталог»/app-name/glade. Но это только начинает работать после установки приложения. Что делать, если я хочу запустить программу до этого? Существует ли стандартный способ определения путей проверки данных приложения?

Благодаря


спасибо за ответы. Чтобы уточнить, мне не нужно знать, где установлены данные приложения (например, путем поиска в/usr, usr/local и т. Д. И т. Д.), Это делает скрипт configure. Проблема заключалась в определении того, установлено ли приложение еще. Наверное, я сначала проведу установку в месте установки, а если нет, то в ./src/foo.glade.

ответ

2

Я не думаю, что существует какой-либо стандартный способ определения местоположения таких данных.

Я лично сделал бы это так, чтобы у меня был список путей, и я бы нашел, могу ли я найти файл у кого-либо из них, и список должен содержать DATADIR + APPNAME, определенные из autoconf и CURRENTDIRECTORY + POSSIBLE_PREFIX, где префикс может быть некоторой папкой из вашего корня сборки.

Но в любом случае, не забудьте использовать те из Autoconf Определяет для файлов данных, те, сделать ваше программное обеспечение проще упаковать (например, Деб об/мин)

0

Если программа установлена ​​глобально:

 
/usr/share/app-name/glade.xml 

Если вы хотите, чтобы программа работать без установки (т.е. просто извлечь тарболл), поместите его в директорию программы.

+0

Нет, autoconf позволяет указать любой установочный каталог при его создании, поэтому местоположение должно быть получено из autoconf. использование фиксированного пути, как это, является плохой идеей. – DaedalusFall

+0

@Daedalus: Я имел в виду, если вы его установили из пакета. Даже с autoconf это будет то, что путь должен выйти по умолчанию (если вы установите префикс в/usr). – Zifre

0

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

Это зависит от того, сколько потребуется настроить конфигурационный файл.

Я начинаю с создания списка каталогов по умолчанию и работаю с ними до тех пор, пока не найду экземпляр glade.xml и не перестану искать или не найду его и не выйду с ошибкой. Хорошими кандидатами для списка по умолчанию являются/etc,/usr/share/app-name,/usr/local/etc.

Если файл предназначен для настройки, прежде чем я просматриваю каталоги по умолчанию, у меня есть список пользовательских файлов и путей и работайте с ними. Если он не находит одну из пользовательских версий, я просматриваю список каталогов по умолчанию. Хорошими кандидатами для пользовательских конфигурационных файлов являются ~/.glade.xml или ~/.app-name/glade.xml или ~/.app-name/.glade.xml.

+0

Большинство дистрибутивов запрещают их пакеты, чтобы установить что-либо в папку ~. В многопользовательском хосте вы должны быть в дисках и создавать множество проблем синтаксического анализа и доступа. – rasjani

+0

Но опять же, я не заметил, что вы упомянули «настраиваемую» часть, тогда, очевидно, единственное место где-то внутри ~ =) – rasjani

1

Нет никаких рецептов, как это должно быть сделано в целом, но пакеты Debian обычно устанавливают данные приложения где-то в/usr/share,/usr/lib и т. Д. Они также могут исправлять программное обеспечение, чтобы оно считывалось из соответствующих мест. Вы можете увидеть Debian policy для получения дополнительной информации.

Я могу сказать несколько слов, как я это делаю. Во-первых, я не ожидаю найти файл в одном каталоге; Сначала я создаю список каталогов, которые я повторяю в своей обертке около fopen().Это порядок, в котором я считаю, что чтение файла должно быть сделано:

  • текущий каталог (очевидно)
  • ~/.program-name
  • $(datadir)/program-name

$(datadir) это переменная, которую можно использовать в Makefile. есть. Пример:

AM_CPPFLAGS = $(ASSERT_FLAGS) $(DEBUG_FLAGS) $(SDLGFX_FLAGS) $(OPENGL_FLAGS) -DDESTDIRS=\"$(prefix):$(datadir)/:$(datadir)/program-name/\" 

Это, конечно, зависит от вашего выхода из configure и как ваш configure.ac выглядит.

Итак, сделайте обертку, которая будет проходить через места и получать данные из этих каналов. Что-то вроде переменной PATH, за исключением реализации итерации.

После написания этого сообщения, я заметил, что мне нужно очистить нашу реализацию в this project, но это может послужить хорошим началом. Взгляните на наш Makefile.am для использования $(datadir) и наших util.cpp и util.h для простой обертки (yatc_fopen()). У нас также есть yatc_find_file(), если какая-то сторонняя библиотека делает fopen() ing, например SDL_image или libxml2.

+1

спасибо и спасибо за пример. Но я бы утверждал, что $ (datadir)/имя-программы должно быть выполнено до текущей директории, на всякий случай, когда есть похожий файл. представьте, если вы сделали 'sudo foo' и foo сначала проверили локальный каталог для некоторого файла ... результат может быть катастрофическим! – DaedalusFall

Смежные вопросы