C/MigemoのMandriva Linux向けRPMパッケージを公開/本体の.specファイルに関するメモ
別館の配布ページにてMandriva Linux 2009.0向けのC/Migemoパッケージの公開を開始した。
以下は本体とライブラリ部分の.specファイルに関する作成上のメモだが、全ての部分についてを扱っているわけではない。
(2014/10/4)配布ページは削除済み。
マクロ定義
「mklibname」というマクロを用いることで、x86_64上でライブラリのパッケージに「lib64[名前]」のように付く「64」を分岐なしで簡単に処理できることが分かった。下の「libmigemo」「libmigemo_devel」のようなマクロを定義して使用することになる。%define distname C/Migemo %define name cmigemo %define version 1.3c %define release %mkrel 2 %define libmigemo %mklibname migemo_ 1 %define libmigemo_devel %mklibname -d migemo
「%mklibname」の後ろには名前と大きなバージョン番号を続ける。下は「%mklibname」がどのように展開されるかを示す。
(2008/12/14)開発パッケージはリリース2で「%mklibname -d migemo」にした。
マクロとオプション、引数 | x86_64での展開 | i586での展開 |
---|---|---|
%mklibname migemo_ 1 | lib64migemo_1 | libmigemo_1 |
%mklibname -d migemo | lib64migemo-devel | libmigemo-devel |
%mklibname -d migemo_ 1 | lib64migemo_1-devel | libmigemo_1-devel |
配布パッケージのマクロ名を「libmigemo-devel」にするとエラーになった。ハイフンは使えないようだ。
なお、「%mkrel」はリリース番号の後ろにディストリ(Mandriva Linux)のバージョンを付けるためのもので、「%mkrel 1」だと「1mdv2009.0」のように展開される。「mdv」の部分は
%define distsuffix [文字列]
で変更することもできる別館にて公開していたものでは「kkr」にしていた)。
パッケージ情報
ライブラリとそれを使用した実行ファイルという形態のパッケージの例として(別のパッケージで再利用できそうなので)、パッケージ情報部分の大まかな形を貼り付ける。Summary: (略) Summary(ja): (略) Name: %{name} Version: %{version} Release: %{release} Group: Text tools License: (略) URL: (略) Source: (略) Patch: (略) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot Requires: %{name}-dictionary %{libmigemo} %package -n %{libmigemo} Summary: %{cmigemo_fullname} library Summary(ja): %{cmigemo_fullname}ライブラリ Group: System/Libraries Provides: libmigemo = %{version}-%{release} %package -n %{libmigemo_devel} Summary: Development files for %{cmigemo_fullname} Summary(ja): %{cmigemo_fullname}の開発用ファイル Group: Development/Other Requires: %{libmigemo} = %{version} Provides: libmigemo-devel = %{version}-%{release}
Mandriva Linuxのパッケージ作成ポリシーによると「Provides」の行*1は必須とのこと。
パッケージグループの名前はWikiの一覧を見るか、環境変数LC_MESSAGESの値を「C」にしてRpmdrakeパッケージマネージャを起動する。*2このパッケージのグループはRedHat系ディストリと互換性がない。RedHat系ディストリ向けのパッケージをMandriva Linuxにインストールすると「Applications」などのグループが新しく作られてその中に入るのもそのため。
説明
上のパッケージ情報と同様、-nの後ろにライブラリなど、分離するパッケージ名を書いて、その説明を個別に記述する。%description %{cmigemo_fullname} is Japanese incremental search tool written in C. This version of %{cmigemo_fullname} is licensed under MIT license. %description -l ja %{cmigemo_fullname}はC言語で書かれた日本語インクリメンタルサーチツールです。 このバージョンの%{cmigemo_fullname}はMITライセンスです。 %description -n %{libmigemo} This package contains the shared library of %{cmigemo_fullname}. %description -n %{libmigemo} -l ja このパッケージは%{cmigemo_fullname}の共有ライブラリを含んでいます。 %description -n %{libmigemo_devel} %{libmigemo_devel} contains header file(migemo.h) and library(libmigemo.so) necessary to develop applications with %{cmigemo_fullname}. %description -n %{libmigemo_devel} -l ja %{libmigemo_devel}は%{cmigemo_fullname}を使用したアプリケーションの開発に必要なヘッダファイル(migemo.h)とライブラリ(libmigemo.so)を含んでいます。
ビルド
%build %configure %make CFLAGS="-O2 -Wall -fPIC %{optflags}" gcc-all
このパッケージのconfigureスクリプトはautoconfなどのツール群によるものではなく、インストール先接頭辞(prefix)を指定することはできない。
make時(GNU/Linuxでは「gcc-all」のターゲットを指定)にはマクロ「optflags」を付けることにした。これはビルド対象のアーキテクチャに最適化する(GCC向けの)オプション群に展開される。
なお、「-O2 -Wall -fPIC」のオプション群はこのパッケージに元々付いていたもの。
ファイル一覧
ここも同様に、-nでパッケージごとに分けてそれぞれの一覧を書くことになる。%files %defattr(-, root, root) %{_bindir}/cmigemo %doc doc/{LICENSE*,README_j.txt*,TODO_j.txt*} %files -n %{libmigemo} %defattr(-, root, root) %{_libdir}/libmigemo.so.* %files -n %{libmigemo_devel} %defattr(-, root, root) %{_includedir}/migemo.h %{_libdir}/libmigemo.so
ドキュメントのファイル群に関しては「%install」の中でLZMA圧縮しておくことにした(本記事にはコードは貼っていない)。Gentooのebuildでは「dodoc」を書けばbzip2圧縮までしてくれていたが、RPM specの「%doc」は圧縮してくれないし、場所も「%files」以下でなければならない。
libmigemo.soはC/Migemoを使用した別のパッケージをビルドする際のリンク時にのみ使用されるシンボリックリンクなので、開発(devel)パッケージに入る。このように細かく分かれているのは、ビルドをしない使い方のユーザにとってディスク領域の節約になる反面、パッケージをビルドする使い方だとやはり不便に感じる。
関連URL: