rpmパッケージを1から作る(最後はdpkgでインストール編)

はじめに

 本記事は、rpmパッケージを1から作り、実際にシステムへインストールしてみたものをまとめたものである。

(※インストール時にlibc.so.6 が必要だとエラーが出て、alienコマンドでdebパッケージに変換して、インストールした。)

 今回作成したものをここに置いておきます。
https://github.com/tomohikoseven/rpmbuild

手順

  1. 目指す環境
  2. 環境の準備
  3. ファイルの準備
  4. specファイルの作成
  5. パッケージ作成
  6. パッケージのインストール

目指す環境

 下記のような構成を目指し、手順を進める。

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
#include

int
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

 i386 ディレクトリは、環境のアーキテクチャi386だからである。

パッケージのインストール

 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でインストールできなかったことが悔やまれる。