配布パッケージの中身と、configureの役目を知る仕事で使える魔法のLAMP(11)

前回入手したソースコードのファイルを調べ、ビルド前に必要な作業について解説します(編集部)

» 2011年06月24日 00時00分 公開
[山口晴広株式会社イメージズ・アンド・ワーズ]

配布パッケージを展開してみる

 前回からGNU Helloを例に、実際にビルドの手順を追いながら解説をしてきました。フリーソフトウェア、オープンソースソフトウェア(以下FOSS)のソースコード配布パッケージの入手、そのパッケージが本物であることの確認までが終わりました。

 GNU Helloのソースコード配布パッケージは無事入手できましたでしょうか。まだの方は前回を参照しながら入手してください。本物かどうかの確認は、ついついおろそかにしがちですが、習慣としたいものです。FOSSのサイトがクラックされた例も過去にはあるのですから、習慣付けておいて損はありません。

 それでは入手した配布パッケージを展開し、中に何が入っているか見てみましょう。

$ tar zxvf hello-2.7.tar.gz
$ cd hello-2.7
$ ls -p
ABOUT-NLS  ChangeLog.O  NEWS    aclocal.m4  configure.ac  man/
AUTHORS    INSTALL      README  build-aux/  contrib/      po/
COPYING    Makefile.am  THANKS  config.in   doc/          src/
ChangeLog  Makefile.in  TODO    configure   gnulib/       tests/

 ファイル名が大文字になっているものは、ほとんどの場合ドキュメントです。まずはドキュメントからチェックしていきましょう。

最低限確認すべきドキュメント

 ほとんどのソースコード配布パッケージでは、ドキュメントは慣例に従ったファイル名になっています。ほかのファイルと見分けやすいように、すべて大文字か、大文字で始まる形になっています。数字で始まることもあります。

 ドキュメントファイルはプレーンテキストですので、サーバ上でもlessコマンドなどで表示できます。HTMLやPDFといった形式のドキュメントを用意しているFOSSも増えてきましたが、そういったドキュメントはたいてい「doc/」などのディレクトリにあります。普通はサイト上にも同じものがあるので、そちらを見た方が早いでしょう。

 まず「README」には、そのソフトウェアの紹介や、作者の連絡先などが書かれています。インストール手順をここにまとめてあることもあります。「ChangeLog」「CHANGES」などの名前のファイルは、バージョンごとの変更点がまとめられています。バージョンアップするときは目を通しておくとよいでしょう。

 インストールの手順を示したファイルは「INSTALL」です。ほかのソフトウェアが必要なFOSSであれば、その一覧も記載してあるでしょう。ビルドという作業を進める上で、とても重要なドキュメントです。ざっとでも良いので、ビルド前には一読しておくべきです。詳しいインストール手順は、HTMLやPDFファイルに記載されている場合もあります。見逃さないようにしましょう。

 このほかに、事前に把握すべきものとしては、そのFOSSのライセンスがあります。ライセンス条項を記したファイルは「COPYING」や「LICENSE」という名前になっています。著作権者は、ライセンスに基づいてソフトウェアの利用や再配布を許諾しているということを忘れてはなりません。

 特に仕事で使う場合、ライセンスが問題となるケースもあります。代表的なライセンスであるGPLでは、派生したソフトウェアを再配布するときもGPLで配布しなければならないという制約があります。

 派生したソフトウェアを販売しようと考えたとき、この点が問題になります。販売することも自由なのですが、入手した人が無料で再配布するのもまた自由になってしまうのです。このように、ライセンスの種類によっては、FOSSを採用できないということもあります。ライセンスを扱った解説記事やWebサイトなどもあります。詳しくはそちらを参照してください。

configureでMakefileを生成

 さて、実際にGNU HelloのINSTALLファイルを見てみますと、冒頭に次のような1文があります。

