最近のFedoraというかRHEL系では、SRPM(Source RPM)のコンパイルにmockというビルドコマンドを使用する。
chrootを使って綺麗な環境でビルドを実行してくれるが、「Linux丸ごとの環境をOSバージョンが上がる毎に作る」らしいので、ディスク容量に余裕がある場所へ置いた方が良いと思われる。
自PCのファイル置き場
/home/mockbuild ├── dwm-6.1-6.fc27.src.rpm HOME直下にオリジナルのSRPM └── rpmbuild rpmbuild以下にSRPMでインストールしたソース ├── BUILD ├── BUILDROOT ├── RPMS ├── SOURCES ├── SPECS └── SRPMS /var/lib/mock mockコマンドが作る環境別ビルド結果 └── fedora-27-x86_64 ├── result mockコマンドで作られたバイナリRPM └── root mockコマンドが作るビルド用環境
インストール
1. mockコマンドが使用するmockbuildユーザーを作成してログインする。
以降mockbuildユーザーで実行。
$ sudo useradd -s /bin/zsh mockbuild
$ sudo passwd mockbuild
$ su - mockbuild
2. SRPMをダウンロードしてインストールする。
$ cd /home/mockbuild $ dnf download --source dwm dwm-6.1-6.fc27.src.rpm 276 kB/s | 42 kB 00:00 $ rpm -ivh dwm-6.1-6.fc27.src.rpm 更新中 / インストール中... 1:dwm-6.1-6.fc27 ################################# [100%]
3. tarになっているソースを解凍後、makeコマンドでヘッダファイルconfig.hを作成する。
$ cd /home/mockbuild/rpmbuild/SOURCES $ tar xf dwm-6.1.tar.gz $ cd dwm-6.1/ $ make config.h $ ls config.h config.h
4. ここでソースを変更するが、今回はビルドテストがメインなのでとりあえず標準ターミナルのみ変更
$ cd /home/mockbuild/rpmbuild/SOURCES/dwm-6.1 $ diff config.def.h config.h 58c58 < static const char *termcmd[] = { "st", NULL }; --- > static const char *termcmd[] = { "terminator", NULL };
5. 編集したソースコードをtarに戻した後、rpmbuildでSRPMにする。
$ cd /home/mockbuild/rpmbuild/SOURCES/ $ tar czvf dwm-6.1.tar.gz dwm-6.1/ $ rpmbuild -bs /home/mockbuild/rpmbuild/SPECS/dwm.spec
6. /etc/mock/にビルド対象システムごとの設定ファイルが並んでいるので、default.cfgを作成対象へのリンクにする。
(mockコマンド実行時に-rオプションで個別指定することも可能)
$ su - $ cd /etc/mock $ rm default.cfg $ sudo ln -s fedora-27-x86_64.cfg default.cfg $ ll default.cfg lrwxrwxrwx. 1 root root 20 Dec 10 21:05 default.cfg -> fedora-27-x86_64.cfg
※作成しない状態でmockコマンドを実行すると下のようなエラーが出る
ERROR: Could not find required config file: /etc/mock/default.cfg
7. SRPMができたらmockコマンドによるビルドを実行する。
dnfにより/var/lib/mock/rootの下にLinux環境が構築される。
$ mock --rebuild /home/mockbuild/rpmbuild/SRPMS/dwm-6.1-6.fc27.src.rpm
8. 最終的にエラーなく終了したらビルド完了。
書き込み完了: /builddir/build/RPMS/dwm-6.1-6.fc27.x86_64.rpm 書き込み完了: /builddir/build/RPMS/dwm-user-6.1-6.fc27.x86_64.rpm 書き込み完了: /builddir/build/RPMS/dwm-debugsource-6.1-6.fc27.x86_64.rpm 書き込み完了: /builddir/build/RPMS/dwm-debuginfo-6.1-6.fc27.x86_64.rpm 実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.TfhmF3 + umask 022 + cd /builddir/build/BUILD + cd dwm-6.1 + /usr/bin/rm -rf /builddir/build/BUILDROOT/dwm-6.1-6.fc27.x86_64 + exit 0 Finish: rpmbuild dwm-6.1-6.fc27.src.rpm Finish: build phase for dwm-6.1-6.fc27.src.rpm INFO: Done(/home/mockbuild/rpmbuild/SRPMS/dwm-6.1-6.fc27.src.rpm) Config(default) 5 minutes 40 seconds INFO: Results and/or logs in: /var/lib/mock/fedora-27-x86_64/result Finish: run
9. root権限を持つユーザーに戻って、作られたrpmをインストールする。
その際、バージョン番号が変わってないと"-i"が効かないので"--reinstall"を使う。
$ cd /var/lib/mock/fedora-27-x86_64/result $ ls *.rpm dwm-6.1-6.fc27.src.rpm dwm-6.1-6.fc27.x86_64.rpm dwm-debuginfo-6.1-6.fc27.x86_64.rpm dwm-debugsource-6.1-6.fc27.x86_64.rpm dwm-user-6.1-6.fc27.x86_64.rpm $ sudo dnf reinstall dwm-6.1-6.fc27.x86_64.rpm Last metadata expiration check: 0:17:41 ago on Thu Dec 14 23:44:56 2017. Dependencies resolved. ============================================================================================== Package Arch Version Repository Size ============================================================================================== Reinstalling: dwm x86_64 6.1-6.fc27 @commandline 40 k Transaction Summary ============================================================================================== Total size: 40 k Is this ok [y/N]: y Downloading Packages: Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Reinstalling : dwm-6.1-6.fc27.x86_64 1/2 Erasing : dwm-6.1-6.fc27.x86_64 2/2 Running scriptlet: dwm-6.1-6.fc27.x86_64 2/2 Running as unit: run-r54e7c3a61a1645949b5bf54434e1e68b.service Running as unit: run-rc7e93a98a31949f4b5551a3f4ba83920.service Verifying : dwm-6.1-6.fc27.x86_64 1/2 Verifying : dwm-6.1-6.fc27.x86_64 2/2 Reinstalled: dwm.x86_64 6.1-6.fc27 Complete!
※2017/12/15修正:rpmコマンドを直接使っていたが、dnfでも同様の作業が可能なことが分かったためdnfを使うよう変更。
以上
補遺
- 設定内容については参考サイトのArchLinuxのサイトか公式サイトを参照。
- 設定とは少し違うが、公式サイトにはパッチが多数公開されている。システムトレイの追加や透過率の設定など、他で言うプラグインに近い扱いの機能をカバーしている模様。
- SRPMのコンパイルについて、昔は/usr/src/redhat/の下で実行していたようだが、mockパッケージが導入されてから今の形式になったと思われる。現行はもう/usr/src/redhat/自体がない。
- findで適当に探した結果、dnfからそのままインストールしたRPMはこのあたりにあると思われる。
/var/cache/PackageKit ├── groups.sqlite グループとか一覧? ├── hawkey リポジトリごとの何か ├── metadata │ ├── updates リポジトリ毎のRPMや鍵 │ ├── fedora : │ └── : └── 24 ~ 27 バージョンごとのインストール履歴 ├── hawkey : └── metadata