読者です 読者をやめる 読者になる 読者になる

たまにゃんのメモ帳

情報系関連のメモ書きを主に載せていきます。あわよくば他の人の参考になれば...

Autotools ( automake, autoconf, libtool ) 使い方まとめ

Autotoolsの使い方をまとめてみた

Autotoolsとは、主にUNIX系OSにおいてソフトウェアパッケージ開発を行うための、ツール及びフレ ームワークの一種である。このツールを使用することにより、多種多様なUNIX互換環境にパッケージを対応させることが容易になる。 Autotoolsは主に autoconf/automake/libtools の3つから成り立っている。

静的ライブラリをリンクして扱う単純なプログラムのプロジェクトを作る。 libtoolは今回使っていない。

1. 事前準備

いくつか自分でファイルを作成する必要がある。

project
├── Makefile.am
└── src
       ├── Makefile.am
       ├── main.c
       └── lib
              ├── Makefile.am
              ├── lib_test.h
              └── lib_test.c

ソースコード

  • src/main.c
#include <stdio.h>
#include "lib/lib_test.h"

int main(int argc, char **argv){
  lib_print("autotools test\n");
  return 0;
}
  • src/lib/lib_test.c
#include <stdio.h>
#include "lib_test.h"

void lib_print(const char* str) {
   printf(str);
}
  • src/lib/lib_test.h
#ifndef LIB_TEST_H
#  define LIB_TEST_H

void lib_print(const char*);

#endif /* ifndef LIB_TEST_H */

Makefile.am

SUBDIRS = src #サブソースディレクトリ
DIST_SUBDIRS = $(SUBDIRS)
SUBDIRS = lib #サブソースディレクトリ

bin_PROGRAMS = program #実行ファイル名

# 静的ライブラリのリンク
program_LDFLAGS = -L./lib 
program_LDADD = -llib_test

program_CFLAGS =  -I ./lib 

program_DEPENDENCIES = ./lib/liblib_test.a

program_SOURCES = main.c
noinst_LIBRARIES = liblib_test.a
liblib_test_a_CFLAGS = \
                      -I../    \
                      -I../lib \
                      $(CFLAGS)

liblib_test_a_SOURCES = \
                       lib_test.c lib_test.h

2. configure作成

autoscanコマンドでconfigure.acを作成する。ついでにREADMEなども作成しておく。

$ cd project
$ touch NEWS README AUTHORS ChangeLog
$ autoscan

するとconfigure.scanファイルが作成されるのでconfigure.acにリネームして編集する

 $ mv configure.scan configure.ac
  • 編集前 configure.scan
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([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.ac
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([project], [1.0.0], [test@domain])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE

# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
AM_PROG_CC_C_O
AC_PROG_RANLIB

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT(Makefile \
          src/lib/Makefile \
          src/Makefile)

autoreconfでconfigureを作成する。

$ autoreconf -i
configure.ac:11: installing `./compile'
configure.ac:6: installing `./install-sh'
configure.ac:6: installing `./missing'
src/Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING' using GNU General Public License v3 file
Makefile.am:     Consider adding the COPYING file to the version control system
Makefile.am:     for your code, to avoid questions about which license your project uses.

configureでmakefileファイルを作成しmakeでビルドする

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
...
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/lib/Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands
$make

3. 実行

最後は実行して動作確認する

$ cd src
$ ./program
autotools test

まだまだ使い慣れていないところはあるがlinuxでC,C++のプログラムを書く上で非常に重要だ。

参考URL