2015-12-14 2 views
0

Certaines installations clientes Oracle fournissent les 32 bits et 64 bits des bibliothèques partagées, par exemple:AC_CHECK_LIB à plusieurs endroits

  • $ORACLE_HOME/lib
  • $ORACLE_HOME/lib32

Comment puis-je trouver avec autoconf la emplacement correct de libclntsh pour l'architecture cible actuelle?

AC_CHECK_PROG La famille a un paramètre optionnel [path = ‘$PATH’]. AC_CHECK_LIB n'en a pas.

Essayé dans une boucle:

saveLIBS=$LIBS 

for my_archdir in baddir lib32 lib; do 
    LIBS="$saveLIBS -L$ORACLE_HOME/$my_archdir" 
    AC_CHECK_LIB([clntsh],[sqlcxt]) 
done 

résultats:

checking for sqlcxt in -lclntsh... no 
checking for sqlcxt in -lclntsh... (cached) no 
checking for sqlcxt in -lclntsh... (cached) no 

On dirait AC_CHECK_LIB ne peut pas être appelé deux fois. Il renvoie toujours le premier résultat mis en cache.

Répondre

0

Le nom de la variable de cache est documenté. Maintenant, je l'ai annulé avant la prochaine itération:

# check $ORACLE_HOME/lib 
saveLIBS=$LIBS 

# break after 1st try, if was cached; reset if it wasn't 
if ${ac_cv_lib_clntsh_sqlcxt+:} false; then : 
    my_cont='break' 
else 
    my_cont='unset ac_cv_lib_clntsh_sqlcxt' 
fi 

for my_archdir in lib lib32 lib64; do 
    LIBS="$saveLIBS -L$ORACLE_HOME/$my_archdir" 
    AC_CHECK_LIB([clntsh],[sqlcxt]) 
    test "x$ac_cv_lib_clntsh_sqlcxt" != "xyes" || break # break if found 
    $my_cont 
done 
0

J'ai rencontré un problème similaire. J'utilise AC_CHECK_LIB pour déterminer si libdvbpsi est disponible.

Au début, j'utilisé les éléments suivants:

AC_CHECK_LIB([dvbpsi], [dvbpsi_pat_attach]) 

Mais je réalise que dvbpsi_pat_attach est un nom de fonction qui est présente uniquement dans les dernières versions. Les anciennes versions de la bibliothèque utilisent une ancienne convention de dénomination et la fonction est nommée dvbpsi_AttachPAT. Mon propre projet a un support de compatibilité en amont pour les versions anciennes et nouvelles de la bibliothèque, donc je devrais être capable de détecter les deux. Ce qui suit est ce que je l'utilise maintenant:

AC_CHECK_LIB([dvbpsi], [dvbpsi_pat_attach], [], [AC_CHECK_LIB([dvbpsi], [dvbpsi_AttachPAT])]) 

Les deux premiers paramètres sont les mêmes que ce que vous êtes habitué. Le troisième paramètre est laissé vide. Ce paramètre est le action if found, dont nous ne voulons rien. Le paramètre suivant est le action if not found ... Si ce n'est pas le cas, nous voulons répéter le test mais rechercher un autre nom de fonction. J'ai inséré un AC_CHECK_LIB imbriqué dans le cas action if not found et maintenant ce bloc détecte correctement les anciennes et les nouvelles versions de la bibliothèque. De toute évidence, ce n'est pas une solution directe à votre problème, mais cela répond au fait que "AC_CHECK_LIB ne peut pas être appelé deux fois, il renvoie toujours le premier résultat mis en cache.", Comme vous l'avez décrit dans votre question.

Dans votre cas, vous pouvez essayer le bloc de code suivant:

LIBS="$saveLIBS -L$ORACLE_HOME/baddir" 
AC_CHECK_LIB([clntsh], [sqlcxt], [], [ 
    LIBS="$saveLIBS -L$ORACLE_HOME/lib32" 
    AC_CHECK_LIB([clntsh], [sqlcxt], [], [ 
    LIBS="$saveLIBS -L$ORACLE_HOME/lib" 
    AC_CHECK_LIB([clntsh], [sqlcxt]) 
    ]) 
]) 
+0

chèques emboîtées produisent souvent script de configuration non valide: par exemple une fonction shell défini après que l'on appelle – basin

+0

il est sûr dans ce cas. fonctionne très bien dans mon propre projet: https://github.com/mkrufky/libdvbtee/blob/master/configure.ac (ligne 47) – mkrufky