2017-10-15 21 views
0

私はlibXrenderパッケージのconfigure.acファイルを理解しようとしています:私はAC_INIT、およびAM_INIT_AUTOMAKE、などなど、GNU Autotool群のインストールディレクトリに指定されているマクロ、およびXORG_MACROS_VERSIONされていることを理解しどこから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 

をX.orgパッケージのインストールディレクトリに指定されています(私は思う)。

私が分かりませんが、どこから$VERSION$PACKAGE_VERSION$LIBSのような変数が得られますか? configure.acは "トップレベル"の入力ファイルのようになっていませんか?

答えて

1

「トップレベル」の入力ファイルと同じであるとは思われませんか?

私は確かにその特性を自分自身になるだろうが、私はそれはあなたの中心問題に負担する方法を見ていないので、あなたと私はそれによって何を意味するか、異なっていなければならない:私はない何

$ VERSION、 $ PACKAGE_VERSIONや$ LIBSのような変数はどこから得られるのでしょうか?

Autoconfコードジェネレータであることを常に忘れないでください。 m4マクロプロセッサーのカスタム構成、組み込みマクロライブラリー、およびそれに提供される追加のマクロを使用して、入力ファイルからシェルスクリプトを作成します。これらのマクロの多くは、結果として得られるconfigureスクリプトが実行されるときにシェル変数を定義するシェルコードを生成します。これらの変数はconfigureに属します。 Autoconf自体のテキストです。 (実際には、この領域に1つまたは2つの問題があります。)

異なる変数は、異なるマクロによって生成されたシェルコードによって設定および/または変更されます。たとえば、AC_INITは、$PACKAGE_VERSIONを定義するコードを出力します。私はそれがまた$VERSIONの責任だと思うが、私はそれが文書化されて見つけることはできません。

一方、一部の変数はconfigureが実行されている環境からの初期値をとります。 $LIBSのいずれかです。環境に設定されていない(通常の)イベントでは、通常のシェル動作から、初期値が実質的に空であることがわかります。この特定の変数は、the AC_CHECK_LIB and AC_SEARCH_LIBS macrosによって生成されたコードによって更新されます。

Autoconfの性質に戻って、多分あなたの混乱は、マクロと関数の違いを理解できないことに起因します。 Autoconf は、マクロを再帰的に展開してシェルスクリプトを生成します。結果のスクリプトのセマンティクスは、結果のコードから続くものです。 Autoconfマクロは、結果のスクリプトに現れるシェル変数のスコープを提供しません。

+0

詳細な回答ありがとうございました!私はあなたが私の混乱を正しく指摘したと信じています。私は関数の観点から考えていました。つまり、変数の値を渡すことができるように、 "configure"がどこから呼び出されるのかを考えていました。今はマクロ拡張であることがわかりました - autoconfはすべてのマクロを他の場所で見つかった定義を使用してconfigure.acを作成し、それらの定義にはいくつかの変数定義もあります。これは "configure"に終わります。上記のconfigure.acで参照されているのは間接的に定義された変数です。 –

+0

configure.acのこれらの変数への参照は、 "configure"でも終了しますが、*これらの変数の定義を含むAC_INITのような前のマクロの展開されたバージョンの後に*終わります。 –

関連する問題