2009-10-27 4 views
2

Comment doit être réinitialisé AC_CACHE_CHECK?Comment AC_CACHE_CHECK doit-il être réinitialisé?

En autoconf je vérifie les en-têtes. J'ai ajouté une certaine logique pour essayer un peu plus difficile de trouver les fichiers d'en-tête dans les dossiers std qui pourraient ne pas être dans le chemin d'inclusion par défaut. La façon dont je fais cela est d'abord essayer de trouver un fichier d'en-tête avec le AC_CHECK_HEADER intégré. Si l'en-tête n'est pas trouvé, je modifie le CPPFLAGS et réessaie.

Le problème avec ceci est la mise en cache d'autoconf. Je veux forcer la vérification (ou contourner la vérification du cache.) Si je ne force pas, si autoconf trouve l'en-tête ou non, il va tirer ce qu'il a trouvé dans la première vérification, pouah.

Merci, Chenz

+0

Aucune des réponses n'a fonctionné pour vous? –

Répondre

2

Désarmer la variable de cache, comme ac_cv_header_syslog_h. Vous pouvez vérifier config.log pour l'orthographe exacte de la variable de cache qui vous intéresse. Malheureusement, la désactivation d'une variable shell ne peut pas être effectuée de façon portative. La solution de contournement interne utilisée par Autoconf utilise $as_unset, qui s'étend à unset si elle est prise en charge. Donc, vous pouvez écrire:

$as_unset ac_cv_header_syslog_h 

Cela devrait fonctionner dans la plupart des systèmes actuels.

Une solution plus simple et plus simple consisterait à définir correctement CPPFLAGS pour le premier tour de contrôle. Comme vous l'avez remarqué, ce que vous essayez n'est pas vraiment supporté.

+0

Merci pour le commentaire. Je recommande d'utiliser la fonction 'AS_UNSET ([var_name])' de style autoconf. Je suis en train de coder ma propre fonction en haut de 'AC_CHECK_HEADERS' et le problème est que je ne connais pas à l'avance le (s) nom (s) de la variable à désactiver (mais je connais les en-têtes). Je suppose que j'ai besoin de reconstruire le nom. Que pouvez-vous recommander? –

+0

@PeterEisentraut Je me demande quelle est l'utilisation du résultat en cache de AC_CACHE_CHECK – Bionix1441

2

J'ai implémenté une petite macro, qui fait le travail (au moins pour moi). Avec des modifications mineures, il peut être utilisé pour invalider d'autres variables du cache:

# SYNOPSIS 
# 
# AX_RESET_HEADERS_CACHE(headers ...) 
# 
# DESCRIPTION 
# 
# This macro invalidates the headers cache variables created by previous AC_CHECK_HEADER/AC_CHECK_HEADERS checks. 
# 
AC_DEFUN([AX_RESET_HEADERS_CACHE], [ 
    AS_FOR([AX_var], [ax_var], [$1], [ 
     dnl You can replace "ac_cv_header_" with any prefix from http://www.gnu.org/software/autoconf/manual/html_node/Cache-Variable-Index.html 
     AS_VAR_PUSHDEF([ax_Var], [ac_cv_header_${ax_var}]) 
     AS_UNSET([ax_Var]) 
     AS_VAR_POPDEF([ax_Var]) 
    ]) 
]) # AX_RESET_HEADERS_CACHE 

et d'utilisation (dans cette boucle 1 $ = une bibliothèque (par exemple "netpbm"), $ 2 = en-têtes (par exemple "pbm.h ppm.h"), $ 3 = emplacements (par exemple "/ usr/include/usr/local/include")):

for ac_test_location in $3 
do 
    dnl Save the current state 
    ax_probe_library_save_CPPFLAGS=${CPPFLAGS} 

    CPPFLAGS="$CPPFLAGS -I${ac_test_location}" 

    AC_MSG_CHECKING([$1 for $2 in ${ac_test_location}]) 
    AS_ECHO() 
    _AS_ECHO_LOG([CPPFLAGS="${CPPFLAGS}"]) 

    AC_CHECK_HEADERS([$2], [ac_lib_$1=yes], [ac_lib_$1=no]) 

    dnl We have found the location, leave the loop: 
    if test "${ac_lib_$1}" = "yes" 
    then 
     break; 
    fi 

    dnl Restore the state to original in case of unsuccessful attempt 
    CPPFLAGS=${ax_probe_library_save_CPPFLAGS} 
    AX_RESET_HEADERS_CACHE([$2]) 
done 
Questions connexes