rpmパッケージを1から作る(最後はdpkgでインストール編)
はじめに
本記事は、rpmパッケージを1から作り、実際にシステムへインストールしてみたものをまとめたものである。
(※インストール時にlibc.so.6 が必要だとエラーが出て、alienコマンドでdebパッケージに変換して、インストールした。)
今回作成したものをここに置いておきます。
https://github.com/tomohikoseven/rpmbuild
手順
- 目指す環境
- 環境の準備
- ファイルの準備
- specファイルの作成
- パッケージ作成
- パッケージのインストール
目指す環境
下記のような構成を目指し、手順を進める。
rpmbuild ├── BUILD ├── RPMS ├── SOURCES │ └── fib-1.0.0.tar.gz ├── SPECS │ └── fib.spec └── SRPMS
環境の準備
下記コマンドで、環境を準備する。
$ mkdir -p ~/work/rpmbuild $ cd ~/work/rpmbuild $ mkdir {BUILD,RPMS,SOURCES,SPECS,SRPMS}
また、ホームディレクトリに.rpmmacrosを作成し、rpmパッケージを作成するためのディレクトリのトップディレクトリパスを記述する必要がある。システムへrpmパッケージをどこで作成するのか教えるためである。
andre@andre-VirtualBox:~/work/rpmbuild/SPECS$ cat ~/.rpmmacros %_topdir /home/andre/work/rpmbuild
.rpmmacrosを作成するためのコマンドは以下。
cd ~/work/rpmbuild echo "%_topdir `pwd`" > ~/.rpmmacros
ファイルの準備
今回は、フィボナッチ数を出力するソース(fib.c)を使う。
mkdir -p ~/work/rpmbuild/tmpbuild/fib-1.0.0 cd ~/work/rpmbuild/tmpbuild/fib-1.0.0
ファイルは2つ作る。fib.c と Makefileである。
andre@andre-VirtualBox:~/work/rpmbuild/tmpbuild/fib-1.0.0$ cat fib.c #includeint fib( int n ) { if( n < 0 ){ return -1; } if( n == 0 ){ return 1; } if( n == 1 ){ return 1; } if( n > 1 ){ return fib( n -1 ) + fib( n-2 ); } } int main(void) { int n = 5; printf( "fib(%d)=%d\n", n, fib( n ) ); return 0; }
下記Makefileの環境変数INSTALLDIRは、バイナリ(fib)の実際のインストール先である。
環境変数DESTDIRは、仮インストール先を示す。後ほど登場する。
andre@andre-VirtualBox:~/work/rpmbuild/tmpbuild/fib-1.0.0$ cat Makefile INSTALLDIR=/home/andre/local CC = gcc all:fib.o $(CC) -o fib fib.o c.o: $(CC) -c $< install: mkdir -p $(DESTDIR)/$(INSTALLDIR)/usr/bin cp fib $(DESTDIR)/$(INSTALLDIR)/usr/bin chmod 755 $(DESTDIR)/$(INSTALLDIR)/usr/bin/fib clean: rm -f fib.o fib
SOURCESディレクトリ配下へ置く、tarballを作成する。
andre@andre-VirtualBox:~/work/rpmbuild/tmpbuild$ tar zcvf fib-1.0.0.tar.gz fib-1.0.0/ fib-1.0.0/ fib-1.0.0/fib.c fib-1.0.0/Makefile andre@andre-VirtualBox:~/work/rpmbuild/tmpbuild$ cp fib-1.0.0.tar.gz ../SOURCES
specファイルを作成
specファイル内については、下記に示す。%xxx は各セクションを示している。各々の説明については、他サイトで検索。
andre@andre-VirtualBox:~/work/rpmbuild/SPECS$ cat fib.spec Name: fib Summary: fib package Version: 1.0.0 Release: 1 #Group: Applications/Text License: GPL Source: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-root %description fib package %prep %setup -q %build make %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %files /home/andre/local/usr/bin/fib
%install セクションの[ make install 〜 ] は、configureを使用してビルドまで行う場合[ %makeinstall ]だと思うが、今回はないので、makeコマンドの直接記述である。
また、%install セクションは、仮インストールを行う。そのため、先に述べた 環境変数 DESTDIR は、makeコマンドで指定することで、本来のインストール先へインストールを行わないようにしている。ビルドに失敗したとき、他に影響を与えないため。
では、インストールはどこで行なっているのかというと、%file セクションである。
まとめると、Makefileのinstallターゲットで、仮インストールを行い、specファイルの%file セクションで、本インストールを行う。
パッケージの作成
spec ファイルがあるディレクトリ( SPEC )へ移動し、パッケージを作成する。
rpmbuild -ba fib.spec
上記コマンドが成功すると、以下のツリーのようにrpmパッケージができる。
RPMS └── i386 └── fib-1.0.0-1.i386.rpm
パッケージのインストール
rpmパッケージをインストールしようとすると、下記のようなエラーが出る。
andre@andre-VirtualBox:~/work/rpmbuild/RPMS/i386$ rpm -ivh fib-1.0.0-1.i386.rpm rpm: RPM should not be used directly install RPM packages, use Alien instead! rpm: However assuming you know what you are doing... エラー: 依存性の欠如: libc.so.6 は fib-1.0.0-1.i386 に必要とされています libc.so.6(GLIBC_2.0) は fib-1.0.0-1.i386 に必要とされています rtld(GNU_HASH) は fib-1.0.0-1.i386 に必要とされています
libc.so.6 はあるが、どうにも解決ができなかったので、debパッケージへ変換して入れます。
andre@andre-VirtualBox:~/work/rpmbuild/RPMS/i386$ alien --to-deb fib-1.0.0-1.i386.rpm andre@andre-VirtualBox:~/work/rpmbuild/RPMS/i386$ ls fib-1.0.0-1.i386.rpm fib_1.0.0-2_i386.deb andre@andre-VirtualBox:~/work/rpmbuild/RPMS/i386$ dpkg -i fib_1.0.0-2_i386.deb dpkg: error: 要求した操作はスーパーユーザの権限が必要です andre@andre-VirtualBox:~/work/rpmbuild/RPMS/i386$ sudo dpkg -i fib_1.0.0-2_i386.deb [sudo] password for andre: (データベースを読み込んでいます ... 現在 168170 個のファイルとディレクトリがインストールされています。) fib 1.0.0-2 を (fib_1.0.0-2_i386.deb で) 置換するための準備をしています ... fib を展開し、置換しています... fib (1.0.0-2) を設定しています ... andre@andre-VirtualBox:~/work/rpmbuild/RPMS/i386$ ll ~/local/usr/bin/fib -rwxr-xr-x 1 root root 7114 2012-09-02 10:28 /home/andre/local/usr/bin/fib*
終わりに
rpmでインストールできなかったことが悔やまれる。