Utilisation d'Autoconf pour rechercher des bibliothèques nommées de manière variable

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

  •  19-08-2019
  •  | 
  •  

Question

J'écris mon premier projet qui utilisera autoconf et je l'enseignerai au fur et à mesure. Pour la plupart, les choses vont extrêmement bien. J'ai un dernier obstacle important. Je ne parviens pas à localiser les fichiers de bibliothèque et d'en-tête pouvant être nommés différemment d'un système à l'autre.

Par exemple, je dois compiler avec SpiderMonkey de Mozilla. Une fois compilé à partir des sources, 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 différent.

Existe-t-il un moyen approprié de détecter le nom de la bibliothèque? Dois-je simplement le définir par défaut sur 'js' et donner une option de configuration pour le remplacer?

J'ai la même situation avec les fichiers d'en-tête. Les fichiers d'en-tête de 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 le bon emplacement pour le fichier d'en-tête? J’étais hésitant à faire une "découverte" à la vanille car cela serait lent et que je pourrais trouver la mauvaise copie du fichier (trouver le fichier dans le répertoire de base d'un utilisateur à la place de / usr / include / for example.)

Était-ce utile?

La solution

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

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

Ou utilisez simplement test. J'ai utilisé ce qui suit pour récupérer les librairies boost réellement construites, possibles 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

Autres conseils

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

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

Je choisirais une option: - with-spidermonkey-library = --with-spidermonkey-include =

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

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