GNU C/C++ - autoconf, automake で make!
Updated:
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” ディレクトリを作成し、その配下に各種ソースを配置した。
foo
+-- src
+-- common.cpp
+-- common.h
+-- foo.cpp
+-- foo.h
+-- main.cpp
1. Makefile.am 作成
プログラムディレクトリへ移動する。
$ cd ~/foo/
“Makefile.in” の雛形となる “Makefile.am” を作成する。
$ vi Makefile.am
SUBDIRS = src
そして、今回はサブディレクトリを使用するので、”src/Makefile.am” も作成する。
$ 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” を作成する。
$ autoscan
(この時、”autoscan.log” もできる)
さらに、”configure.scan” を “configure.ac” にリネームする。
$ mv configure.scan configure.ac
3. configure.ac 編集
autoconf
で “configure” スクリプトに変換されるファイル “configure.ac” を以下のように編集する。
# -*- 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” を作成する。
$ autoheader
(この時、”autom4te.cache” ディレクトリもできる)
5. aclocal 実行
aclocal
で “aclocal.m4” を作成する。
$ aclocal
6. automake 実行
automake
で “Makefile.in” を作成する。
$ 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” を作成する。
$ autoconf
8. configure 実行
ここで、 congigure
が使用できるようになる。
$ ./configure
9. make 実行
続いて、make
する。
$ make
これで、目的のバイナリファイルが作成される。(今回の場合は “src” ディレクトリ配下に “foo”) 使用できるか確認もしてみる。
10. make install 実行
マシンにインストールして使用するのなら、以下を実行する。
$ sudo make install
この場合、”/usr/local/bin” ディレクトリ配下に “foo” が置かれる。
11. アーカイブファイル作成
配布用アーカイブファイルを作成するなら、以下を実行する。
$ make dist
アーカイブファイル “foo-1.0.tar.gz” ができる。
12. 最終的にできたもの
参考までに、ここまでの作業でプログラムディレクトリ配下は以下のようになった。
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. 利用する側の作業
上記で作成されたアーカイブファイルを受け取った人の作業は以下の通り。(よくある方法)
$ tar zxvf foo-1.0.tar.gz
$ cd foo-1.0
$ ./configure
$ make
で src ディレクトリ内に foo ができる。 インストールするなら、以下のようにする。
$ sudo make install
“/usr/local/bin” ディレクトリに foo がインストールされる。
当方、C/C++ についてはそれほど知識があるわけでもありませんが、たまたま配布したいソースがあったので記録として残しておきました。
以上。
Comments