GNU autotoolsは簡単なんですが、使い始めるまではかなり難儀した記憶があります。例えば、下記のようにlibtest_new.soという名前の「動的ライブラリ」を作成するプロジェクトを作ったとします。
. |-- Makefile.am |-- configure.ac `-- test |-- Makefile.am |-- common | |-- Makefile.am | `-- utils.c `-- test.c ---- configure.ac ---- AC_PREREQ(2.61) AC_INIT([automake_test], [0.1]) AC_ARG_PROGRAM() AC_CONFIG_SRCDIR([test/test.c]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_AUX_DIR([conf]) ★ここで指定したディレクトリに注目★ AM_INIT_AUTOMAKE([foreign]) LT_INIT() ★これも注目★ AC_CONFIG_FILES([Makefile test/Makefile test/common/Makefile]) AC_OUTPUT() ---- test/Makefile.am ---- SUBDIRS = common test_newdir = $(libdir) test_new_LTLIBRARIES = libtest_new.la libtest_new_la_SOURCES = test.c libtest_new_la_LIBADD = common/libcommon.la ---- test/common/Makefile.am ---- noinst_LTLIBRARIES = libcommon.la libcommon_la_SOURCES = utils.c
基本的にGNU autotoolsを使う時はautoreconfというコマンドを実行すれば、勝手に全ての関連ファイルが更新されます。
ただ残念なことに、初回だけはそうもいきません。
$ autoreconf configure.ac:16: error: required file 'conf/compile' not found configure.ac:16: 'automake --add-missing' can install 'compile' configure.ac:16: error: required file 'conf/config.guess' not found configure.ac:16: 'automake --add-missing' can install 'config.guess' configure.ac:16: error: required file 'conf/config.sub' not found configure.ac:16: 'automake --add-missing' can install 'config.sub' configure.ac:15: error: required file 'conf/install-sh' not found configure.ac:15: 'automake --add-missing' can install 'install-sh' configure.ac:16: error: required file 'conf/ltmain.sh' not found configure.ac:15: error: required file 'conf/missing' not found configure.ac:15: 'automake --add-missing' can install 'missing' test/Makefile.am: error: required file 'conf/depcomp' not found test/Makefile.am: 'automake --add-missing' can install 'depcomp' autoreconf2.50: automake failed with exit status: 1
このようにたくさん怒られます。何を怒っているのかというと、AC_CONFIG_AUX_DIR([conf]) で指定したディレクトリ(詳細は automakeのマニュアル参照)に、補助ツールが入ってないじゃないか!と怒っているのです。
エラーメッセージの最後に「'automake --add-missing' can install 'depcomp'」とあるように、優しいautotoolsさんは解決策も用意してくれています。これもやってみましょう。
$ automake --add-missing configure.ac:16: installing 'conf/compile' configure.ac:16: installing 'conf/config.guess' configure.ac:16: installing 'conf/config.sub' configure.ac:15: installing 'conf/install-sh' configure.ac:16: error: required file 'conf/ltmain.sh' not found configure.ac:15: installing 'conf/missing' test/Makefile.am: installing 'conf/depcomp'
まだ何か怒っています。ltmain.shが無いそうです。これはlibtoolというツールの一部です。
最初に述べたようにこのプロジェクトは「動的ライブラリ」を作るプロジェクトです。GNU autotoolsは動的ライブラリをビルドする際にlibtoolという別のツールを使っています。プロジェクトのconfigure.acにLT_INIT() と書いていましたよね。この行はlibtoolを使うことをautotoolsに伝えるため(詳細は libtoolのマニュアル参照)にあります。
逆に言えば、LT_INIT() が無いと動的ライブラリはビルドできません。そんなの知るかって?正直言って私もそう思いました、けど、今のところそういう作りなので我慢するしかありません…。
さてltmain.shが何者かもわかったところで、肝心のどこから持って来るか?ですが、こんなときってfindが便利ですよね?
$ find /usr -name ltmain.sh /usr/share/libtool/config/ltmain.sh $ cp /usr/share/libtool/config/ltmain.sh conf/ltmain.sh $ automake --add-missing $ tree . |-- Makefile.am |-- Makefile.in |-- aclocal.m4 |-- conf | |-- compile -> /usr/share/automake-1.14/compile | |-- config.guess -> /usr/share/automake-1.14/config.guess | |-- config.sub -> /usr/share/automake-1.14/config.sub | |-- depcomp -> /usr/share/automake-1.14/depcomp | |-- install-sh -> /usr/share/automake-1.14/install-sh | |-- ltmain.sh | `-- missing -> /usr/share/automake-1.14/missing |-- config.h.in |-- configure |-- configure.ac `-- test |-- Makefile.am |-- Makefile.in |-- common | |-- Makefile.am | |-- Makefile.in | `-- utils.c `-- test.c
以上のようにltmain.shを無理やり持って来たら、エラーも警告も出なくなりました。めでたしめでたし、です。
もし他の環境に持っていく場合、conf/missingなどのシンボリックリンクはリンク先に何もない可能性がある(※)ので、実体に置き換えておくと良いでしょう。
(※)autotoolsをインストールしていない環境もあれば、インストールされていたとしても違うディレクトリに置かれている可能性があります。
既にautotoolsをお使いの方はもちろんのこと、autoreconfという見慣れぬコマンドに対して、すぐにヘルプを見た方はお気づきかと思いますが、今までの手順を一撃でやってくれるコマンドがあります。
その名もautoreconf --installです。早速やってみましょう。
$ tree . |-- Makefile.am |-- configure.ac `-- test |-- Makefile.am |-- common | |-- Makefile.am | `-- utils.c `-- test.c $ autoreconf --install libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `conf'. libtoolize: copying file `conf/ltmain.sh' libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree. libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. configure.ac:16: installing 'conf/compile' configure.ac:16: installing 'conf/config.guess' configure.ac:16: installing 'conf/config.sub' configure.ac:15: installing 'conf/install-sh' configure.ac:15: installing 'conf/missing' test/Makefile.am: installing 'conf/depcomp' $ tree . |-- Makefile.am |-- Makefile.in |-- aclocal.m4 |-- conf | |-- compile | |-- config.guess | |-- config.sub | |-- depcomp | |-- install-sh | |-- ltmain.sh | `-- missing |-- config.h.in |-- configure |-- configure.ac `-- test |-- Makefile.am |-- Makefile.in |-- common | |-- Makefile.am | |-- Makefile.in | `-- utils.c `-- test.c
シンボリックリンクを実体に置き換えるところまで勝手にやってくれます。いやー、もう全部これだけで良いんじゃない?というくらい、素晴らしいです。
GNU autotoolsを使う時は、常にautoreconf --install頼りでもそこそこ動くはずですが、いざautoreconfがエラーで止まった時は手も足も出なくなってしまいます。
私個人の悲しい経験から言って、この手の便利ツールって、中で何をやっているのかサッパリわからないので、トラブルが起きると非常に苦労します。
ツールのコードを読めとは言いません(私も読んだことありません)が、せめてこのくらいは調べた方が良いです。トラブルシュートの早さが断然違います。
これらを調べるには、マニュアルを当てずっぽうに読むより、スクラッチからプロジェクトを作ってみるのが一番効きます。既存プロジェクトのコピペでは得られなかった、新たな発見があると思いますよ。
< | 2015 | > | ||||
<< | < | 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 | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)