В системах GNU / Linux, откуда мне загружать данные приложений? - PullRequest
3 голосов
/ 09 июня 2009

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

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

Спасибо


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

Ответы [ 4 ]

2 голосов
/ 09 июня 2009

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

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

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

1 голос
/ 09 июня 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.

0 голосов
/ 09 июня 2009

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

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

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

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

0 голосов
/ 09 июня 2009

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

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

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

...