ライブラリが足りなくてビルドできないときは?仕事で使える魔法のLAMP(15)

前回、Apache HTTP Serverをビルドしてみたところ、ライブラリが足りないために失敗しました。このようなときに打つ手を紹介します(編集部)

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

configureの結果やヘルプから状況を読み取る

 前回に引き続き、Apache HTTP Server(以下Apache)のビルドを実践形式で進めていきます。ドキュメントに従ってビルドを試みたところ、mod_deflateモジュールの依存関係で、configureスクリプトがエラーで停止するというところで前回は終了しました。mod_deflateモジュールを無効にすればコンパイルまで問題なく進むので、現状の問題はこの1点だけです。今回はこのmod_deflateモジュールの問題を解決していきます。

 現実的に考えると、mod_deflateを使わないとはっきり確定しているなら、無効にしてそのままにしておく、というような判断もあるでしょう。ここでは解説のために問題を解決していく過程を解説するのですが、現実にビルドするときも、できるだけ問題を解決していくよう心がけたいと筆者は考えています。

 問題解決の作業を通じてスキルアップもできるでしょうし、ドキュメントに載っていないような実際の状況も把握できます。ソフトウェアをソースコードからビルドすることを覚えるということは、ビルド対象のソフトウェアをよく知り、コントロールできるようになるということです。スキルを上げるためには、問題から逃げるよりも積極的に対処し、原因を究明するべきです。

 さて、前回のconfigureスクリプトのコマンドは次のようなものでした。ビルドするApacheモジュールはできるだけ多くのモジュールを有効にしておきたいのでallを指定、MPM(Multi Processing Module)はPHPで推奨されているpreforkを選択しています。

./configure \
  --prefix=/opt/apache-httpd-2.2.19 \
  --enable-mods-shared=all \
  --with-mpm=prefork \
  2>&1 | tee configure_log.txt

 これを実行すると、次のようにエラーでconfigureが停止しました。mod_deflateに必要なzlibが見つからないというエラーです。

(略)
checking whether to enable mod_ext_filter... shared (all)
checking whether to enable mod_include... shared (all)
checking whether to enable mod_filter... shared (all)
checking whether to enable mod_substitute... shared (all)
checking whether to enable mod_charset_lite... no
checking whether to enable mod_deflate... checking dependencies
checking for zlib location... not found
checking whether to enable mod_deflate... configure: error: mod_deflate has been requested but can not be built due to prerequisite failures

 必要なソフトウェアはインストールドキュメントに書いてあるはずですが、zlibが必要という記述はありませんでした。Apacheのように機能がモジュール単位で分割されているソフトウェアでは、個々のモジュールのドキュメントに記載がある場合もあります。そちらも忘れずに確認しましょう。PHPも機能がモジュール化されていますが、ビルドに必要な情報は各モジュールの項目に記載されています。

 しかし、mod_deflateについては、モジュールのドキュメントを参照してもはっきりとは書いてありません。ときにはこういうこともあります。そのようなときは、今回のようにエラーメッセージなどの状況から必要なものを把握します。

 いずれにしても、必要になる外部ソフトウェアは、configureスクリプトが知っています。今回のケースでもzlibの存在をチェックしてエラー停止しています。外部ソフトウェアはconfigureのwith引数で指定できますので、ヘルプを参照すればどのような外部ソフトウェアに依存しているかを調べることができます。

 zlibについては、ヘルプに次のような1行があります。--with-zで指定すれば良いことが分かります。

  --with-z=DIR            use a specific zlib library

 このzlibの表示を見ても分かるとおり、外部ソフトウェアがあるということは分かるものの、必須のものなのか、オプションなのかまでは判然としないケースがほとんどです。ドキュメントからはっきり必要と分かっているものは組み込み、あとは実際のエラーに遭遇してから解決という流れで良いでしょう。

 ソフトウェアが見つからなくてエラーになるのならと考え、ヘルプに表示される外部ソフトウェアを問答無用ですべて組み込む人もいるかもしれません。しかし、これは要らぬトラブルの元になりかねませんので止めた方がよいでしょう。互いに衝突するような引数もあります。

ビルドするべきか、パッケージを使うべきか

 さて、ここで遭遇している問題を実際に解決するには、足りないzlibをインストールしなければならないことは明白です。zlibはデータ圧縮や展開の機能を持つライブラリです。mod_deflateはHTTPでデータ圧縮をするためのモジュールで、その圧縮部分は外部ソフトウェアを利用しているわけです。

 インストール前に判断しなければならないのは、外部ソフトウェアをソースコードからビルドするのか、それともOSやディストリビューションに入っているパッケージを使うかということです。次のように決めると良いでしょう。

 まず、OSやディストリビューションを探しても見つからない場合、当たり前ですがソースコードからビルドします。OSにあるものが、ビルドしたいソフトウェアが要求しているバージョンより古いものである場合も同様にビルドするしかありません。探して見つかれば、OSのパッケージを使っても問題はないということになります。

 であれば、まずはパッケージの利用を考えます。こういったこまごまとした外部ソフトウェアをすべてビルドしていくのは、分量的に面倒です。また、外部ソフトウェアは多くの場合ライブラリで、とくに掘り下げて把握する必要はないということがほとんどです。ライブラリはコンパイルしてインストールで終わりなので、設定や運用といった作業がありません。パッケージを使うメリットの方が大きいと判断できます。

