dwmをSRPMからコンパイルして設定変更

最近の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

感想

  • 最終的にビルドはされているが途中で結構警告が出ているのが気になる所。
  • あとzshでdnfコマンドとrpmコマンドで補完が効かない部分がいくつかあったので修正したい。
  • dwm-user-6.1-6.fc27.x86_64.rpmは再コンパイルを支援するライブラリらしいが、依存パッケージが足りずインストールできなかったため保留中。できればパッケージは増やしたくないので自前対応のまま行く可能性もあり。
  • ビルドに使うmockというツールについてだが、全くといっていいほど日本語の情報がない。というか英語の情報すら少ない?ようで、参考サイトに書いた分くらいしか見つからなかった。