Sur les systèmes GNU / Linux, Où dois-je charger des données d'application à partir?

StackOverflow https://stackoverflow.com/questions/967038

  •  12-09-2019
  •  | 
  •  

Question

Dans ce cas, j'utilise c avec autoconf, mais la question se pose d'ailleurs.

J'ai un fichier xml Glade qui est nécessaire à l'exécution, et je dois dire à l'application où il est. J'utilise autoconf pour définir une variable dans mon code qui pointe vers le répertoire « préfixe spécifié » / app-name / Glade. Mais cela ne commence à travailler une fois que l'application est installée. Que faire si je veux lancer le programme avant ce moment-là? Est-il un moyen standard pour déterminer quels chemins doivent être vérifiées pour les données d'application?

Merci


Merci pour les réponses. Pour clarifier, je ne ai pas besoin de savoir où les données d'application est installée (par exemple en effectuant une recherche dans / usr, usr / local, etc etc), le script configure le fait. Le problème était plus déterminer si l'application a encore été installé. Je suppose que je vais vérifier à l'emplacement d'installation d'abord, et si pas alors dans « ./src/foo.glade ».

Était-ce utile?

La solution

Je ne pense pas qu'il ya une façon standard sur la façon de localiser ces données.

Je personnellement le faire d'une manière que j'aurais une liste des chemins et je localiser si je peux trouver le fichier de quelqu'un de ceux-ci et la liste devrait DATADIR + le contiennent APPNAME défini de autoconf et CURRENTDIRECTORY + POSSIBLE_PREFIX où préfixe est peut-être un certain dossier à partir de la racine de votre build.

Mais en tout cas, ne pas oublier d'utiliser ces autoconf pour indiquer d'vos fichiers de données, les rendre votre logiciel plus facile à emballer (comme deb / rpm)

Autres conseils

Il n'y a pas de prescription comment cela doit être fait en général, mais emballeurs Debian installe généralement les données d'application quelque part dans / usr / share / usr / lib, et ainsi de suite. Ils peuvent également patcher le logiciel pour le faire lire à partir d'emplacements appropriés. Vous pouvez voir la politique Debian pour plus d'informations.

Je peux cependant dire quelques mots comment je le fais. Tout d'abord, je ne pense pas à trouver le fichier dans un répertoire unique; Je crée d'abord une liste de répertoires que j'itérer à travers mon emballage autour fopen(). Tel est l'ordre dans lequel je crois devrait être fait la lecture du fichier:

  • répertoire courant (évidemment)
  • ~/.program-name
  • $(datadir)/program-name

$(datadir) est une variable que vous pouvez utiliser dans Makefile.am. Exemple:

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

Bien sûr, cela dépend de votre sortie de configure et comment votre configure.ac ressemble.

Alors, juste faire un emballage qui itérer les emplacements et obtenir les données de ces dirs. Quelque chose comme une variable PATH, sauf que vous mettre en œuvre l'itération.

Après avoir écrit ce post, je remarquais que je dois nettoyer notre mise en œuvre ce projet , mais il peut servir un bon début. Jetez un oeil à notre Makefile.am pour l'utilisation $(datadir) et notre util.cpp et util.h pour un emballage simple (yatc_fopen()). Nous avons également yatc_find_file() dans le cas où une bibliothèque tierce fait l'fopen()ing, comme SDL_image ou libxml2.

Si le programme est installé au niveau mondial:

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

Si vous voulez que le programme fonctionne sans être installé (à savoir extraire juste un tarball), mettez-le dans le répertoire du programme.

Je ne pense pas qu'il y ait un moyen standard de placer des fichiers. Je construis dans le programme, et je ne me limite pas à un seul endroit.

Il dépend de la quantité de personnalisation du fichier de configuration va être nécessaire.

Je commence par la construction d'une liste des répertoires par défaut et de travailler à travers eux jusqu'à ce que je trouve une instance de glade.xml et arrêter de regarder, ou trouve pas et sortie avec une erreur. Les bons candidats pour la liste par défaut sont / etc, / usr / share / app-name, / usr / local / etc.

Si le fichier est conçu pour être personnalisable, avant que je regarde à travers les répertoires par défaut, j'ai une liste des fichiers utilisateurs et les chemins et travailler à travers eux. Si elle ne trouve pas l'une des versions de l'utilisateur, puis je regarde dans la liste des répertoires par défaut. Les bons candidats pour les fichiers de configuration utilisateur sont ~ / .glade.xml ou ~ / .app nom / glade.xml ou ~ / .app nom / .glade.xml.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top