RPM パッケージの作り方

# 概要
RPM パッケージの作成方法についてまとめます。

# 手順
### 環境構築
```
sudo yum install -y rpmdevtools yum-utils
rpmdev-setuptree
```
以下のように、rpm パッケージを作成する上で必要な環境が整います（便利！）

```
[vagrant@localhost sample-rpm-pkg]$ ls -l ~/rpmbuild/
insgesamt 0
drwxrwxr-x 2 vagrant vagrant 6 23. Feb 14:08 BUILD
drwxrwxr-x 2 vagrant vagrant 6 23. Feb 14:08 RPMS
drwxrwxr-x 2 vagrant vagrant 6 23. Feb 14:08 SOURCES
drwxrwxr-x 2 vagrant vagrant 6 23. Feb 14:08 SPECS
drwxrwxr-x 2 vagrant vagrant 6 23. Feb 14:08 SRPMS
```

### ディレクトリ構成
今回は次のようなディレクトリ構成としました。

```
[vagrant@localhost vagrant]$ tree sample-rpm-pkg/
sample-rpm-pkg/
|-- Makefile
|-- bin
|   `-- sample-rpm-pkg.sh
`-- sample-rpm-pkg.spec
```

以下に説明を加えます。

#### bin/sample-rpm-pkg.sh
rpm パッケージに含めるファイル。
今回はrpm パッケージインストール時に、このshell ファイルがインストールされるように作成します。

```
[vagrant@localhost sample-rpm-pkg]$ cat bin/sample-rpm-pkg.sh
#!/bin/sh

echo "sample-rpm-pkg"
```

#### spec ファイル
rpm パッケージを作る上での設定を記載するファイルとなります。

```
[vagrant@localhost sample-rpm-pkg]$ cat sample-rpm-pkg.spec
Name:       sample-rpm-pkg
Version:    1%{?dist}
Release:    1
Summary:    Sample RPM package
License:    FIXME

BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot

%description
Sample Rpm Package

%prep
rm -rf $RPM_BUILD_ROOT

%build

%install
mkdir -p %{buildroot}/usr/bin/
install -m 755 /usr/bin/sample-rpm-pkg.sh %{buildroot}/usr/bin/sample-rpm-pkg.sh

%files
/usr/bin/sample-rpm-pkg.sh

%changelog
# let skip this for now
```
それぞれの意味については、以下に詳しく書かれています。
https://vinelinux.org/docs/vine6/making-rpm/make-spec.html

簡単にやっていることをまとめると、
- %install で必要なファイルを%{buildroot} 以下に全て詰め込む
- %files で、rpm パッケージとして含むファイルを指定

## Makefile

こちらは必須ではないですが、make タスクとしてまとめておくと便利なので作成しました。

```
[vagrant@localhost sample-rpm-pkg]$ cat Makefile
setup:
	sudo yum install -y rpmdevtools yum-utils
	rpmdev-setuptree

install:
	sudo install -m 755 bin/sample-rpm-pkg.sh /usr/bin/sample-rpm-pkg.sh

package:
	rpmbuild -bb *.spec --define "dist .el7"
```

## package を作成
```
[vagrant@localhost sample-rpm-pkg]$ make install && make package
sudo install -m 755 bin/sample-rpm-pkg.sh /usr/bin/sample-rpm-pkg.sh
rpmbuild -bb *.spec --define "dist .el7"
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.mYmJqo
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64
+ exit 0
実行中(%build): /bin/sh -e /var/tmp/rpm-tmp.YtZZLS
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ exit 0
実行中(%install): /bin/sh -e /var/tmp/rpm-tmp.wpX99m
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ '[' /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64 '!=' / ']'
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64
++ dirname /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64
+ mkdir -p /home/vagrant/rpmbuild/BUILDROOT
+ mkdir /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64
+ mkdir -p /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64/usr/bin/
+ install -m 755 /usr/bin/sample-rpm-pkg.sh /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64/usr/bin/sample-rpm-pkg.sh
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /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-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
ファイルの処理中: sample-rpm-pkg-1.el7-1.x86_64
Provides: sample-rpm-pkg = 1.el7-1 sample-rpm-pkg(x86-64) = 1.el7-1
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/sh
パッケージに含まれないファイルの検査中: /usr/lib/rpm/check-files /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64
書き込み完了: /home/vagrant/rpmbuild/RPMS/x86_64/sample-rpm-pkg-1.el7-1.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.xFVE1m
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ /usr/bin/rm -rf /home/vagrant/rpmbuild/BUILDROOT/sample-rpm-pkg-1.el7-1.x86_64
+ exit 0
```

これで、以下にrpm パッケージが作成できました。

```
[vagrant@localhost sample-rpm-pkg]$ clear
[vagrant@localhost sample-rpm-pkg]$ ls /home/vagrant/rpmbuild/RPMS/x86_64/sample-rpm-pkg-1.el7-1.x86_64.rpm
/home/vagrant/rpmbuild/RPMS/x86_64/sample-rpm-pkg-1.el7-1.x86_64.rpm
```