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
このように、うまく両方を扱えている。