試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Mandriva Linux向けRPMパッケージの.specファイルにおけるマルチアーキテクチャ向けのファイルの扱いについて

ライブラリのパッケージでは、ものによっては[名前]-configという実行ファイルがインストールされる。これはpkg-configのような働きをするもので

  • パッケージ(ライブラリ)がインストールされているかどうか
  • このパッケージを利用したアプリケーションをビルドするときにどのようなオプションをコンパイラ/リンカに付けるべきか

などを出力する。pkg-configの場合は、パッケージ側がそういった情報を

  • /usr/lib/pkgconfig/ - アーキテクチャはディストリによって異なる
  • /usr/lib64/pkgconfig/ - 64bit用
  • /usr/lib32/pkgconfig/ - 32bit用・ディストリによってはない

の中の.pcファイルに保存するのだが、従来型の[名前]-configというスクリプトは実行ファイルのディレクトリに入ることになるため、i586版とx86_64版など、複数のアーキテクチャ向けのパッケージを同時に存在させたいときに問題が出る。
そこで、これをうまく処理するための仕組みが用意されていて
http://web.archive.org/web/20081021095417/http://wiki.mandriva.com/en/Policies/Multiarch
を参考にして

  • 「%install」の最後に%multiarch_binaries
  • 「%files」に%multiarch

を下のように記述することで利用できる。「%files」には%{_bindir}/[名前]-configについても通常通り書いておく。

%define develname       %mklibname    -d onig
(中略)
%install
%{__rm} %{buildroot} -fr
%makeinstall
%{__lzma} AUTHORS HISTORY README* doc/*
%multiarch_binaries %{buildroot}/%{_bindir}/onig-config
(中略)
%files -n %{develname}
%defattr(-, root, root)
%{_bindir}/onig-config
%{_includedir}/*.h
%{_libdir}/libonig.so
%doc doc/*
%multiarch %{multiarch_bindir}/onig-config

上は鬼車向けに自前で作成した.specファイルからの抜粋だが、後にMandriva Linux 2009.0には「lib(64)onig*」のパッケージが存在していることが分かったため、お蔵入りとなってしまった*1
このようにして作成されたRPMパッケージでは、該当ファイルが

(x86_64版の開発ファイルパッケージ)
-rwxr-xr-x   1 root     root         1384 Jan  8 20:04 ./usr/bin/multiarch-x86_64-linux/onig-config
lrwxrwxrwx   1 root     root           32 Jan  8 20:04 ./usr/bin/onig-config -> ../../usr/bin/multiarch-dispatch
(i586版の開発ファイルパッケージ)
-rwxr-xr-x   1 root     root         1382 Jan  8 20:05 ./usr/bin/multiarch-i386-linux/onig-config
lrwxrwxrwx   1 root     root           32 Jan  8 20:05 ./usr/bin/onig-config -> ../../usr/bin/multiarch-dispatch

このように配置される。両方をシステムにインストールして動作を確認すると

$ onig-config --libs  
-L/usr/lib64 -lonig
$ linux32 onig-config --libs
-L/usr/lib -lonig

このように、うまく両方を扱えている。

*1:しかし、公式の.specファイルには(バージョン5.9.1-1mdv2009.0の時点では)マルチアーキテクチャの処理は書かれていなかった