よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

rpmbuildについて

数日前に、yumについて真剣に考えてみた。

unknownengineer.hatenablog.com

ソースをrpm2cpioでバラして、specファイルの中身を閲覧してドヤ顔していた所まで。

specファイルの中身を見るだけならこれでも良いが、ビルドするなら、ちゃんと環境作ったほうが良いので、まずは専用の環境を用意する事にした。

build環境の作成

#useradd rpmbuilder
#su - rpmbuilder
$mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$ls rpmbuild/
$rpmbuild --showrc |grep topdir
$echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros

これでビルド環境出来ました。尚、rpmdev-setuptree使えば自動で作ってくれます。
qiita.com

rpmbuildを実行

では前回の続きでEPELのソースを取得して展開していきます。

$wget https://dl.fedoraproject.org/pub/epel/6/SRPMS/epel-release-6-8.src.rpm
rpm -ivh epel-release-6-8.src.rpm

上記を実行すると、先ほど作成したディレクトリにソースとspecが展開されます。

[rpmbuilder@iw-tprj-monitor1 SPECS]$ ls ../*
../BUILD:

../BUILDROOT:

../RPMS:

../SOURCES:
GPL  RPM-GPG-KEY-EPEL-6  epel-testing.repo  epel.repo  macros.ghc-srpm

../SPECS:
epel-release.spec

../SRPMS:

ではソースを展開していきます。rpmbuildのオプションで、specファイルのどこまで処理を実行するのか指定出来ます。まずは%prepまで実行するオプションを試してみます。

$ rpmbuild -bp epel-release.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.i5bh32
+ umask 022
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ rm -rf epel-release-6
+ /bin/mkdir -p epel-release-6
+ cd epel-release-6
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ install -pm 644 /home/rpmbuilder/rpmbuild/SOURCES/RPM-GPG-KEY-EPEL-6 .
+ install -pm 644 /home/rpmbuilder/rpmbuild/SOURCES/GPL .
+ exit 0

前回覗いてみた、specファイルの%prepの記述までと見比べてみる。おぉ、確かにその通り動いている(当たり前)。rpmbuilのオプションは以下サイトを参考にしています。なおrpmbuildの-bc,-biがmake,make installと等価である事を今日知りました(震え声

kazmax.zpp.jp

(特にやりたいことは無いんだけど)とりあえずオレオレrpmパッケージを作ります。rpm でEPEL突っ込んだ時に、いつもenabled=1になってて手動で変えていたので、以下SOURCEを変更してからビルドします。

vi ../SOURCES/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1→0に変更
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

この状態でビルドしてみます。

$ rpmbuild -ba epel-release.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Krc0cd
+ umask 022
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ rm -rf epel-release-6
+ /bin/mkdir -p epel-release-6
+ cd epel-release-6
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ install -pm 644 /home/rpmbuilder/rpmbuild/SOURCES/RPM-GPG-KEY-EPEL-6 .
+ install -pm 644 /home/rpmbuilder/rpmbuild/SOURCES/GPL .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.D7K2Iq
+ umask 022
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ cd epel-release-6
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.oDdZfE
+ umask 022
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ '[' /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64 '!=' / ']'
+ rm -rf /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64
++ dirname /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64
+ mkdir -p /home/rpmbuilder/rpmbuild/BUILDROOT
+ mkdir /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64
+ cd epel-release-6
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64
+ install -Dpm 644 /home/rpmbuilder/rpmbuild/SOURCES/RPM-GPG-KEY-EPEL-6 /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
+ install -dm 755 /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/etc/yum.repos.d
+ install -pm 644 /home/rpmbuilder/rpmbuild/SOURCES/epel.repo /home/rpmbuilder/rpmbuild/SOURCES/epel-testing.repo /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/etc/yum.repos.d
+ install -Dpm 644 /home/rpmbuilder/rpmbuild/SOURCES/macros.ghc-srpm /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/etc/rpm/macros.ghc-srpm
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/rpmbuilder/rpmbuild/BUILD/epel-release-6
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /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/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: epel-release-6-8.noarch
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.E5TIZR
+ umask 022
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ cd epel-release-6
+ DOCDIR=/home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/usr/share/doc/epel-release-6
+ export DOCDIR
+ rm -rf /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/usr/share/doc/epel-release-6
+ /bin/mkdir -p /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/usr/share/doc/epel-release-6
+ cp -pr GPL /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64/usr/share/doc/epel-release-6
+ exit 0
Provides: config(epel-release) = 6-8
Requires(interp): /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(post): /bin/sh
Requires(postun): /bin/sh
Conflicts: fedora-release
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64
Wrote: /home/rpmbuilder/rpmbuild/SRPMS/epel-release-6-8.src.rpm
Wrote: /home/rpmbuilder/rpmbuild/RPMS/noarch/epel-release-6-8.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.w9WGsx
+ umask 022
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ cd epel-release-6
+ rm -rf /home/rpmbuilder/rpmbuild/BUILDROOT/epel-release-6-8.x86_64
+ exit 0

RPMS/noarch以下にepel-release-6-8.noarch.rpmが作成されました。これでepelをインストールします。yumでそのまま突っ込んだ時と違って、ちゃんとenabled=0でした。めでたし!