オープンソースソフトウェアでよく見かける configure スクリプトを自作してみる

これまで、configure スクリプトを使うことは何度もあったが、作ったことはなかった。
なんでも使うのと作るのは大違い、というわけで、試しにつくってみた。

環境は以下の通り。

  • CentOS 5.5 (i386)
  • automake-1.9.6-2.3.el5
  • autoconf-2.59-12
  • gcc-4.1.2-48.el5
  • libtool-1.5.22-7.el5_4

まずは、Makefile を作りたいソースコード *.c があるディレクトリで autoscan を実行する。

$ autoscan
autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1

これで configure.scan が生成されている。(autoscan.log もできているが、ここでは無視)

生成されたファイルの中身。

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

AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([test.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_OUTPUT

生成された configure.scan を修正する。

  1. AC_INIT の括弧内にソースコード名を記述
  2. AC_PROG_INSTALL を追記
  3. AC_OUTPUT の後ろに (Makefile) を記入
  4. 修正したファイルを configure.in として保存する

できたファイルはこれ。

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

AC_PREREQ(2.59)
AC_INIT(test.c)
AC_CONFIG_SRCDIR([test.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_PROG_INSTALL
AC_OUTPUT(Makefile)


お次は install-sh をコピー。

$ cp /usr/share/automake-1.9/install-sh .

configure.in と install-sh が準備できたところで autoconf を実行すると configure スクリプトが生成される。
(autom4te.cache も生成されているが、ここでは無視)

$ autoconf

configure スクリプトが生成されたが、まだ実行してもエラーになる。 Makefile.in と config.h.in を作っておく必要がある。

まず Makefile.in。

SHELL = /bin/sh
TARGET = test
SRCS = test.c
OBJS = test.o
CC = @CC@
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) -o $@ $(OBJS)
.c.o:
$(CC) -c -o $@ $

ここで使っている Makefileサフィックスルールやマクロについては、こちらが参考になった。
Make と Makefile の説明

$@ はターゲットファイル名になる。
$< は最初の依存ファイル名。


そして config.h.in。

#undef HAVE_STDIO_H

これで必要なファイルがそろったので、configure スクリプトを実行すると Makefile と config.h が作成されるようになる。
(stdio.h があるからか、この #undef は書かなくても手元の環境では Makefile を生成できた)

これは簡単な例なので、手作業の労力と大して変わらず、configure の有り難みが感じられないけど、Makefile が自動生成されている流れはとりあえずつかめた。


この記事の内容は 日経Linux 2009.2 を参考にして試してみた。

本格的に使っていくなら、.am も勉強した方がよさそうだ。
Autotools - Wikipedia