プログラムをつくる際に使った、「automake」「autoconf」の備忘録です。 とりあえず何をしたかをメモ。
ところで、automakeって、ローマ字で読むと「会うと負け」ってよめるよね。 どうでもいいんだけど。
% mkdir hierarchical % cd hierarchical # 必要(らしい)ファイルをコピー % cp /usr/share/automake/install-sh . % cp /usr/share/automake/mkinstalldir . % cp /usr/share/automake/missing . # 必要らしいファイルをとりあえず作る。 % touch INSTALL NEWS README COPYING AUTHORS ChangeLog # とりあえずプログラムを編集 % mule display.c # configure.scanを生成する。 % autoscan % mv configure.scan configure.in # configure.inを編集 % mule configure.in # Makefile.amを追加、編集 % mule Makefile.am # acconfig.hを追加、編集 % mule acconfig.h % aclocal % autoconf % autoheader % automake # ここで、configureが生成されている。 % ./configure % make % make dist (tar.gzファイルをつくってくれる。すごいね)
これだけのことをしてしまえば、 以下の変更があっても 必要なことを自動的にして、バイナリがコンパイルされる。
dnl Process this file with autoconf to produce a configure script. AC_INIT(display.c) AM_INIT_AUTOMAKE(hierarchical, 0.1.0) dnl Checks for programs. AC_PROG_CC dnl Checks for libraries. dnl Checks for header files. AC_PATH_X AC_HEADER_STDC dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for library functions. AC_OUTPUT(Makefile)
noinst_PROGRAMS = hierarchical hierarchical_SOURCES = display.c Mycolor.c hierarchical_LDFLAGS = -L/usr/X11R6/lib -I/usr/X11R6/include -lX11
#undef PACKAGE #undef VERSION
これって、結構有効な手段だったりする。
各サブディレクトリに、Makefile.amは必ずいる。 例えば、次のようなディレクトリ構造になる場合。 ポイントは、トップディレクトリのMakefile.amにある。
/project ┃ Makefile.am ←1番のポイント ┣ /src ┃ Makefile.am ┃ hello.c ┗ /src2 Makefile.am world.c
AC_CHECK_FUNCS(select)
この関数があるのなら、「HAVE_SELECT」が1に定義される。 なので、関数内で、
#ifdef HAVE_SELECT Timeout.tv_usec = 300000; /* ミリ秒 */ Timeout.tv_sec = 0; /* 秒 */ select(0, NULL, NULL, NULL, &Timeout); #endif
同様に、ヘッダファイルの存在もチェックする。
AC_CHECK_HEADERS(sys/time.h unistd.h)
れらを利用するのであれば、config.hを#includeする必要があるの は言うまでもない(僕はこれを忘れていたりした)。
レベルアップには、ダウンロードしてきたアプリケーションの利用例を 見てみるのがよいのじゃなかろうか。
perlなど、外部コマンドをMakefileで使いたい場合は、
configure.in
AC_PATH_PROG(PERL_PATH, perl, :, /usr/local/bin:/usr/bin:/bin) AC_SUBSET(PERL_PATH)
Makefile.am
${PERL_PATH}
マクロで定数を定義してやって、プログラム内で呼び出す、なんて言うときに は、
configure.in
AC_PATH_PROG(PERL_PATH, perl, :, /usr/local/bin:/usr/bin:/bin) AC_DEFINE_UNQUOTED(GNUPLOT_PATH, "$GNUPLOT_PATH")
acconfig.h
#undef GNUPLOT_PATH
any.c
printf("%s", GNUPLOT_PATH);
acconfig.h
#undef DEBUG
configure.in
AC_ARG_ENABLE(debug, [ --enable-debug trun on debugging [default no]]) if test "$enable_debug" = "yes"; then AC_DEFINE(DEBUG) dnl CFLAGS="-DDEBUG $CFLAGS" fi
見たいに書けば良い。ちなみに、dnlでコメントアウトしてある方は、acconfig.h を使わないときの話。