必要なパッケージの特定とインストール

 というわけで、パッケージをインストールしてzlibを使えるようにします。まずはパッケージを探し出さなければなりません。次のようにyum searchで分かっているキーワードを指定して実行します。

$ yum search zlib
Loaded plugins: fastestmirror
================================ Matched: zlib =================================
perl-Archive-Tar.noarch : A module for Perl manipulation of .tar files
iptstate.x86_64 : A top-like display of IP Tables state table entries
jzlib.x86_64 : JZlib re-implementation of zlib in pure Java
jzlib-demo.x86_64 : Examples for jzlib
jzlib-javadoc.x86_64 : Javadoc for jzlib
perl-Compress-Zlib.x86_64 : A module providing Perl interfaces to the zlib
                          : compression library.
perl-IO-Zlib.noarch : Perl IO:: style interface to Compress::Zlib
zlib.i386 : The zlib compression and decompression library.
zlib.x86_64 : The zlib compression and decompression library.
zlib-devel.i386 : Header files and libraries for Zlib development.
zlib-devel.x86_64 : Header files and libraries for Zlib development.

 パッケージ名や説明文に“zlib”という言葉を含むものが出てきました。それぞれのパッケージ名のピリオドの後ろはプロセッサアーキテクチャで、パッケージ名と言うと、普通はピリオドの前を指します。そういうことを考え、説明文まで読んで探してみると、zlibというパッケージがあることが分かります。そしてもう1つ、zlib-develというパッケージがあります。こちらにはzlibのヘッダファイルという説明があります。

 ヘッダファイルは第13回でも説明しましたが、ライブラリを組み込んでコンパイルする際に必要になるファイルです。CentOSなどではコンパイルに必要なファイルをまとめたパッケージには後ろに-develという名前が付くようになっています。ライブラリそのものはヘッダファイルがなくても動作するため、パッケージが分割された状態になっていることがほとんどです。

 つまり、今回はzlibとzlib-develの2つのパッケージが必要ということになります。インストールは次のように実行します。

$ sudo yum install zlib zlib-devel

 結果は以下のようになります。よく見ると、zlibはすでにインストールされていて、zlib-develのみが新たにインストールされたことが分かります。

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Setting up Install Process
Package zlib-1.2.3-3.x86_64 already installed and latest version
Package zlib-1.2.3-3.i386 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package zlib-devel.i386 0:1.2.3-3 set to be updated
---> Package zlib-devel.x86_64 0:1.2.3-3 set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
 Package              Arch             Version             Repository      Size
================================================================================
Installing:
 zlib-devel           i386             1.2.3-3             base           101 k
 zlib-devel           x86_64           1.2.3-3             base           102 k
 
Transaction Summary
================================================================================
Install       2 Package(s)
Upgrade       0 Package(s)
 
Total download size: 202 k
Is this ok [y/N]: y
 
Downloading Packages:
(1/2): zlib-devel-1.2.3-3.i386.rpm                       | 101 kB     00:00
(2/2): zlib-devel-1.2.3-3.x86_64.rpm                     | 102 kB     00:00
--------------------------------------------------------------------------------
Total                                           5.6 MB/s | 202 kB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : zlib-devel                                               1/2
  Installing     : zlib-devel                                               2/2
 
Installed:
  zlib-devel.i386 0:1.2.3-3             zlib-devel.x86_64 0:1.2.3-3
 
Complete!

 この状態で、前述のconfigureのコマンドラインを実行するとconfigureはエラーなく終了するはずです。エラーで止まっていたあたりの出力は、次のようになっています。

checking whether to enable mod_deflate... checking dependencies
checking for zlib location... /usr
  adding "-lz" to LIBS
checking for zlib library... found
  forcing MOD_DEFLATE_LDADD to "-lz"
  removed "-lz" from LIBS
checking whether to enable mod_deflate... shared (all)

 zlibが自動的に検出されているのが分かります。この後ビルドすれば、問題なくビルドも終了します。

 configureの実行時、「--with-z」引数は指定していませんが、それでも問題ありません。with引数は、外部ソフトウェアの組み込みそのものの指示と、外部ソフトウェアが存在するディレクトリの指示の2つの役割があります。欠かせないソフトウェアの場合、組み込みの指示の意味はなくなるので、後者だけの役割をもつ引数となりますが、/usrなどの標準的な位置であれば指定する必要がないのです。仮にzlibをビルドするなどして別の場所にインストールした場合には、「--with-z」指定により明示する必要があります。

 次回は、allではインストールされないApacheモジュールのうち、一般的によく利用するものについて解説します。

著者紹介

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



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

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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