Messages in cipher reflected in the looking glass

http://blogs.sun.com/thaniwa/date/20060620 2006年 6月 20日 火曜日

(JA) Solaris pkg (Part 3) : build pkg using rpm

第3回目です。 話はどんどん脱線していきます。^-^;
手前味噌な感じで恐縮ですが、mkpkg コマンドで Solaris用pkgの作成が多少は簡単になりました。
ただ、Solaris用pkgも伝統的な部分もあるためか、 rpmのようなものと比べると「パッケージのパッチなどの情報もまとめられないし…。」 とか色々あったりすると思います。
それじゃ、rpm使えば良いじゃんっ! という結論に達するわけです。^-^;

ということで、最後の回は rpm も活用しようというお話です。

ターゲット環境は x86 ということにします。 大した理由は無いですが、 opensolaris.org の BrandZ (x86用) Community で提供されている rpmパッケージを利用することで、rpmコマンドが簡単に用意できるからです。^-^;

http://www.opensolaris.org/os/community/brandz/downloads/

Solaris 10 で利用できるrpmのパッケージは上記からダウンロードできます。
インストール方法は下記の通りです。

# bunzip2 SFWrpm.pkg.bz2
# pkgadd -d ./SFWrpm.pkg


これで、rpmをSolaris環境で利用できるようになります。
rpmコマンドが使えますので、rpm -ihv などの rpm コマンドを利用してバイナリパッケージの管理をすることも可能ですが、 rpmで話が終わると本末転倒なので、ここでは解説しません。

rpm用のパッケージ作成用の情報は SPEC ファイルと呼ばれるファイルに記述します。 詳細な記述方法は本家に任せますが、この SPEC ファイルの %install の部分に、 第2回目で紹介した mkpkg によるパッケージ作成方法の記述を行います。
下記は私が作成した rdesktop 1.4.1 用の SPEC ファイルです。 赤字の部分が mkpkg による Solaris用pkgの作成部分に該当します。

記述内容は、

  1. アプリケーションの(作業用の)インストールディレクトリ( $RPM_BUILD_ROOT )に移動
  2. mkpkg コマンドでパッケージを作成
  3. 作成したパッケージを rpm 作業ディレクトリの下の DIST というディレクトリ( %{_topdir}/DIST )に移動する。
  4. $RPM_BUILD_ROOT に作成されているパッケージディレクトリ( RDESKTOP ) を削除。
  5. pkginfo, prototype ファイルを削除

という感じです。

Summary: rdesktop
Name: rdesktop
Version: 1.4.1
Release: 1
License: GPL
Group: Applications/Communications
Source0: http://prdownloads.sourceforge.net/rdesktop/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
Provides: /bin/sh

%description
rdesktop is an open source client for Windows NT Terminal Server and Windows 2000/2003 Terminal Services,
capable of natively speaking Remote Desktop Protocol (RDP) in order to present the user\'s NT desktop.
Unlike Citrix ICA, no server extensions are required.

%prep
%setup -q -n %{name}-%{version}

%build
./configure --with-openssl=/usr/sfw --host=i386-pc-solaris2.10 --build=i386-pc-solaris2.10 \
--target=i386-pc-solaris2.10-gnu --program-prefix= --prefix=/opt/rpm --exec-prefix=/opt/rpm \
--bindir=/opt/rpm/bin --sbindir=/opt/rpm/sbin --sysconfdir=/opt/rpm/etc \
--datadir=/opt/rpm/share --includedir=/opt/rpm/include --libdir=/opt/rpm/lib \
--libexecdir=/opt/rpm/libexec --localstatedir=/opt/rpm/var --sharedstatedir=/opt/rpm/com \
--mandir=/opt/rpm/man --infodir=/opt/rpm/info
gmake

%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/opt/rpm/bin
/usr/ucb/install -c rdesktop $RPM_BUILD_ROOT/opt/rpm/bin
strip $RPM_BUILD_ROOT/opt/rpm/bin/rdesktop
chmod 755 $RPM_BUILD_ROOT/opt/rpm/bin/rdesktop
mkdir -p $RPM_BUILD_ROOT/opt/rpm/share/rdesktop/keymaps/
cp keymaps/?? keymaps/??-?? $RPM_BUILD_ROOT/opt/rpm/share/rdesktop/keymaps/
cp keymaps/common $RPM_BUILD_ROOT/opt/rpm/share/rdesktop/keymaps/
cp keymaps/modifiers $RPM_BUILD_ROOT/opt/rpm/share/rdesktop/keymaps/
chmod 644 $RPM_BUILD_ROOT/opt/rpm/share/rdesktop/keymaps/*
mkdir -p $RPM_BUILD_ROOT/opt/rpm/share/man/man1
cp doc/rdesktop.1 $RPM_BUILD_ROOT/opt/rpm/share/man/man1
chmod 644 $RPM_BUILD_ROOT/opt/rpm/share/man/man1/rdesktop.1


# build solaris pkg
cd $RPM_BUILD_ROOT
mkpkg %{name}-%{version}-pkg -g -p RDESKTOP -n %{name} -v %{version} -a i86pc -b \"/\"
mv %{name}-%{version}-pkg.gz %{_topdir}/DIST/.
rm -fr RDESKTOP
rm pkginfo prototype


%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

# never use %post and %postun because rpm -ihv and rpm -e command cannot run correctly on Solaris 10
#%post
#%postun

%files
%defattr(-,root,root)
/opt/rpm/bin/rdesktop
/opt/rpm/share/man/man1/rdesktop.1
/opt/rpm/share/rdesktop

%changelog


これで、rpmbuild コマンドを使ってバイナリの作成を行えば、Solaris用pkgの作成ができるわけですが、-bb や -ba オプションを利用しません。 してもよいのですが、不要なrpmファイルまで作成されてしまいます。
Solaris用pkgの作成には、rpmbuild でのパッケージ作成の %install まで行う -bi オプションを利用します。

# rpmbuild -bi rdesktop_solpkg.spec

また、-bs オプションを利用することで、ソースコードおよびパッチなどをソースパッケージである src.rpm (srpm) にまとめることも出来ますので、コンパイル方法などの情報を HTML などを利用してメモするのではなく、srpm として保存しておくという方法も使えるようになります。

便利なのかどうかは人により違うかもしれませんが、Linux用の src.rpm も参考にできる可能性もありますし、フィットする方もいるのではないかとちょこっと思って居たりします。
こういう変わった応用したって良いですよね? ^-^;

投稿されたコメント:

コメント
コメントは無効になっています。