ライブラリが足りなくてビルドできないときは?:仕事で使える魔法のLAMP(15)
前回、Apache HTTP Serverをビルドしてみたところ、ライブラリが足りないために失敗しました。このようなときに打つ手を紹介します(編集部)
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モジュールのうち、一般的によく利用するものについて解説します。
- CMakeでMySQLをビルドしてみる
- MySQLのビルドに欠かせないCMakeを準備する
- いよいよMySQL編、ソースからビルドすべきか?
- PHPでセッションを利用するための設定
- クライアントがアクセスできる範囲を制限する
- エラーメッセージをどう扱うか?
- ファイルのアップロードを制限する
- リクエストデータを受け取る変数の扱い
- マジッククオート機能には頼らない
- 安全を考えてPHPの実行時設定を調整する
- Apacheの設定ファイルでPHPの設定を変える
- PHPの設定ファイルを作って配置してみる
- PHPスクリプトを実行できるようにする準備
- PHPエクステンション組み込みの仕上げ
- 単純なデータを管理するDBMを使えるようにする
- エクステンションの組み込み状況を確認する
- PHPでデータベースを使う準備をする
- XMLを処理できるようにする
- エクステンションを有効にしてビルドに挑戦!
- PHPテスト失敗の原因を追究する
- 早速PHPをビルド! そしてテスト!
- PHP編に突入! まずはソースをダウンロード
- 設定ファイルを作成してApacheを動作させる
- 設定ファイルや公開ドキュメントの配置を考える
- 1つのサーバに複数の仮想サーバ?
- Apacheの設定ファイルを記述する前に
- サードパーティのApacheモジュールをビルドする
- 認証DBにアクセスするライブラリを組み込む
- Apache同梱ソフトウェアに引数を渡してビルド
- OpenSSLをビルドしてApacheで利用する
- proxyやsslのモジュールを使ってみる
- ライブラリが足りなくてビルドできないときは?
- Apache HTTP Serverのビルドを始めよう
- configureでソフトウェア固有の設定を変更してみる
- configureの設定を変更してみる
- 配布パッケージの中身と、configureの役目を知る
- ダウンロードファイルが真正なものであるかを確認
- Makefileをいろいろ書き換えながらビルドしてみよう
- makeを使ってソフトウェアをビルドしてみよう
- ダイナミックリンクとスタティックリンク
- 「ビルド」という作業は何を指しているのか
- 公開鍵認証でsshを安全に使う
- sshを便利にする公開鍵暗号
- アクセス制限の設定とCentOSのアップデート
- サーバに接続して、一般ユーザーのアカウントを作る
- LAMP環境、自分で作りませんか?
Copyright © ITmedia, Inc. All Rights Reserved.