エンタープライズ:特集 2003/09/26 18:00:00 更新


特集:第2回 RPM活用のステップアップ−SRPMリビルドとコンパイルマスター (5/6)

エラー解決のコツ

 ここからが正念場だ。コンパイルは成功するとは限らない。失敗する原因はさまざまであり、時としてソースファイルに触れなければならないこともある。ここではSPECファイルの問題やファイルの有無など、解決が比較的容易な例をいくつか挙げてみよう。

ex.1 「パッケージ依存」。サンプルにしているbalsaを一般的な構成のRed Hat Linux 9でコンパイルすると、途中で以下のようなメッセージが表示されストップしてしまう。

〜前略〜

checking for
libgnomeprint-2.2 >= 2.1.4
libgnomeprintui-2.2 >= 2.1.4
... Package libgnomeprintui-2.2 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libgnomeprintui-2.2.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libgnomeprintui-2.2' found

configure: error: Library requirements (
libgnomeprint-2.2 >= 2.1.4
libgnomeprintui-2.2 >= 2.1.4
) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your
libraries are in a nonstandard prefix so pkg-config can find them.
エラー: Bad exit status from /var/tmp/rpm-tmp.21713 (%build)


RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.21713 (%build)

 これは依存関係と同じであり、使用するライブラリ、libgnomeprint、libgnomeprituiのバージョンが低いというエラーだ。パッケージチェックの段階で検出されたのでパッケージ名が分かるだろう。rpmfind.netなどで該当するパッケージを探し、随時インストールしながら回避していく。

ex.2 「必要なファイルの存在」。「/usr/lib/libgthread.la」というファイルがなく、エラーになったとする。その場合には、エラー表示ストップした個所から上に少しスクロールさせていけば、メッセージに「Not find」などと表示されているはずだ。

 しかし「libgthread.la」という単独のファイル名では、それがどのパッケージに含まれるのかは分からない。手掛かりを得るには、同じファイル名の既存ファイル名からクエリーをかけることだ。ライブラリやヘッダ系のファイルであれば「.la」はなくとも、同じ名前の「.so」(共有ライブラリ)や「.a」(a.out形式のライブラリ)、「.o」(オブジェクトモジュール)というサフィックスのついたファイル名がある。通常、これらは同一のdevel系パッケージに含まれている。そこで次のように入力する。

# rpm -qf /usr/lib/libgthread.a
glib-devel-1.2.10-10

 これでファイルを供給しているパッケージ名が分かる。もしも「glib-devel」パッケージはインストール済みであり、「libgthread.aがあるのにlibgthread.laがない」という場合には、glib-develをsrc.rpmからリビルドし、インストールし直す。rpmのバイナリパッケージは使用頻度の低いファイルが間引かれていることもあるからだ。

%makeinstall

# Remove files that should not be packaged
rm $RPM_BUILD_ROOT%{_libdir}/*.la

 SPECファイル中にこのような記述があれば「.la」ファイルはパッケージから除外される。この部分をコメントアウトしてリビルドしなおせばよい。

ex.3 「SPECファイルのマクロ定義」。自ディストリビューション向けのsrc.rpmがなく、他ディストリビューション向けのものを利用したとする。rpmfind.netなどで比較的新しいバージョンが揃うのはMandrakeだが、MandrakeのSPECファイルを使うと書式や設定される環境変数の違いから、しばしばエラーが起きる。次のような例だ。

〜前略〜

Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.1148
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd libgnomeprintui-2.2.1.3
+ LANG=C
+ export LANG
+ %configure2_5x
/var/tmp/rpm-tmp.1148: line 29: fg: no job control
エラー: Bad exit status from /var/tmp/rpm-tmp.1148 (%build)


RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.1148 (%build)

 これは「%configure2_5x」というマクロが理解できずにストップしていることを意味する。SPECファイルを覗いてみると、以下のようになっている。

# less libgnomeprintui.spec

〜中略〜

%build
%define __libtoolize /bin/true

%configure2_5x

%make

〜以下略〜

 こうした特定のディストリビューションを前提としたマクロ名、環境変数が理解できない場合には、余計なオプションや環境変数を取り除いてやるとエラー回避できることがある。上記の例であれば、

%configure2_5x
  ↓
%configure

 と修正するとエラー回避されることがある。

ex.4 「src.rpmが存在しない」。最新のライブラリになると、src.rpmもなく、tarボールのソースファイルのみ提供されているという場合がある。しかし、そのままmake、make installしてしまってはRPMで管理する意味がない。どうすればよいのだろうか。

 このような場合には、「sh ./configure; make」としていちどコンパイルする。ただし、「make install」を実行しない。どのファイルが必要であるのかは、たいていエラーメッセージの中に含まれているので、コンパイルしたビルドツリーから手作業でファイルを該当ディレクトリへ配置する(なお、tarballからRPMを作成する方法については次回説明する)。

One Point:
「./configure」実行時に「--prefix」オプションでインストールの配置ディレクトリを指定する方法もある。ただし、RPMの管理下にはなくなるのでお勧めはしない。

前のページ | 1 2 3 4 5 6 | 次のページ

[渡辺裕一,ITmedia]