mockとpackageのgitリポジトリとリビルド

この記事はLinux Advent Calendarの19日目です。

概要

今回はsrpmをダウンロードしてきて何かをするのではなくて、パッケージのgitリポジトリからcloneしてきてビルドするときのメモです。パッケージのビルド方法としてはfedpkgを使うかmockを使うかの2通りがあります。両者の方法を見ていきましょう。

fedpkgの場合

masterブランチとかf29と言ったディストリビューションのバージョンのブランチをそのまま使わずに、ローカルにブランチを作って作業するとしましょう。こんな感じですね。

masami@saga:~/fedora-bash (master=)$ git checkout -b f29 origin/f29
Branch 'f29' set up to track remote branch 'f29' from 'origin'.
Switched to a new branch 'f29'
masami@saga:~/fedora-bash (f29=)$ git checkout -b build-test
Switched to a new branch 'build-test'

この場合、fedpkgで普通にmockbuildをするとエラーになります。これはローカルのブランチがリモートにも有ることを期待しているためです。で、--releaseオプションを使えと言われます。

masami@saga:~/fedora-bash (build-test)$ fedpkg mockbuild
Downloading bash-4.4.tar.gz
######################################################################## 100.0%
Could not execute mockbuild: Unable to find remote branch.  Use --release

--releaseオプションはmockbuildオプションのオプションではなくて、fedpkgのオプションです。ということでこのようにするとresults_bash/というディレクトリが出来て、その下にrpmパッケージが置かれます。

masami@saga:~/fedora-bash (build-test)$ fedpkg --release f29 mockbuild
warning: Macro expanded in comment on line 16: %{version}.tar.gz



warning: Macro expanded in comment on line 16: %{version}.tar.gz

Wrote: /home/masami/fedora-bash/bash-4.4.23-5.fc29.src.rpm
INFO: mock.py version 1.4.13 starting (python version = 3.7.1)...
Start: init plugins
〜略〜

mockの場合

mockを使う場合は一旦srpmを作ってからビルドします。specとpatch諸々が有るディレクトリを指定し、srpmパッケージをresultdirオプションで指定した場所に作ります。

masami@saga:~/fedora-bash (build-test %)$ mock -r /etc/mock/fedora-29-x86_64.cfg --buildsrpm --spec ./bash.spec --sources=. --resultdir=.
INFO: mock.py version 1.4.13 starting (python version = 3.7.1)...
Start: init plugins
INFO: selinux disabled
Finish: init plugins
〜略〜

そしてsrpmファイルをビルドしてrpmパッケージを作ります。

masami@saga:~/fedora-bash (build-test %)$ mock -r /etc/mock/fedora-29-x86_64.cfg --rebuild ./bash-4.4.23-5.fc29.src.rpm
INFO: mock.py version 1.4.13 starting (python version = 3.7.1)...
Start: init plugins
〜略〜

おまけ srpmを展開してgitリポジトリと同じ構造で扱う

rpmコマンドで~/rpmbuildにファイルを展開するのではなくてrpm2cpioとcpioで展開すればgitリポジトリと同じ構造で.specやpatch等を取り出せます。あとはmockの場合の方法でビルドできます。

masami@saga:~/tmp/bash$ rpm2cpio ~/fedora-bash/bash-4.4.23-5.fc29.src.rpm | cpio -iv
bash-2.02-security.patch
bash-2.03-paths.patch
bash-2.03-profile.patch
〜略〜
dot-bash_profile
dot-bashrc
18621 blocks
masami@saga:~/tmp/bash$ ls
./                            bash-3.2-ssh_source_bash.patch     bash-4.3-noecho.patch                 bash-4.4-patch-16.patch  bash-4.4-patch-4.patch                 bash-setlocale.patch
../                           bash-4.0-nobits.patch              bash-4.4-assignment-error.patch       bash-4.4-patch-17.patch  bash-4.4-patch-5.patch                 bash.spec
bash-2.02-security.patch      bash-4.1-broken_pipe.patch         bash-4.4-case-in-command-subst.patch  bash-4.4-patch-18.patch  bash-4.4-patch-6.patch                 bash-tty-tests.patch
bash-2.03-paths.patch         bash-4.1-defer-sigchld-trap.patch  bash-4.4-coverity.patch               bash-4.4-patch-19.patch  bash-4.4-patch-7.patch                 dot-bash_logout
bash-2.03-profile.patch       bash-4.1-examples.patch            bash-4.4-no-loadable-builtins.patch   bash-4.4-patch-1.patch   bash-4.4-patch-8.patch                 dot-bash_profile
bash-2.05a-interpreter.patch  bash-4.2-coverity.patch            bash-4.4-patch-10.patch               bash-4.4-patch-20.patch  bash-4.4-patch-9.patch                 dot-bashrc
bash-2.05b-debuginfo.patch    bash-4.2-manpage_trap.patch        bash-4.4-patch-11.patch               bash-4.4-patch-21.patch  bash-4.4.tar.gz
bash-2.05b-manso.patch        bash-4.2-rc2-logout.patch          bash-4.4-patch-12.patch               bash-4.4-patch-22.patch  bash-4.4-unset-nonblock-stdin.patch
bash-2.05b-pgrp_sync.patch    bash-4.2-size_type.patch           bash-4.4-patch-13.patch               bash-4.4-patch-23.patch  bash-4.5-test-modification-time.patch
bash-2.05b-xcc.patch          bash-4.3-man-ulimit.patch          bash-4.4-patch-14.patch               bash-4.4-patch-2.patch   bash-infotags.patch
bash-3.2-audit.patch          bash-4.3-memleak-lc_all.patch      bash-4.4-patch-15.patch               bash-4.4-patch-3.patch   bash-requires.patch

まとめ

mockやfedpkgを使う利点は~/rpmbuildを使わないのでファイルがゴチャゴチャにならずにすみます😃