滅多にrpmをビルドする機会がないので忘れないようにやり方をメモしておきます。

セットアップ

まず必要なパッケージをインストールから。

# yum install -y gcc rpm-build rpm-devel rpmlint make coreutils diffutils patch rpmdevtools

ビルドするユーザの作成

rootでビルドすると失敗した時に悲惨なことになるので、専用のユーザを作っておきます。

# useradd builduser

フォルダ構成を作成

rpmビルドに必要なディレクトリ構造は決まっています。 rpmdev-setuptreeコマンドで$HOME/rpmbuildの下にディレクトリを掘ります。

$ rpmdev-setuptree
$ cd $HOME
$ tree
.
└── rpmbuild
    ├── BUILD
    ├── RPMS
    ├── SOURCES
    ├── SPECS
    └── SRPMS

SPECファイルの作成

rpmをどのような手順で作成するか、いわば設計図をSPECファイルに記述します。
一からスクラッチで作っても良いですが、テンプレートを作成するコマンドがあるので実行します。

$ rpmdev-newspec hello
Skeleton specfile (minimal) has been created to "hello.spec".
$ cat hello.spec
Name:           hello
Version:        1
Release:        1%{?dist}
Summary:        hello script

License:        MIT

%description
This is test

%prep
%setup -q


%install
mkdir -p %{buildroot}%{_bindir}
install -m 0755 hello.sh %{buildroot}%{_bindir}/hello.sh


%files
%{_bindir}/hello.sh

%{xxxx}のMacro部分はrpm --evalで確認できます。

$ rpm --eval %{_bindir}
/usr/bin
$ rpm --eval %{_libexecdir}
/usr/libexec
$ rpm --eval %{buildroot}
/home/builduser/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
$ rpm --eval %{_tmppath}
/var/tmp
$ rpm --eval %{dist}
.el6

$HOME/.rpmmacrosでもいくつか定義されていました。

cat .rpmmacros
%_topdir      %(echo $HOME)/rpmbuild
%_smp_mflags  -j3
%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot

ビルドする

rpmbuildコマンドの引数にSPCファイルを指定してrpmファイルを作成します。
実行すると/var/tmpにシェルスクリプトが吐かれて実行されるようです。

$ rpmbuild -bb hello.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.zRKoW5
+ umask 022
+ cd /home/rpm/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.rznAFW
+ umask 022
+ cd /home/rpm/rpmbuild/BUILD
+ '[' /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64 '!=' / ']'
+ rm -rf /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64
++ dirname /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64
+ mkdir -p /home/rpm/rpmbuild/BUILDROOT
+ mkdir /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64
+ LANG=C
+ export LANG
+ unset DISPLAY
+ mkdir -p /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64/usr/bin
+ install -m 0755 hello.sh /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64/usr/bin/hello.sh
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: hello-1-1.el6.x86_64
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/sh
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64
Wrote: /home/rpm/rpmbuild/RPMS/x86_64/hello-1-1.el6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.ChRjSE
+ umask 022
+ cd /home/rpm/rpmbuild/BUILD
+ /bin/rm -rf /home/rpm/rpmbuild/BUILDROOT/hello-1-1.el6.x86_64
+ exit 0