前回までにX11R7.5のproto/, lib/, app/の各部分をビルド、インストールしてきました。このあたりまでビルドできれば、X Window Systemの中心となるソフトウェアであるXサーバ(xorg-server)もビルドできます。
Xサーバについて
Xサーバはディスプレイ画面を描画すると共に、キーボードやマウスからの入力を受けとって適切なクライエントソフトウェアに送信する、という重要な処理を担っています。
「Xサーバ」という名称が示すように、X Window Systemはサーバ/クライアントモデルを採用しています。通常のサーバ/クライアントモデルの場合、手元ではクライアント側のソフトウェアを動かして、サーバはネットワーク上のどこかで黙々とクライアントからのリクエストを処理するような構成を取りますが、Xの場合は逆で、「Xサーバ」は常に手元のマシン上で動いてディスプレイに描画したりキーボードやマウスからの入力を受けつけており、画面を操作したいクライアントソフトウェアはXプロトコルを用いてサーバに話しかけて、必要な処理をしてもらうことになります。
画面描画などウィンドウ操作に必要な処理はハードウェアを直接操作する必要があるため、GUIを前提に設計されたMacOSやMS Windowsではカーネルレベルに必要な機能を組み込んでいます。一方、X Window Systemでは、UNIXの簡潔な設計を守るため、Xサーバは独立した1つのプロセスとして動作する設計になっており、その結果、Xサーバはずいぶん複雑で大規模なソフトウェアになっています。
加えて、PC UNIX環境では画面描画用のビデオカードにもさまざまなメーカが存在するので、Xサーバもハードウェア的に異なる多数の種類のビデオカードに対応する必要があります。
伝統的な一枚岩的設計のサーバでは、周辺機器用のすべてのドライバもXサーバと共に開発されていましたが、最近のモジュール的設計に変更されたXサーバ(xorg-server)では、各種ドライバはXサーバ本体とは分離され、独立したソフトウェアとして開発、配布されています。
今回ダウンロードしたファイルのうちdriverディレクトリに収められているのが、それらドライバ類のソースコードです。xorg-serverでは、linuxカーネルと同じように、これら周辺機器用のドライバはモジュールとして用意され、検出したハードウェアに応じたドライバを動的に組み込むようになっています。そのためxorg-serverを更新する際は、Xサーバ本体だけではなく、そのサーバに対応したドライバ類も忘れずにインストールしてやる必要があります。
ビルド、ビルド、ビルド!(その2)
それではxorg-serverをビルドしてみましょう。xserverディレクトリに移動し、ビルドスクリプトを起動します。
おっと、configureの段階でエラーになってしまいました。
configureスクリプトはxorg-serverをビルドするのに必要なソフトウェアの有無やバージョンをチェックしますが、その際にpixmanと呼ばれるピクセル操作用ライブラリのバージョンが、求められている0.15.20よりも低い0.15.12だったことが見つかってしまいました。
configureスクリプトはpkgconfigコマンドを用いてそれぞれのソフトウェアの有無やバージョンをチェックします。pkgconfigコマンドが利用する各種pcファイル(前回紹介したxpm.pc等)は、通常/usr/lib/pkgconfig ディレクトリに 収められますが、ビルド時の設定によってインストール先は変わります。/usr/lib/pkgconfig/以外にインストールされたpcファイルを探すには、PKG_CONFIG_PATHという環境変数にpcファイルを収めたディレクトリのリストを設定します。
pixmanのビルドスクリプトを調べてソースコードの配布元へ行ってみると0.17.2というバージョンが公開されていたので、まずそれをビルド、インストールして再度ビルドスクリプトを流すと、無事configureの処理は通過しました。
libuuidの祟り
続いてビルド作業に移ると、コンパイルは問題なく進んでいくものの、リンクの時点でlibuuid.la が無い、というエラーが再発しました。
前回紹介したように、このエラーはXorgがリンクしようとしているライブラリのいずれかにlibuuid.laを必要とするものがあることを示します。/usr/X11/lib/以下のライブラリはlibuuid.laを削除後にビルドしているので、libuuid.laを必要とするライブラリは/usr/lib/以下にあるのでしょう。
grepコマンドで調べてみると、確かにいくつかのライブラリがヒットしています。
/usr/lib/以下では、これら16個のライブラリがlibuuid.laをリンクしているようです。前回紹介したようにlibuuid.laの無い、e2fsprogs版のlibuuid.so.1に移行するには、これらのライブラリは再ビルドする必要がありそうです。
だんだんと影響範囲が広がっているlibuuid問題に恐れながら、該当のライブラリをざっと見ると、これらはxorg-serverの動くレベルよりも上位層のライブラリが多そうです。たとえばlibMagick系のライブラリはImageMagickという画像処理ソフト用のライブラリだし、libvlc系のライブラリはVLCメディアプレイヤのライブラリ、libxf系のライブラリはXfceデスクチップ環境のライブラリなので、xorg-serverがそれらX用のアプリのライブラリを参照することはないはずです。
そう考えてライブラリのリストを改めて眺めると、これらの中でもxorg-serverが依存しそうなのはlibhal.laくらいのようです。
HAL(Hardware Abstraction Layer)とは、DBus等と共に提唱されたデスクトップ環境用の機能で、各種周辺機器の情報を仮想化してデスクトップ用アプリケーションに提供します。xorg-serverでは、キーボードやマウスといった入力機器に関する情報をHAL経由で入手していますが、Plamoの場合、xorg.confでInputDevice節の指定をしているのでHALを使って自動検出させる必要は無さそうですし、xorg-server付属のconfigureスクリプトのヘルプ情報を調べると--disable-halというHAL機能を使わないオプションが用意されていました。
そこで、このオプションをビルドスクリプトに追加すると、無事xorg-serverのビルドが完了しました。
driver/のビルド
先に紹介したように、最近のxorg-serverは周辺機器用のドライバとは分離されているので、本体だけではビデオカードを含めた周辺機器を操作できません。そこでxorg-serverを新バージョンに更新した上で続けてdriverディレクトリ以下のドライバ群のビルドに移ります。
X11R7.5 として公開されたドライバはマウスやキーボードといった入力機器用のドライバが9個、ビデオカード用のドライバが46個ありました。ただしビデオカード用のドライバのうちIntel用のドライバは2つのバージョンが含まれており、また古いSUNのワークステーション用のドライバ(suncg3等)でPC環境では使えそうにないものが6個ほどあったので、それらを除くと39個となりました。
これらもスクリプトで一括ビルドしていきましょう。
スクリプト任せでしたが、数時間かかって全てのドライバのビルドが終了したようです。ログファイルを調べると、xf86-video-wsfb0.3.0というドライバで「ヘッダファイルが見つからない」旨のエラーが出てビルドに失敗していましたが、ソースコードに付属のREADMEを見ると、このドライバはBSD系のwsdisplayと呼ばれるフレームバッファデバイス用とのことなので、Linuxではビルドする必要はないでしょう。
xorg-serverの起動テスト
X Window Systemを起動するにはフォントやアイコンデータなども必要ですが、今回はX11R7.4の環境上でアップデートしてきたので、フォントやアイコンデータなどは既存のものを使い、xorg-serverと必要なドライバを更新しただけでも起動できるはずです。
そう思ってXサーバの起動テストをしてみたところ、一瞬Xの画面は立ちあがるものの、エラー終了してコンソール画面に戻ってしまいます。
xorg-serverのログは/var/log/Xorg.0.logに記録されているので、まずそれを眺めてみます。
Xorg.0.logの先頭部分を見ると、今回ビルドしたxorg-server 1.7.1が起動されていることがわかります。Xorg.0.logの中では、表示される各行の先頭に (II)や(WW)、(EE)といった情報が付加されています。これらのうち(II)は "Information"、(WW)は "Warning"、(EE)は"Error" の略で、(II)が付加されている行は単なる情報、(WW)は注意すべき情報ですが何らかの回避手段が用意されていてエラーにはならなかったメッセージ、(EE)はエラーメッセージですが致命的なエラーで無い場合はそのまま処理が進みます。
この例でも、Plamoのデフォルトでは存在しないacpidが起動していない旨の警告やfreetypeモジュールがロードできない旨のエラーは報告されていますが、処理は継続しています。
最終的に致命的なエラーになっているのはログファイル末尾のこの部分のようです。
この結果を見ると、/usr/share/X11/xkb/rules/baseというxkeyboard-configの設定ファイルが無いために致命的なエラーになっているようです。
PC用のキーボードには、英数字のみのUSキーボードやひらがなが入力可能な日本語キーボードをはじめ、世界各地の言語に応じたさまざまな種類のキーボードが存在します。これらキーボードのキートップの刻印はさまざまですが、周辺機器としてのキーボードから送られてくる情報はそれぞれのキーにハードウェア的に割りあてられた番号のみで、その番号をどういう文字と解釈するかはソフトウェア側に任されています。最近のX Window SystemではそのためにXKB(X KeyBoard extention)という仕組みを採用しており、上記のエラーはこのXKBにとって必須の設定ファイルが存在しないことに起因するエラーです。
調べると、確かに/usr/share/X11/xkb/rules/baseというファイルは存在しませんが、この環境ではX11R7.4は動いていましたし、xkeyboard-configもインストール済みのはずです。そこでxkeyboard-configパッケージを調べてみると、インストール先が/usr/X11R7/share/X11/xkb/rules/baseになっていました。
Xサーバが見に行く先が/usr/share/X11/xkbになっているのは釈然としないものの、とりあえずシンボリックリンクを張ってごまかすことにしました。
libuuidの祟り(その2)
/usr/X11R7/share/X11/xkbから/usr/share/X11/xkbへリンクを張って再度Xサーバを起動しようとすると、以前よりは長くXの画面が出るものの、やはり異常終了してコンソールに戻ってきてしまいます。あれれ、と思って画面をよく見ると、Xサーバは起動したものの、dbus-launchやxfce4-sessionが、「libuuid.so.16が無い」旨のエラーを出して起動に失敗しています。
うーん、、確かに先に調べたlibuuid.laが含まれているライブラリのリストにはxfce4関連のライブラリも上がっていたので、Xfce用のコマンドがエラーになるのは予想できました。加えて、デストップ環境でのプロセス間通信を支えているdbus-launchがエラーになると、Xfceのみならず、GNOME/KDEも起動できないでしょう。前回sxpmのビルドのために削除したuuidパッケージに祟られてきたような気分です(苦笑)。
お祓いのためにはlibuuid.so.16 をリンクしているライブラリ類を全て再ビルドしてやる必要がありますが、幸い Plamoの場合、AfterstepやQvwmといった旧世代のウィンドウマネージャも残しているので、とりあえずそちらを使えばD-Bus等の問題も回避できるでしょう。
~/.xinitrcを修正してウィンドウマネージャをAfterstepにしてみると、ようやくXの画面が立ちあがってくれました。起動時のログファイルである/var/log/Xorg.0.logを見ると、Xサーバのバージョンは1.7.1、pixmanのバージョンも0.17.2となっていました。
ビルドは続く
こうなってくるとsxpmのためにlibuuid.so.16を削除したことの是非に戻って検討した方がよさそうですが、とりあえず乗りかかった船なのでX11R7.5のビルドを続けます。残るソースコードのうちdata/以下はアイコン用のビットマップデータ、font/以下は各種フォントデータです。
まずソースコードが2個のdataディレクトリでビルドスクリプトを動かします。
おっと、今度はxcursorgen が無い、というエラーで引っかかりました。「xcursorgen って何だっけ?」と思って/var/log/packages/を調べてみると、その名前のパッケージとコマンドがインストール済みです。
改めてappディレクトリを確認すると、今回のビルドで更新したパッケージに含まれていますし、バイナリファイルもちゃんとインストールされています。一方、configureのログを調べると、2481行目あたりでエラーになっていることがわかりました。
configureスクリプトの該当部分を見てみると、xcursorgenというコマンドが$PATH上にあるかどうかを調べているようです。Plamoの場合、デフォルトではrootユーザに/usr/X11R7/bin/へのパスは通していないので、sudoで一時的にrootユーザになってconfigureスクリプトを実行したことがエラーの原因のようです。
それでは、と/etc/login.defsのENV_SUPATHに/usr/X11R7/binを追加してみましたが同じエラーになってしまいます。
あれれ、と思って、sudoのmanページを調べてみると、VAR=valueの形で環境変数を指定する方法が解説されていたので、さっそくその方法を試してみます。
今度は無事xcursorgenも見つかりビルドは完了しました。
suでrootになると、/etc/login.defsのENV_SUPATHで設定したパスがコマンドのサーチパスになりますが、sudoの場合/etc/login.defsは読まないので、ENV_SUPATHではパスを設定できません。一方、rootのデフォルトシェルの設定ファイルである/etc/bashrc等で設定してもsudoではシェルが切り替わるわけではないので、シェル用の設定ファイルも読んでくれないようです。さてどうしたものか、と改めてman sudoして上記環境変数を指定する方法を見つけましたが、UNIXの世界の奥深さをあらためて感じることになりました。
残るはfontディレクトリだけです。このディレクトリには37個のソースコードがありますが、アラビア語やシリア語、エチオピア語といった多分Plamo上では使わない言語を除くと、27個ほどになりました。アイコンデータ同様、フォントデータを生成するにも/usr/X11R7/bin/以下のコマンドが必要になるので、今回もPATH変数を明示してsudoコマンドを実行するようにしました。
fontディレクトリでは特にエラーなくビルドとインストールは終了したようです。
最後のトラップ
フォントやビットマップデータも更新し、完成したX11R7.5環境をイジっていると、Afterstepの右端のパネルに空白があることに気づきました。本来、このあたりにはメールチェックや負荷グラフの出力がはめこまれているはずです。あれれ、と思って、いくつかコマンドを叩いてみると「libXaw.so.8 が無い」というエラーになります。
あわててlibXawパッケージを調べてみると、今回インストールしたlibXaw-1.0.7にはlibXaw.so.8が存在しません。
ひるがえって、Plamo-4.71で採用していたlibXaw-1.0.4を調べると、libXaw[6,7]に加えて、確かにlibXaw8が存在しています。
何か仕様でも変ったのかな、とlibXaw付属のChangeLogファイルを調べてみると、8月中旬のコミットでlibXaw8は削除されてしまったようです。
Xprintとは、画面データをそのまま印刷するためにXサーバに組み込まれた機能ですが、Xサーバのモジュール化に合わせて切り離されて、現在は独立のプロジェクトになっています。そのためlibXawの方でも、Xprintの機能を提供していたlibXaw8を削除することにしたのでしょう。
libXawの開発者たちは、現在のXサーバに存在しない機能のみを提供していたlibXaw.so.8 は不要、と判断したのでしょうが、Linuxの共有ライブラリの仕組みでは、libXaw.so.8がある環境(X11R7.4)でビルドしたバイナリは、Xprintの機能を使っていなくても実行時にはlibXaw.so.8が必要です。今回ビルドしたソフトウェアは新しいlibXawに合わせてlibXaw.so.8は不要なようにリンクされているはずですが、過去にビルドしたX関連のアプリも、libXawをリンクするものは再ビルドが必要になるようです。
最近のX Window Systemでは、従来の一枚岩的デザインからモジュール的デザインに切り替えることで個々のソフトウェアの開発効率は改善したものの、それぞれの開発者が部分ごとに最適化を進める結果、この例のように全体ではむしろ非効率になることが増えているように感じます。バザールモデルの開発スタイルではこの種の不具合は不可避なのかも知れませんが、そのしわよせがディストリビュータに来るのは勘弁して欲しいところです。
その後の展開
何とかX11R7.5は動かすことができたものの、libuuid.so.16とlibXaw.so.8という二つのライブラリに関して、以前のバージョンと非互換になることがわかりました。また、ライブラリの問題以外にも、ビルドスクリプトで--datadirを指定していたため、フォントやキーボード用データの配置が以前とは異なるところになっていました(xkeyboard-configのエラーの原因はここでした)。
そのためビルドスクリプトを調整して再度始めからビルドし直すことにし、あらかじめlibuuid.so.16を削除しておくために、DBus等、関連するパッケージをビルドするところからやり直そうとしましたが、改めて配布元を調べてみると、すでにバージョンが更新されているものもあるようです。それらに追従しようとするとさらに変更箇所が増えてきて、かなり安定しているPlamo-4.7のツリーにマージするよりも、新しく4.8の開発を始める時にまとめて更新してしまう方がいいように思えてきました。そのため、今回判明した問題点等はできるだけビルドスクリプトに反映した上でX11R7.5 への更新は一時中断し、より互換性等の問題が少ないパッケージの更新の方を進めることにしました。
パッケージのメンテナンスにおいては、このようにある程度作業が進んだ時点で問題が判明し、0からやり直しになることも少なくありません。ディストリビューションの運営という完成することのない作業をやっていると、小石を積んでは崩される賽の河原の小石積みのように感じることもあります。しかし、石積みは崩されても石を積んだ経験は残り、次に積む際の助けになるはずです。そう信じて、今日もまた新しい石を積んでいきます。