Briefly, the shell commands `./configure; make; make install' should
configure, build, and install this package.

 インストールにsudoを使っていないという違いはあるものの、これまでの連載で何度か示してきた手順と同じであることが分かります。

 makeコマンドがどのような処理をしているかは、これまでの連載でその概要を解説しました。Makefileという名前のファイルに記した設定に従ってソースコードをコンパイル、リンクしたり、インストールなどを実行しているのでした。

 ここで配布パッケージ内のファイル一覧をよく見てください。Makefileがどこにもありません。似たような名前のファイルはあるものの、配布パッケージには入っていないわけです。当然、配布パッケージを展開した直後にmakeを実行すると、Makefileがないのでエラーになります。

 このことから、makeコマンドの前に実行しているconfigureコマンドが、Makefileを生成しているのだろうと分かります。configureはカレントディレクトリのファイルを実行していますので、これは配布パッケージ内にあるファイルということになります。

 とにかく、configureを実行してみましょう。実行すると、以下のようになります。

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for ranlib... ranlib
(略)
checking where the gettext function comes from... libc
configure: creating ./config.status
config.status: creating Makefile
config.status: creating contrib/Makefile
config.status: creating doc/Makefile
config.status: creating gnulib/lib/Makefile
config.status: creating man/Makefile
config.status: creating po/Makefile.in
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
$

 ずらずらと「checking 〜」という表示が並び、最後の方で「creating Makefile」という表示を確認できます。この表示からもMakefileを生成しているということが分かります。

configureの役割

 なぜ、Makefileを配布パッケージには含めず、付属のconfigureコマンドで生成するようになっているのでしょうか。これはソフトウェアをビルドする環境には、多かれ少なかれ差異があるからです。

 Linuxと言ってもCentOSDebian GNU/Linuxなどといった違いがありますし、FreeBSDSolarisなどまったく別のUNIXもあります。同じCentOSでも、パッケージのインストール状況はそれぞれの環境で異なるでしょう。このような差異があると、単一のMakefileではうまく対応できないのです。

 第9回の例を参照してほしいのですが、コンパイラのコマンド名をマクロとしてMakefileに記述しました。GNU C Compilerならgccですが、もしIntelのコンパイラをインストールしていればiccと記述します。コンパイラの標準コマンド名であるccが、どちらのコンパイラにシンボリックリンクを張ってあるかは、設定した人によるでしょう。

 コンパイラに限らず、このように環境に依存しているものを決め打ちでMakefileに埋め込んでしまうと、自分の環境ではビルドできるがほかの人の環境ではできない、ということにもなりかねません。これを移植性が悪いともいいます。

 環境の差異を吸収するには、その部分を設定可能にするしかありません。Makefileのマクロで定義すれば、実行時に上書きもできますし、Makefileの書き換えも簡単です。しかし、これはユーザーが差異を調べて吸収する作業をしなければならないということです。ビルドという作業をやり遂げる際のハードルがかなり高いものになってしまいます。

 そこで、自動的に環境を調査して、環境に合わせて設定したMakefileを生成する、という方法が採られるようになりました。そのためのコマンドがconfigureです。lessなどで表示してみれば分かりますが、configureはシェルスクリプトです。標準的なUNIXであれば、どこでも実行できるようになっています。なお、configureが生成するのはMakefileだけではありません。ソースコードが参照するファイルなども設定しています。

 configureがチェックする要素はかなりたくさんあります。configureの出力にある「checking 〜」という表示は、環境ごとの差異になり得る部分を1つチェックしていることを示す表示です。次のようにして調べてみると、GNU Helloで202個もあります。

$ ./configure | grep 'checking' | wc -l
202

 configureによる自動設定が主流になる前は、Makefileなどのファイルを自分の環境に合わせて書き換えてからmakeしていました。それに比べると現在のビルド作業は、はるかに楽になったものです。ただし、今現在でもconfigureが付属せず、自分で書き換えなければいけないFOSSは、ごく少ないですが存在しています。

 configureは環境を調査するだけではありません。インストール先などのユーザーの指示に基づいて各ファイルを生成します。次回はその方法について解説します。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)



「仕事で使える魔法のLAMP」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。