autoconfとautomakeの使い方


プログラムをつくる際に使った、「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ファイルをつくってくれる。すごいね)

これだけのことをしてしまえば、 以下の変更があっても 必要なことを自動的にして、バイナリがコンパイルされる。


configure.inを編集。

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)

Makefile.amを追加、編集

X11を使うために、コンパイル時にフラグを追加しなければならなかったので、 下のように追加した。本当は、もっとちゃんとしたやり方があるのかも知れない。
noinst_PROGRAMS = hierarchical

hierarchical_SOURCES = display.c Mycolor.c
hierarchical_LDFLAGS = -L/usr/X11R6/lib -I/usr/X11R6/include -lX11
		      

acconfig.hを追加、編集

必要なのかどうか知らなかったが、とりあえず作ってみた。
#undef PACKAGE
#undef VERSION
		     

ちょっとしたコツ

サブディレクトリに分ける

これって、結構有効な手段だったりする。

各サブディレクトリに、Makefile.amは必ずいる。 例えば、次のようなディレクトリ構造になる場合。 ポイントは、トップディレクトリのMakefile.amにある。

/project
┃  Makefile.am ←1番のポイント
┣ /src
┃    Makefile.amhello.c
┗ /src2
      Makefile.am
      world.c

本来の目的どおりに使う

1.関数があるかどうかをチェックする。

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
      
のようにすれば良い。

2.ヘッダファイルがあるかどうかチェックする

同様に、ヘッダファイルの存在もチェックする。

 AC_CHECK_HEADERS(sys/time.h unistd.h)
もし存在するのなら、「TIME_WITH_SYS_TIME」や、「HAVE_UNISTD_H」などが、 1に定義される。 詳しくは「./configure」をしたあとの「config.h」を見れば分かる。

れらを利用するのであれば、config.hを#includeする必要があるの は言うまでもない(僕はこれを忘れていたりした)。

レベルアップには、ダウンロードしてきたアプリケーションの利用例を 見てみるのがよいのじゃなかろうか。

3. コマンドがあるかチェックする

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);
といった風に書く。

4. configureにオプションをつける

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 を使わないときの話。


bison/flex

ここでは書きません。こちらを参照のこと。 bison/flex

static libraryを使う

ここでは書きません。こちらを参照のこと。 library
参考ページ一覧