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

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

C/MigemoのMandriva Linux向けRPMパッケージを公開/本体の.specファイルに関するメモ

別館の配布ページにてMandriva Linux 2009.0向けのC/Migemoパッケージの公開を開始した。
以下は本体とライブラリ部分の.specファイルに関する作成上のメモだが、全ての部分についてを扱っているわけではない。
(2014/10/4)配布ページは削除済み。

  1. マクロ定義
  2. パッケージ情報
  3. 説明
  4. ビルド
  5. ファイル一覧

マクロ定義

「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」にした。

mklibnameマクロの展開例
マクロとオプション、引数x86_64での展開i586での展開
%mklibname migemo_ 1lib64migemo_1libmigemo_1
%mklibname -d migemolib64migemo-devellibmigemo-devel
%mklibname -d migemo_ 1lib64migemo_1-devellibmigemo_1-devel
開発パッケージの場合は後ろに「-devel」を付ける代わりに-dというオプションを付ける。
配布パッケージのマクロ名を「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圧縮しておくことにした(本記事にはコードは貼っていない)。Gentooebuildでは「dodoc」を書けばbzip2圧縮までしてくれていたが、RPM specの「%doc」は圧縮してくれないし、場所も「%files」以下でなければならない。
libmigemo.soはC/Migemoを使用した別のパッケージをビルドする際のリンク時にのみ使用されるシンボリックリンクなので、開発(devel)パッケージに入る。このように細かく分かれているのは、ビルドをしない使い方のユーザにとってディスク領域の節約になる反面、パッケージをビルドする使い方だとやはり不便に感じる。

関連URL:

*1:「lib[名前]-devel」の名前での登録

*2:「アプリケーションの実行」ダイアログでは「env LC_MESSAGES=C rpmdrake」をコピペして実行する