2009-01-21 11 views
1

Je suis en train d'écrire mon premier projet qui utilisera autoconf et m'enseignera à mesure que je m'en irai. Pour la plupart, les choses vont extrêmement bien. J'ai un dernier obstacle important. Je n'arrive pas à localiser les fichiers de bibliothèque et d'en-tête qui peuvent être nommés différemment d'un système à l'autre.Utiliser Autoconf pour trouver des bibliothèques avec des noms variables

Par exemple, j'ai besoin de compiler avec SpiderMonkey de Mozilla. Une fois compilé à partir de la source, SpiderMonkey devient libjs.so. Sur ma variante Linux, cependant, SpiderMonkey est installé en tant que libmozjs.so. C'est la même bibliothèque, juste un nom différent, donc un drapeau d'éditeur différent.

Existe-t-il un moyen approprié de détecter le nom de la bibliothèque? Est-ce que je le mets par défaut à 'js' et donne une option de configuration pour le surcharger?

J'ai la même situation avec les fichiers d'en-tête. Les fichiers d'en-tête pour SpiderMonkey sont installés dans/usr/include/mozjs/sur mon système d'exploitation. Je suis sûr que sur d'autres systèmes, ce sera/usr/include/js/ou peut-être même simplement/usr/include /. Comment trouver l'emplacement du fichier d'en-tête approprié? J'hésitais à faire un "find" à la vanille car il serait lent et je pourrais trouver la mauvaise copie du fichier (trouver le fichier dans le répertoire personnel d'un utilisateur au lieu de/usr/include/par exemple.)

Répondre

1

En plus d'ajouter une option pour spécifier le chemin/nom explicitement, s'il y a quelques noms ou emplacements bien connus, vous pouvez simplement les essayer dans l'ordre jusqu'à ce que vous réussissiez, en utilisant quelque chose comme ça :

AC_TRY_LINK([#include "mpi.h"],[MPI_Init(0, 0);], [mpi_link="yes"], [mpi_link="no"]); 

Ou simplement utiliser test. Je le suit pour ramasser les bibliothèques Boost qui ont été construits, possible avec des noms légèrement différents:

for lib in "date_time" "filesystem" "regex" "unit_test_framework" "signals"; do 
    if test -f ${$1_libdir}/libboost_$lib-gcc$boost_thread_flag.a; then 
     BOOST_LIBS="$BOOST_LIBS -lboost_$lib-gcc$boost_thread_flag" 
    elif test -f ${$1_libdir}/libboost_$lib-gcc$boost_thread_flag-s.a; then 
     BOOST_LIBS="$BOOST_LIBS -lboost_$lib-gcc$boost_thread_flag-s" 
    elif test -f ${$1_libdir}/libboost_$lib$boost_thread_flag.a; then 
     BOOST_LIBS="$BOOST_LIBS -lboost_$lib$boost_thread_flag" 
    elif test -f ${$1_libdir}/libboost_$lib.a; then 
     BOOST_LIBS="$BOOST_LIBS -lboost_$lib" 
    fi 
done 
0

I d aller avec une option: --with-spidermonkey-library= --with-spidermonkey-include=

Et puis mettre les valeurs par défaut/recherche si les options ne sont pas spécifiées. (Probablement juste par défaut)

2

AC_TRY_LINK (avec ou sans une boucle) est inutilement redondant. Il suffit de prendre, par exemple, cette recette:

LIBS="" 
AC_SEARCH_LIBS([spidermonkey_init], [mozjs js], [sp_libs="$LIBS"; LIBS=""], []) 
Questions connexes