DGLlibを修正するたびに色々なオプションをつけてビルドするのがいい加減面倒になってきたので、Makefileを導入しようと思いたった。どうせならautotoolsを使おうと決めた。
色々調べてみたら、実は手でMakefileを書いた方が楽なんじゃないかと思うくらい複雑だ。ドキュメントだけでは全く意味がわからない。とりあえず、すぐにできそうなディレクトリをそれっぽく整えることから始めることにした。できあがったディレクトリ構成は次のような感じ。
libdgl+AUTHOR
+COPYING
+ChangeLog
+INSTALL
+NEWS
+README
+include-GL+dgl.hpp
| +dglbasicshape.hpp
| +dglcommon.hpp
| +dglutil.hpp
| +dglwindow.hpp
+src+dglbasicshape.cpp
+dglutil.cpp
+dglwindow
AUTHORとかINSTALLとかはとりあえずかっこつけるために作った空ファイル。
すぐできるところが終わってしまったので、autotoolsの作業に入る。最初は"Makefile.am"というやつを作っていかなければならないようだ。作成後のディレクトリツリーはこんな感じ。
libdgl+AUTHOR
+COPYING
+ChangeLog
+INSTALL
+Makefile.am
+NEWS
+README
+include+GL---------------+Makefile.am
| +Makefile.am +dgl.hpp
| +dglbasicshape.hpp
| +dglcommon.hpp
| +dglutil.hpp
| +dglwindow.hpp
+src+Makefile.am
+dglbasicshape.cpp
+dglutil.cpp
+dglwindow
各Makefike.amの中身は次のようにすればいいらしい。
===== Makefile.am =====
SUBDIRS = include src
===== include/Makefile.am =====
SUBDIR = GL
===== include/GL/Makefile.am =====
EXTRA_DIST = dgl.hpp dglbasicshape.hpp dglcommon.hpp dglutil.hpp dglwindow.hpp
===== src/Makefile.am =====
lib_LTLIBRARIES = libdgl.la
libdgl_la_SOURCES = dglutil.cpp dglbasicshape.cpp dglwindow.cpp dgl.hpp dglcommon.hpp dglutil.hpp dglbasicshape.hpp dglwindow.hpp
INCLUDES = -I../include
ここまで準備ができたら、まずはプロジェクトのルートディレクトリで"autoscan"というのを実行してひな形を作成する。
$ autoscan
すると、"configure.scan"というファイルが作成される。これを編集してconfigure.acとして保存する。
- # -*- Autoconf -*-
- # Process this file with autoconf to produce a configure script.
- AC_PREREQ(2.61)
- #AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
- AC_INIT(libdgl, 0.1, [[email protected]])
- AM_INIT_AUTOMAKE([foreign])
- AC_CONFIG_SRCDIR([include/GL/dgl.hpp])
- AC_CONFIG_HEADER([config.h])
- # Checks for programs.
- AC_PROG_CXX
- AC_PROG_LIBTOOL
- # Checks for libraries.
- # Checks for header files.
- # Checks for typedefs, structures, and compiler characteristics.
- AC_C_CONST
- # Checks for library functions.
- AC_CONFIG_FILES([Makefile
- include/GL/Makefile
- include/Makefile
- src/Makefile])
- AC_OUTPUT
5行目を6行目のように編集し、7, 12行目を追加する。ライブラリ作成には12行目を追加してlibtoolを使うようにするといいようだ。
次に"./configure"実行時に必要なヘッダーファイルを自動生成してくれる"autoheader"を実行するらしい。
$ autoheader
これで"config.h.in"というファイルが作成される。どうもaclocal.m4というファイルが必要らしく、これも"aclocal"を実行すると作成されるらしい。。
$ aclocal
いよいよautomakeを実行する。インストール時に必要なスクリプトも作成するように"--add-missing --copy"オプションを使用する。
$ automake --add-missing --copy
なにやら色々メッセージが表示される。スクリプトをインストールしたよということみたいだ。さらにどうも"ltmain.sh"がないと行っている。ゴニョゴニョと調べてみると、"autoconf "を実行するときに"-i"オプションをつけていると自動作成されるようだ。
$ autoconf -i
"configure"ファイルはできているが"ltmain.sh"はない。よくみるとautoreconf -iらしい。
#autoreconf -i
これでビルドできるはず。あとは"./configure→make→make install"でいけるはずだ。早速実行してみる。
やっとできた。"./configure --prefix=installdir"(installdirは書き込み権限があるところ)としないと"/usr/local/lib"にインストールしようとして、Permission denyで失敗するってそりゃそうだ。
今回の一式はこちらから→ Libdgl.tar.gzをダウンロード
参考サイト
- Kiyoshiy - 即席GNU (automake & autoconf)
- Object-Oriented & Java maneuver 別室 - Automakeでmakeする
- Emacs電子書籍 - automake
コメント