GNU Autoconfの覚え書き

今まで、「./configure ;make ;make install」したことはあったが、中を見ても複雑で意味不明のconfigureスクリプトを作ったことはなかった。このスクリプトGNU Autoconfで自動作成されるらしい。
Autoconfのドキュメント

autoconfの使用方法- hippos-lab::net(別館)
up to dateな日本語の解説文書。詳細だがわかりやすい。
新しめの Autotools (Autoconf&Automake) を使ってみよう
もう少し短い解説。やや古い。(configure.inを直接編集。現在はconfigure.acから自動作成する)

今回は「libpng」と「libXcursor」及びそのヘッダファイル「png.h」と「X11/Xcursor/Xcursor.h」を必要とするxcur2pngというプログラムのconfigure.acとMakefile.amを書いてみた。
Makefile.am:

bin_PROGRAMS = xcur2png
xcur2png_SOURCES = xcur2png.c
xcur2png_LDADD = @XCUR2PNG_LIBS@
AM_CFLAGS = @XCUR2PNG_CFLAGS@

configure.ac:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)
AC_INIT(xcur2png, 0.4, ********@********)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([xcur2png.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.
PKG_CHECK_MODULES(XCUR2PNG, libpng xcursor)
AC_SUBST(XCUR2PNG_CFLAGS)
AC_SUBST(XCUR2PNG_LIBS)

# Checks for header files.
AC_CHECK_HEADER([png.h],,AC_MSG_ERROR([png.h not found]))
AC_CHECK_HEADER([X11/Xcursor/Xcursor.h],,AC_MSG_ERROR([Xcursor.h not found]))

# Checks for library functions.(注:以下の部分はautoscanが出力したまま。)
AC_FUNC_MALLOC
AC_CHECK_FUNCS([strrchr])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

当初はlibpngとlibXcursorをリンクするのに(つまり-lpng -lXcursorを加えたい)上記のPKG_CHECK_MODULESのかわりに以下のマクロを使っていた。

AC_CHECK_LIB([png],[png_create_write_struct],,AC_MSG_ERROR([libpng not found]))
AC_CHECK_LIB([Xcursor],[XcursorFilenameLoadAllImages],,
                               AC_MSG_ERROR([libXcursor not found]))

AC_CHECK_LIBの第二引数はライブラリから呼び出される関数を書くが、他にも使用している関数があるのに、上記の「png_create_write_struct」だけを使うのは恣意的だし、かといってすべての関数を列挙するのは大変だし、ライブラリだけを指定できないかといくつかのプログラムのconfigure.acを調べてみて、xcursorgenでPKG_CHECK_MODULESを発見した。これはpkg-configというツールに含まれるマクロらしい。
この記事が参考になった。