株式会社 オーム社 様のご厚意により,
書籍 "GNU Autoconf/Automake/Libtool" を
ブックレビューコーナー にご献本いただきました.
この本のレビューをして頂くべく,
Linux Users ML
や本サイトにおいて
公募
を行い,
これにご希望頂いた方々より感想などをレビュー記事にまとめていただきました.
ここに, レビューアの方々から寄せられたレビュー記事を公開します. (原稿到着順)
株式会社 オーム社 様および レビューアの皆様のご厚意に感謝いたします.
なお, 以下のレビューは初版を対象としています.
この本は, http://sources.redhat.com/autobook で英語版の全文が公開されている. 日本語版には記載が無いが, 英語では New Riders publishing から 2000 年に出版された書籍 (ISBN: 1578701902) がある. 英語版は, ``The Goat Book''(山羊本) として知られているらしい. (英語版表紙: http://sources.redhat.com/autobook/cover.jpg) 日本語版の厚さは 23mm で, 総ページ数は 400 ページを超える.
この本は, 単なる GNU Autoconf/Automake/Libtool の How To 本ではない. GNU のソフトウェアがマルチプラットフォームを実現している, そのノウハウの全てにわたっての解説が記述されている.
ソフトウェアを開発するに際して, プラットフォームの実装に対するソースコードの依存性は 昔から解決が困難な課題であったことは言うまでも無い. そのため, Sun Microsystems の Java や Forte (現 Sun) の Forte など, 実装依存性を隠蔽するレイヤーを設けて, ユーザが開発したソースコードのポータビリティを高める製品がある. この, 実装依存性を隠蔽したレイヤー (Java VM など) は, 当然開発者が触れることはできない.
一方で, リチャード・ストールマンが提唱する「自由ソフトウェア」に基づいた GNU も, やはりマルチプラットフォームを実現するが, その根底にある 「ソフトウェアにブラックボックスはあってはならない」 という考え方に基づいて, 実装依存性を全てオープンにする. 一方で, 実装依存性の解決はノウハウの塊であるため, そのノウハウをデータベース化し, ツールとして実現したものがこの本が解説している GNU Autoconf/Automake/Libtool である.
「自由ソフトウェア」と「オープンソース」の違いは, http://www1.neweb.ne.jp/wa/yamdas/column/technique/rmsj.html がわかりやすいと思われる.
別の視点では, 独占的ソフトウェアはバイナリでの配布が前提となるため, 単一のバイナリの配布でマルチプラットフォームを実現するためには, 実装依存を吸収するレイヤーが必要となる. 一方で, 自由ソフトウェアは, ソースコードでの配布が前提となり, 利用者がコンパイルを行う. そのため, コンパイル時に実装依存性を吸収する方法で, マルチプラットフォームを実現することができる. GNU Autoconf/Automake/Libtool は, そのためのノウハウをツール化したものであると言える.
翻訳本なので, 日本語版に関わる気になる点を挙げる.
インターネット版の前書きにある, 「Magic Happens Here」 が日本語版に含まれていない.
31 ページ【監注 4】は, 誤解を招きかねない. Linus の話よりも, GNU コーディング標準が ソースコードを含めたディストリビューションに関わる 全ての文書をカバーするものであって, 日本で使われているソースコードのスタイル規約としての 「コーディング標準」という名称とは意味が違う旨を書くべきではないか.
32 ページ【監注 5】は, 「ドキュメントは, 日本語で書くと配布対象は日本人に限定されてしまう」 ということが書いてあるが, 日本人以外にも日本語を解する人はいる, 配慮に欠けた記述である.
これら以外の監注は, 適切な内容が記載されており, 理解の助けになった. また, 技術解説書なので, わかりやすいかどうかは別にして, 全体を通していかにも翻訳という文書ではなく, 日本語として違和感の無い翻訳になっている.
GNU Autoconf/Automake/Libtool は, ソースコードレベルでプラットフォームの実装依存性を吸収するための ノウハウのデータベースであり, このノウハウは, 世界中の GNU ソフトウェアの開発者によって拡充され, メンテナンスされている.
この本は, GNU Autoconf/Automake/Libtool の存在を知っており, これを使う方法を学びたい人にとって, その目的を果たすことができる.
さらに, Autoconf/Automake/Libtool を使う/使わないに関わらず, 複数の OS をサポートしたソフトウェアを開発しようとしている人にとって, マルチプラットフォームの実装依存性について学ぶことができる大変優れた本である.
本書はソフトウェアのポータビリティー (移植性) を高める事に重点を置いて書かれた本です. Autoconf/Automake/Libtool (以下 GNU Autotools) の入門書ではありません.
私自身が予備知識のない人間だったので, 内容を把握し理解するのにかなり苦労しました. お手軽に GNU Autotools の勉強をしたい方には, 本書はお薦めできません. すでに GNU Autotools を使用している方や, 本気で導入を検討している方にお薦めします. GNU Autotools の便利さについて興味を持っている方 (私はこの部類です) は, もう少し取っつきやすい本を買って, 本書は 2 冊目にどうぞ.
本書は GNU Autotools のチュートリアル以外にも, 既存のパッケージを GNU Autotools に移行する時の指針や, ポータブルな C,C++ の書き方についての解説なども書かれています.
全体的な特徴として, ポータビリティー (移植性) について非常に深く考察されています. 本書は GNU Autotools の理解を深める為の本であると共に, ポータビリティーの高いパッケージを作る為のアプローチを示した本です.
各章はとても短く, 何から何まで手取り足取り解説してはくれません. 実際に GNU Autotools を使っている方や, プログラムのポータビリティーについて悩んだ事がある人でなければ, 理解するのは難しいと思います.
内容の部分でも申し上げましたが, 本書は文書全体を通してポータビリティーについて語られており, 非常に勉強になります. 今まで自分勝手にプログラムを作っていたので, 良い勉強になりました.
makefile.am, makefile.in, configure.in …… などと様々なファイルが存在し, それらの役割や関係が分かりにくい. 巻末の付録に図解があるのですが, 本文では図が全く出てきません. 本書を読むなら付録を逐一見ながら読まなければ辛いです.
2 番の方に薦めるのも変な話ですが, 本書を読めば GNU Autotools をより深く理解する事が出来ると思いますので, お薦めいたします. 3 番の方は, 出来ればプログラムが複雑になる前に, 本書を読む方が良いでしょう.
すでに申しましたが, 本書は入門書ではありません. また 「興味は無かったけど, 読み進めるにつれだんだん興味がわいてくる」 と言うような類の本でもありません. ある程度真剣に GNU Autotools の導入を考えていなければ, 読むのはきついと思います.
私のレベルで本書の価格が適正か判断するのは難しいです. それをふまえた上で申しますと, 私にとって 3800 円は高いです. 入門者には優しくありません.
反面, 中上級者には読みごたえがある内容なので, 3800 円は高くないかもしれません. 私でも理解しやすかった部分 (小規模な GNU Autotools プロジェクトや言語関係) は, ポイントを押さえた解説で, 気持ちよく読む事が出来ました.
本書から最初に受けた印象は「何と難しそうな本だ!」です. 実際かなり苦労しましたが, 内容は GNU Autotools を使う上で役立つ情報ばかりなので, 挫折せずに読み切れば, GNU Autotools について理解を深める事が出来るでしょう.
残念ながら本書を読んで, GNU Autotools を使いこなせるようにはなりませんでした. これを機会に GNU Autotools を導入するつもりですが, 本書とは別に入門者向きの資料を探すつもりです.
私の知る限り, 現在ではほとんどの Linux パッケージが Autotools を利用しています. そしてそういったパッケージは高いポータビリティを持ち合わせ, 多くが他のオペレーティングシステムに移植されています. なぜ Autotools を使うとポータビリティを高められるのか, そもそもポータブルなソフトウェアとは何なのか, 本書を読めばそのような疑問が氷解することでしょう.
本書の前半では大小様々なプロジェクト例が中心となっています. そして後半になると応用やマクロ拡張, ポータビリティに関する話題が中心になります. それぞれの章も順序立てて構成されており, スムーズにステップアップしていくのですんなりと読み進めることができました.
各プロジェクトのソフトウェアはポータビリティを念頭において開発されているので, 当然ソースがポータビリティを欠くことの無いように記述されています. そのようなソースを用いてポータブルなプログラム手法が解説されますから, 実務経験が無かったり, ポータブルなプログラムをあまり書いたことのない 私にとっては大いに勉強になりました. また, プロジェクト例もシェルや動的ローディング, 既存パッケージを Autotools に対応化させるなどといった 真に実用的な内容となっています.
様々な個所で開発手法の指針や問題点の解決法が示されているのですが, 最も重宝するのが第 14 章と第 15 章のポータブルな C と C++ についてです. そこではエンディアンはもちろん, 構造体レイアウトの問題や UNIX 間の関数の差異, そして実装系に左右されがちな C++ の言語機能について 包括的なガイドがいくつも記載されています. また, Autoconf で C++ の実装をテストする方法や Libtool の注意点にも言及されていますから 保守のしやすいソースの書き方を身に付ける上で非常に役立つでしょう.
翻訳の質を見るためにオンラインで公開されている原文を読んでみました. 私は品質を理解できるほど英語が出来るわけではありませんが, 原文に比べて邦訳は平易な文章で構成されており, 誤植や誤訳も見つかりません. こういったプログラミングの英文は少々の専門用語がわかったところで 技術的な文章表現は複雑でしょうから, それをわかりやすい邦訳に 仕上げているのは素晴らしいと思います.
Windows の UNIX エミュレーションレイヤー「Cygwin」の Autotools と UNIX 上の AutoTools との気になる違いも解説されていて, 中でも Libtool について詳細に書かれています. 現在の Cygwin では Libtool が不完全で使い方も難解ですし, 一応共有ライブラリに当たる DLL を生成するのにも非常に面倒な作業を伴いますから, 普段 Cygwin を利用している私にとって大変重宝しました. これまでにクロスプラットフォームな GUI ライブラリの GTK やゲームライブラリの SDL を利用していても DLL などといった問題から汎用部分をライブラリ化することはなかったのですが, この章をより理解したら実際に試してみたいと思います.
ほとんどの掲載スクリプトのファイル名が 文章内でしか示されないことについても多少不満を感じるのですが, ソースやスクリプトに行番号が振られていないのも結構不便なものです. ソース内の関数や仕組みなどについて 文章で説明されていることをより理解するためには ソースを見るのがてっとり早いと思ってソースを見るのですが, 説明個所がソース内のどの部分か示されていないので なかなか見つからないと気が散って進行の弊害になりました.
序章の XVI ページに 「完璧を期したところで, すぐに内容が古くなる」 とはっきり書かれているのですが, 初心者の独習には, 最新のものでなくとも活字 のリファレンスはやはり重宝すると思います. また, 個人的にはオンラインドキュメントで読むのは面倒ですし, 目が疲れます.
個人的な思い入れなどで他のコンパイラを使いたいという人も 結構いるのではないでしょうか. アセンブラや Fortran などにも対応しているとは記述されているのですが, Autotools が gcc 以外のコンパイラを利用したスクリプトを生成できるのか, もし可能ならばどのように設定ファイルやマクロを記述すればいいのか, そういったことも盛り込んで欲しかったですね. Libtool を利用するのに gcc が必須なのは致し方のないことです. しかし, Autoconf や Automake などが他のコンパイラに対しても ポータビリティチェックを行えるならば, Autotools の恩恵に与れる人はより増えると思うのです.
これは一連の Autotools を実行する際の 各ツールのデータフローを示したものなんですが, 抽象的な図で表されているために 実行ステージやデータフローが把握しやすくてよく理解できました. しかし, 本書では基本的に図が用いられておらず, もし全章にわたってこのような図を用いていれば もっと読みやすい本になっていただろうと思うと少々残念です.
当初, Autotools の使い方をほとんど知らない私は Autotools 自体のリファレンスを 期待していたのですが, 良い意味で裏切られたと思います. Autotools の無い環境や UNIX や Windows でもない環境との比較はなされていませんが, ツールの使用方法だけにとどまらず, ポータブルなプログラムを書くためのノウハウが詰め込まれた本書は 開発作業を大幅に改善してくれることに加えて 移植や保守のしやすい設計とは何たるかを教えてくれるでしょう. UNIX 開発者はもちろん, Windows 開発者, そして移植を考えていない開発者にもお勧めします.
オンライン原文, ソース: http://sources.redhat.com/autoboo k/
そういえば, Mac 環境ではどうなっているんでしょうね. まったく言及されていないのが不思議です.
私は, Linux は現在どちらかというと趣味で利用していますので, 積極的な意味でソフト開発を行っている訳ではありません. ただし, Freshmeat や各種書評を参照しながら, 新しいソフトを試しています. 自分なりに RPM パッケージ化をして利用していますので, その過程で, パッケージ化の環境に合わせて修正が発生した場合が Autotool との接点です. いつもお世話になっている Autoconf, Automake, Libtool (Autotools) の, 原理・考え方について素人なりに理解できたらと考えて本書を手にとりました.
Unix と関連するツールおよび歴史から始まり, configure, make, Makefile, Autotools について, 導入的としての小規模なものから大規模なプロジェクトを想定し解説されています. そして, Autotools への移行や, ポータビリティを考慮した C, C++ および shell script の書き方について解説されています. さらに, Windows との移植性についても触れられています. 但し, 各 tools の手取り足取りの詳細な解説があるわけではないので, ある程度の基礎知識が必要だと思います. 本書の特徴は, むしろ各章において Autotools を解説する中に織り込まれた, ポータビリティへの配慮についての筆者らの経験に基づく指針やノウハウにあります. C や C++ はもちろん Autotools を記述するスクリプトさらに Windows との移植性における留意点が含まれています.
本書は, http://sources.redhat.com/autobook で全文 html で公開されている, 「GNU Autoconf, Automake and Libtool」の日本語訳ですが, よく翻訳本にあるような直訳的表現が無く, 適度に意訳がされており, 違和感なく読むことができました. また, 随所に挿入された監注も原文での解説を補い理解の助けとなっています. さらに, 例題と挿入されているスクリプトの中でも重要と思われるコメントには 日本語訳がついているのも注意を引くうえで親切なところです. また, 付録の中で,「付録 C 生成ファイルの依存関係」は Autotools の全体の流れをつかむ助けになりました. さらに全体をまとめた関連図があるともっと理解が容易になったと思います. さらに欲をいえば, 本文中にもこういった図をいれてもらえるとうれしいのですが, これは原書への要望となりますね.
正直言って, 最近のプログラム開発に直接かかわっていない私にとって, 技術の詳細については少々難解な点も多々ありました. Autotools の入門書のつもりで手にとる書籍ではありませんでしたが, Autotools のしくみや, ソフトウェアのポータビリティを確保するための考え方, ノウハウ, 注意点等については要点を押えた解説がされており, ポータビリティとは何であるか理解を深めることができました. Autotools そのものについては, もう少し理解を深めてから読み直してみたいと考えています. システムの再利用や効率的開発をめざすのであれば, マルチプラットフォームを考慮した, ポータビリティの高いソフトをつくることは重要だと思います. マルチプラットフォームに対応した効率的システム開発, Autotools を使ったシステム開発を実施しようとするのであれば, 現場の開発担当者だけでなく, プロジェクトの管理者も含めて目を通しておいても良いのではないでしょうか.
多くの Unix コマンドが魔法使いの呪文のように神秘的なものである中で, とりわけ「どっとすらコンフィギュア負け負けインストール」 (./configure;make;make install) というのは, 私にとって最も大きな「謎」の一つだった. この本は, 読者が開発するアプリケーションにこの魔術の力を与える秘伝の書である. 謎に満ち, それでいて憧れや畏敬の念さえも抱かせるこの configure スクリプトを自分のプログラムに取り込みたいという動機から 私はこの本を開いた.
アプリケーションのポータビリティを高めるとともに, 移植されるプラットフォームでのビルド作業を 効率化・簡単化するためのソフトウェア群, GNU Autotools がどのように連携して機能していくかということを中心に 解説がなされている. 個々のツールのリファレンスは info ファイルなどにゆずり, 全体の流れのチュートリアルに徹している. さらに, プログラムの移植の際に遭遇した諸問題について 筆者が選択したスタイルを体験を交えて紹介するという点を強調している. 「(読者が) 筆者とは反対の結論に達することも十分あり得ます」 などといった表現からもわかるように, ある程度のスキルを持った開発者, 広範なプラットフォームへの移植を意識しなければならないような開発者を 想定している.
冒頭に書いたように configure スクリプトに憧れて, ある意味ミーハ的なのりで読み始めたので, 私は実は途中で挫折しかけた. 難しいのである. m4 を使いこんだこともないし, Makefile ですら細かいところはよくわかっていない. しかし, そんな私にも一応最後まで追うことができたのは, 本書が例題を豊富に挙げていることと, それらのソースや設定ファイルが Web に公開されていた点に負うところが大きい. 実際に自分のマシンでその例題プロジェクトをビルドしてみたり, 設定ファイルを眺めていると, わかったような気になってくる. それは, 本当はわかったという事とは違うのではないか, とも思ったりするが, その例題の見よう見まねで自分のプログラムの configure スクリプトを生成する事もできたし, 今後, 例えば動的モジュールのローディングといった高度な手法を ポーティングも考慮しつつ自分のプログラムで使ってみようというときにも, 本書の内容と例題を読み返せば使いこなせると思う. それはすなわち, わかったということに限りなく近い. 少なくとも私にとってはそれで十分であると考えられた.
「開発者が遅かれ早かれ 1 度は手を染め」る Unix シェルが例題のひとつとして取りあげられている. 最も強調される点はもちろん高いポータビリティを プロジェクトに持たせることである. さらに, ユニークな点は, 8 章, 11 章, 19 章と離れた章において, プロジェクトを拡張していくところである. 最初の 8 章では Autotools を使った必要最小限のプロジェクトを提示し, 残りの 2 章では, それぞれ Libtool, モジュールローディングシステムといった 高度なフレームワークや技法を導入していく. 基本概念の説明は間に挟まれた章になされており, 物語を読むように順次スキルアップしていくという 緻密に計算された構成となっている. シェルの例題の他にも, Libtool やコンビニエンスライブラリ, 動的ローディングやあるいは, ポータブルなシェルを書くといったトピックについて, それを説明するシンプルな例題が用意され, Web からダウンロードすれば読者自身がそれを実行することが可能である. 前述したようにこれらがなければ, 私には到底最後までこの本を読む事はできなかったであろう.
例題については, Web 上の Errata を見ておかないと動作しないものもあった事を補足しておく.
Linux-Users ML だったと思ったが 「高機能のソフトウェアが無料で使えるのだから, 書籍にその分の投資をすることにしている」 といったような趣旨の発言を見たことがある. なるほどなと感心したのだが, この本はまさにその対象だと思う. 筆者の中には Autotools の開発者やメンテナも含まれており, オープンソースプログラムの作者らしく本書の HTML 版 (英語) を Web でも公開している. 英語が苦手でなければそれらから必要な情報は得られるかも知れないが, アンダーラインを引いたり書き込みをしたりして 自分の本に育てていく価値のある本だと感じたので, そのような意気込みがあるのなら買うべきだろう. いくばくかの資金が筆者や訳者にも寄付されるということで, オープンソースコミュニティへの感謝の意を表すこともできる.