В системах GNU/Linux, откуда я должен загружать данные приложения?

В данном случае я использую c с autoconf, но вопрос относится и к другому месту.

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

Спасибо


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


person DaedalusFall    schedule 08.06.2009    source источник


Ответы (4)


Я не думаю, что есть какой-то стандартный способ найти такие данные.

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

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

person rasjani    schedule 08.06.2009

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

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

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

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

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

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

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

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

person Ivan Vučica    schedule 08.06.2009
comment
спасибо, и спасибо за пример. Но я бы сказал, что $(datadir)/program-name следует делать перед текущим каталогом, на всякий случай, если есть похожий файл. представьте, если бы вы сделали sudo foo и foo сначала проверили локальный каталог на наличие какого-то файла... результат мог бы быть катастрофическим! - person DaedalusFall; 09.06.2009

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

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

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

person Zifre    schedule 08.06.2009
comment
Нет, autoconf позволяет указать любой установочный каталог при сборке, поэтому местоположение должно исходить из autoconf. использование такого фиксированного пути - плохая идея. - person DaedalusFall; 09.06.2009
comment
@Daedalus: я имел в виду, если вы установили его из пакета. Даже с autoconf это будет путь по умолчанию (при условии, что вы установили префикс /usr). - person Zifre; 10.06.2009

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

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

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

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

person codebunny    schedule 08.06.2009
comment
Большинство дистрибутивов запрещают своим пакетам устанавливать что-либо в папку ~. В многопользовательском хосте вы будете занимать дисковое пространство и вызывать множество проблем с анализом и доступом. - person rasjani; 09.06.2009
comment
Но опять же, я не заметил, что вы упомянули настраиваемую часть, тогда, очевидно, единственное место где-то внутри ~ =) - person rasjani; 09.06.2009