滅多に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