2009-03-13 4 views
2

J'ai un projet écrit en C++ (avec glibmm aid), et j'utilise autotools pour le gérer. La question que je dois me poser est: «COMMENT PUIS-JE DÉCOUVRIR LA TERRE?». Alors que je peux trouver tous les guides que je veux sur les autotools, aucun ne répondra à cette question.Comment savoir où charger les données du programme?

Par exemple, les cartes vont dans $DATADIR/maps (généralement /usr/[local/]share/myprogram/maps. Autotools la bonne chose et les met là, mais comment puis-je savoir si elle les a mis là ou $HOME/myprogram/maps et de les charger de façon appropriée (idealement il avait rechercherait $PWD premier , mais c'est facile).

Répondre

2

Jonathan Leffler réponse m'a été utile (il m'a fourni suffisamment d'informations pour pouvoir évaluer l'évolution de la source et trouver ce que je devais faire), mais il n'a pas entièrement répondu à ma question. :

En configure.ac (ou configure.in, peu importe) J'ai ajouté les lignes suivantes à la fin:

# Defines so we know where to look 
privdatadir='${datadir}'/myprogram 
AC_SUBST(privdatadir) 

mapsdir='${privdatadir}'/maps 
AC_SUBST(mapsdir) 

src/Makefile.am, ce qui suit a été ajouté:

AM_CXXFLAGS = -DMYPROGRAM_MAPSDIR=\"$(mapsdir)\" 

Dans le code actuel C++, ce qui suit a été utilisé:

const std::string file_directory (MYPROGRAM_MAPSDIR); // Defined in Makefile.am 

Encore une fois, merci Jonathan pour me montrer où regarder, mais je voulais poster la réponse complète pour la postérité.

2

vous pouvez construire les chaînes dans votre exécutable pour les différents emplacements configurées automatiquement que vous pourriez vouloir regarder. Cela est plus ou moins ce que les programmes tels que GCC faire.

par exemple, GCC 4.3.3 sur ma machine a été compilé sous/work5/tmp et configuré pour l'installation dans /usr/gcc/v4.3.3, et il co ntains (parmi beaucoup d'autres) les cordes:

/usr/ccs/bin/ 
/usr/ccs/lib/ 
/usr/gcc/v4.3.3 
/usr/gcc/v4.3.3/bin/ 
/usr/gcc/v4.3.3/lib 
/usr/gcc/v4.3.3/lib/gcc/ 
/usr/gcc/v4.3.3/libexec/gcc/ 
/usr/gcc/v4.3.3/share/locale 
/usr/gnu/include 
/usr/include 
/usr/include/iso 
/usr/include/sys 
/usr/lib/ 
/usr/lib/ld.so.1 
/usr/libexec/gcc/ 
/usr/local/share/bison 
/usr/tmp 
/var/tmp 
/var/tmp/ 
/work5/tmp/gcc-4.3.3-obj/./prev-gcc/include 
/work5/tmp/gcc-4.3.3-obj/gcc 
/work5/tmp/gcc-4.3.3-obj/intl 
/work5/tmp/gcc-4.3.3-obj/libiberty 
/work5/tmp/gcc-4.3.3-obj/sparc-sun-solaris2.10/libgcc 

Un commentaire dit: « Voilà ce que je suis en train de comprendre comment faire? »

Il existe de nombreuses façons. Une partie de la réponse consiste à savoir de quels noms vous avez besoin. Si vous regardez la sortie autoconfigure, il y a des noms tels que prefixdir et pkglibdir dans le fichier makefile. Vous pouvez les ajouter aux lignes du compilateur C:

DFLAG1 = -DPKGLIBDIR='"$(pkglibdir)"' 

et d'ajouter DFLAG1 à votre CFLAGS. Répéter ad nauseam ...

Le code dans votre programme peut alors faire des choses comme:

static const char *libdirs_to_search[] = 
{ 
    ... 
#ifdef PKGLIBDIR 
    PKGLIBDIR, 
#endif /* PKGLIBDIR */ 
}; 

Un nettoyeur façon de le faire est de modifier le fichier config.h généré et le code de configuration afin que la Les répertoires qui vous intéressent sont définis dans le fichier config.h plutôt que dans le fichier makefile.

+0

... c'est ce que j'essaie de comprendre comment faire. – MighMoS

Questions connexes