mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

GNU C/C++ - autoconf, automake で make!

[ プログラミング ] [ C言語 ]

こんばんは。

GNU C/C++ で autoconf, automake を使って make する方法についての記録です。

個人で簡単な GNU C/C++ ソースをコンパイルするなら、gcc, g++ コマンドを使用すればいいのですが、ソースが大掛かりになるとファイルも増えて、コンパイルが面倒になってきます。

また、そんなファイル類を自分以外に提供した際にコンパイル作業で手間や迷惑をかけてしまいます。

そこで、よくある ./configure, make, make install で make できるようにします。 細かなところは、ここでは詳しく説明できないので、各自で調べてください。 ある意味、呪文のような使い方です。

記録

0. 前提条件

  • Linux Mint 13 Maya (64bit) での作業を想定。
  • g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
  • m4 (GNU M4) 1.4.16
  • autoconf (GNU Autoconf) 2.68
  • automake (GNU automake) 1.11.3

不足のものがあれがインストールしておく。

また、当然ながら make に使用するソースを準備しておく。 今回は、以下のようにプログラムディレクトリ配下に “src” ディレクトリを作成し、その配下に各種ソースを配置した。

1
2
3
4
5
6
7
foo
    +-- src
        +-- common.cpp
        +-- common.h
        +-- foo.cpp
        +-- foo.h
        +-- main.cpp

1. Makefile.am 作成

プログラムディレクトリへ移動する。

1
$ cd ~/foo/

“Makefile.in” の雛形となる “Makefile.am” を作成する。

1
2
$ vi Makefile.am
SUBDIRS = src

そして、今回はサブディレクトリを使用するので、"src/Makefile.am" も作成する。

1
2
3
$ vi src/Makefile.am
bin_PROGRAMS = foo
foo_SOURCES = foo.cpp foo.h common.cpp common.h main.cpp

サブディレクトリを使用しないのなら、"src/Makefile.am" がそのまま “Makefile.am” になる。

2. autoscan 実行

“configure.ac” の雛形となる “configure.scan” を作成する。

1
$ autoscan

(この時、"autoscan.log" もできる)

さらに、"configure.scan" を “configure.ac” にリネームする。

1
$ mv configure.scan configure.ac

3. configure.ac 編集

autoconf で “configure” スクリプトに変換されるファイル “configure.ac” を以下のように編集する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#                                               -*- 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_INIT(foo, 1.0, foo@bar.com)            # <- 変更
AM_INIT_AUTOMAKE([foreign])               # <- 追加
AC_CONFIG_SRCDIR([src/common.h])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL

# Checks for library functions.
AC_CHECK_FUNCS([floor])

AC_CONFIG_FILES([Makefile
                 src/Makefile])
AC_OUTPUT
  • AC_INIT : 初期化用マクロ。 パッケージ名、バージョン番号、バグ連作先メールアドレスを指定。
  • AM_INIT_AUTOMAKE : automake 用初期化マクロ。 AC_INIT の直後に呼ぶ。 GNU projectとして作るわけではないので、foreignという引数を与える。

4. autoheader 実行

autoheader で “config.h” の雛形となる “configu.h.in” を作成する。

1
$ autoheader

(この時、"autom4te.cache" ディレクトリもできる)

5. aclocal 実行

aclocal で “aclocal.m4” を作成する。

1
$ aclocal

6. automake 実行

automake で “Makefile.in” を作成する。

1
2
3
4
$ automake --add-missing --copy
configure.ac:7: installing `./install-sh'
configure.ac:7: installing `./missing'
src/Makefile.am: installing `./depcomp'

(この時、"depcomp", “install-sh”, “missing” もできる) オプションについて、

  • --add-missing … 見つからないものをパッケージに追加する
  • --copy--add-missing オプション使用時、シンボリックリンクを貼らずにファイルをコピーする

7. autoconf 実行

autoconf で “configure” を作成する。

1
$ autoconf

8. configure 実行

ここで、 congigure が使用できるようになる。

1
$ ./configure

9. make 実行

続いて、make する。

1
$ make

これで、目的のバイナリファイルが作成される。(今回の場合は “src” ディレクトリ配下に “foo”) 使用できるか確認もしてみる。

10. make install 実行

マシンにインストールして使用するのなら、以下を実行する。

1
$ sudo make install

この場合、"/usr/local/bin" ディレクトリ配下に “foo” が置かれる。

11. アーカイブファイル作成

配布用アーカイブファイルを作成するなら、以下を実行する。

1
$ make dist

アーカイブファイル “foo-1.0.tar.gz” ができる。

12. 最終的にできたもの

参考までに、ここまでの作業でプログラムディレクトリ配下は以下のようになった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
foo
├── Makefile
├── Makefile.am
├── Makefile.in
├── aclocal.m4
├── autom4te.cache
│   ├── output.0
│   ├── output.1
│   ├── output.2
│   ├── requests
│   ├── traces.0
│   ├── traces.1
│   └── traces.2
├── autoscan.log
├── config.h
├── config.h.in
├── config.h.in~
├── config.log
├── config.status
├── configure
├── configure.ac
├── depcomp
├── foo-1.0.tar.gz
├── install-sh
├── missing
├── src
│   ├── Makefile
│   ├── Makefile.am
│   ├── Makefile.in
│   ├── common.cpp
│   ├── common.h
│   ├── common.o
│   ├── foo
│   ├── foo.cpp
│   ├── foo.h
│   ├── foo.o
│   ├── main.cpp
│   └── main.o
└── stamp-h1

2 directories, 36 files

13. 利用する側の作業

上記で作成されたアーカイブファイルを受け取った人の作業は以下の通り。(よくある方法)

1
2
3
4
$ tar zxvf foo-1.0.tar.gz
$ cd foo-1.0
$ ./configure
$ make

で src ディレクトリ内に foo ができる。 インストールするなら、以下のようにする。

1
$ sudo make install

“/usr/local/bin” ディレクトリに foo がインストールされる。


当方、C/C++ についてはそれほど知識があるわけでもありませんが、たまたま配布したいソースがあったので記録として残しておきました。

以上。

Comments