2017-10-15 6 views
0

J'essaie de comprendre le fichier configure.ac pour le package libXrender:D'où sont substituées les variables dans configure.ac?

... 
AC_INIT(libXrender, [0.9.8], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libXrender]) 
AC_CONFIG_SRCDIR([Makefile.am]) 
AC_CONFIG_HEADERS([config.h]) 

AM_INIT_AUTOMAKE([foreign dist-bzip2]) 
AC_PROG_LIBTOOL 

# Require X.Org macros 1.8 or later for AC_PROG_INSTALL 
m4_ifndef([XORG_MACROS_VERSION], [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) 
XORG_MACROS_VERSION(1.8) 
XORG_DEFAULT_OPTIONS 
XORG_CHECK_MALLOC_ZERO 

# Check render configuration, strip extra digits from package version to 
# find the required protocol version 
if test "$VERSION" = "" ; then 
     VERSION=$PACKAGE_VERSION; 
fi 
RENDER_VERSION=[`echo $VERSION | sed 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/'`] 
AC_SUBST(RENDER_VERSION) 

# Obtain compiler/linker options for depedencies 
PKG_CHECK_MODULES(RENDER, x11 renderproto >= $RENDER_VERSION) 

# Check for _XEatDataWords function that may be patched into older Xlib release 
SAVE_LIBS="$LIBS" 
LIBS="$RENDER_LIBS" 
AC_CHECK_FUNCS([_XEatDataWords]) 
LIBS="$SAVE_LIBS" 

AC_CONFIG_FILES([Makefile 
     src/Makefile 
     xrender.pc]) 
AC_OUTPUT 

Je comprends que AC_INIT et AM_INIT_AUTOMAKE, etc. sont des macros qui sont spécifiées dans les répertoires d'installation GNU Autotools et XORG_MACROS_VERSION, etc. sont spécifié dans les répertoires d'installation du paquet X.org (je pense). Ce que je ne comprends pas est, d'où les variables comme $VERSION, $PACKAGE_VERSION et $LIBS obtiennent-elles leurs valeurs? N'est-ce pas configure.ac censé être comme, le fichier d'entrée «de premier niveau»?

Répondre

1

Est-ce que configure.ac n'est pas censé être comme le fichier d'entrée "de premier niveau"?

Je certainement moi-même la caractérisation, mais ce que vous et je veux dire par cela doit être différent, parce que je ne vois pas comment il porte sur votre question centrale:

Ce que je ne comprendre est, d'où des variables comme $ VERSION, $ PACKAGE_VERSION et $ LIBS obtenir leurs valeurs?

Rappelez-vous toujours que Autoconf est un générateur de code . Il crée un script shell à partir du fichier d'entrée que vous lui présentez, en utilisant une configuration personnalisée du macro-processeur m4, une bibliothèque de macros intégrée et toutes les macros supplémentaires qui lui sont fournies. La plupart de ces macros émettent du code shell qui provoque la définition des variables shell lorsque le script configure résultant est exécuté. Ces variables appartiennent à configure; ils sont juste du texte à Autoconf lui-même. (Généralement, il y a, en fait, un ou deux pièges dans cette zone.)

Différentes variables sont définies et/ou modifiées par le code shell produit par différentes macros. Par exemple, AC_INIT émet un code qui définit $PACKAGE_VERSION. Je pense qu'il est également responsable de $VERSION, mais je ne trouve pas cela documenté. D'autre part, certaines variables prennent leurs valeurs initiales de l'environnement dans lequel est exécuté configure. $LIBS est l'un d'entre eux. Dans l'événement (habituel) qu'il n'est pas défini dans l'environnement, il résulte du comportement de shell ordinaire que la valeur initiale est effectivement vide. Cette variable particulière est mise à jour par le code généré par the AC_CHECK_LIB and AC_SEARCH_LIBS macros, et éventuellement d'autres.

Pour en revenir à la nature d'Autoconf, votre confusion vient peut-être d'une incapacité à apprécier la distinction entre une macro et une fonction. Autoconf développe les macros de façon récursive pour produire un script shell. La sémantique du script résultant est tout ce qui suit du code résultant. Les macros Autoconf n'offrent aucune portée pour les variables de shell qui apparaissent dans le script résultant.

+0

Merci pour la réponse détaillée! Je crois que vous avez correctement indiqué ma confusion. Je pensais du point de vue des fonctions, c'est à dire d'où "configure" sera appelé, de sorte que les valeurs de ces variables puissent être transmises. Je réalise maintenant que c'est juste de la macro expansion - autoconf étend juste toutes les macros de configure.ac en utilisant des définitions trouvées ailleurs, et dans ces définitions il y aura aussi des définitions de variables, qui finissent dans "configure".Ce sont ces variables indirectement définies qui sont référencées dans configure.ac montré ci-dessus. –

+0

Les références à ces variables dans configure.ac se retrouveront également dans "configure", mais * après * les versions développées des macros précédentes comme AC_INIT, qui contiendra les définitions de ces variables. –