autotoolsライブラリ構成サンプル

autotoolsライブラリ構成

libtoolを利用してライブラリを作成するautotoolsの構築例を記述します。


対象プロジェクト

対象プロジェクトは以下の構成となっています。

「misc.c」は「libmisc.la」ライブラリとして作成します。

「main.c」からライブラリの関数を呼び出します。


$ tree
.
├── bin
│   └── main.c
├── include
│   └── misc.h
└── lib
     └── misc.c

サンプルソースコードの内容

include/misc.hの記述は以下の通りです。


$ cat include/misc.h 
#ifndef _MISC_H_
#define _MISC_H_
int library_test_call( char *msg );
#endif /* _MISC_H_ */

bin/main.cの記述は以下の通りです。


$ cat bin/main.c 
#include "misc.h"

int
main( int argc, char *argv[] )
{
    library_test_call( "from bin-dir" );
    return( 0 );
}

lib/misc.cの記述は以下の通りです。


$ cat lib/misc.c 
#include <stdio.h>

int
library_test_call( char *msg )
{
    fprintf( stdout, "%s:%s(%d)\n", __FILE__, __FUNCTION__, __LINE__ );
    fprintf( stdout, "%s\n", msg );
    return( 0 );
}


構築手順

1. Makefile.amとam.conf(automake用の設定ファイル)の作成


$ tree
.
├── Makefile.am
├── am.conf
├── bin
│   ├── Makefile.am
│   └── main.c
├── include
│   ├── Makefile.am
│   └── misc.h
└── lib
     ├── Makefile.am
     └── misc.c

ヘッダーファイルやライブラリのパスを管理する「am.conf」を作成しておき、各Makefile.amでパスの参照ができるようにします。


$ cat am.conf 
# automake configure
#
# header file include
INCLUDES=-I$(top_srcdir)/include
INCLUDES_PATH=$(top_srcdir)/include

# library file
LIB_PATH=$(top_srcdir)/lib
LIBMISC=$(LIB_PATH)/libmisc.la

トップディレクトリの「./Makefile.am」は以下の通りです。

「ACLOCAL_AMFLAGS = -I m4」は記述しなくてもよいが、libtoolizeコマンドで警告されるため予め記述しています。


$ cat Makefile.am 
include $(top_srcdir)/am.conf
ACLOCAL_AMFLAGS = -I m4 
SUBDIRS = include lib bin

include/Makefile.amは以下の通りです。


$ cat include/Makefile.am 
include $(top_srcdir)/am.conf
noinst_HEADERS = misc.h

lib/Makefile.amは以下の通りです。


$ cat lib/Makefile.am 
include $(top_srcdir)/am.conf
noinst_LTLIBRARIES = libmisc.la
libmisc_la_SOURCES = misc.c

bin/Makefile.amは以下の通りです。


$ cat bin/Makefile.am
include $(top_srcdir)/am.conf
bin_PROGRAMS = sample
sample_SOURCES = main.c
sample_LDADD   = $(LIBMISC)

2. configure.acの作成

autoscanコマンドでconfigure.acのテンプレートを作成します。


$ autoscan
$ mv configure.scan configure.ac

configure.acを編集します。実施事項は下記の4つです。

  • AC_INITにパッケージ名とバージョンと連絡先メールアドレスを記述します。
  • AM_INIT_AUTOMAKEマクロ(内容はパッケージ名とバージョン)を記述します。
  • libtoolを利用するために、「AM_PROG_LIBTOOL」を定義します。
  • libtoolizeコマンドが警告するため、「AC_CONFIG_MACRO_DIR([m4])」を定義します。

ファイル内容は以下のようになります。


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

AC_PREREQ([2.68])
AC_INIT([sample], [1.0], [mail@mail])
AM_INIT_AUTOMAKE([sample], [1.0])
AC_CONFIG_SRCDIR([bin/main.c])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])

# Checks for programs.
AC_PROG_CC
AM_PROG_LIBTOOL

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile
                 include/Makefile
                 lib/Makefile
                 bin/Makefile])
AC_OUTPUT

3. autotoolsスクリプトを作成します。

autotools関連コマンドをシェルスクリプトとしてまとめて記述します。


$ touch autotools.sh
$ chmod 755 autotools.sh

内容は下記の通りです。libtoolとして「glibtoolize」コマンドを使用しています。


$ cat autotools.sh
#!/bin/sh
touch INSTALL NEWS README COPYING AUTHORS ChangeLog
autoheader
glibtoolize --force
aclocal
automake --add-missing --copy
autoconf

4. コンパイル実行

ソースコードをコンパイルしてバイナリを作成します。


$ tree
.
├── Makefile.am
├── am.conf
├── autotools.sh
├── bin
│   ├── Makefile.am
│   └── main.c
├── configure.ac
├── include
│   ├── Makefile.am
│   └── misc.h
└── lib
    ├── Makefile.am
    └── misc.c
$ ./autotools.sh
$ ./configure
$ make

以上でライブラリと実行ファイルが生成されます。


$ ls lib
Makefile     Makefile.in  misc.c       misc.o
Makefile.am  libmisc.la   misc.lo
$ bin/sample 
misc.c:library_test_call(6)
from bin-dir

関連ページ