この記事は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を使わないのでファイルがゴチャゴチャにならずにすみます😃