3 非モジュラ・ソースRPMパッケージのビルド

この章では、非モジュラ・ソースRPMパッケージのビルド方法について説明します。次の2つの方法があります。1つ目の方法は、より直接的であり、rpmbuildユーティリティを直接使用します。2つ目の方法では、mockユーティリティを設定し、このツールを使用してビルドを処理するようにシステムを構成する必要があります。mockユーティリティの使用によるパッケージのビルドにはいくつかの利点があります。様々なパッケージを複数回または定期的にビルドする予定の場合は、このツールの使用を検討してください。

rpmbuildの直接使用

最も簡単なビルド方法は、rpmbuild --rebuildコマンドの使用による、ソースRPMパッケージからのバイナリRPMパッケージの直接ビルドです。このツールは、ソースRPMパッケージを取得し、それを~/rpmbuild/内の標準階層に展開します。このツールは、~/rpmbuild/SPECSにある関連するSPECファイル内で指定されているビルド依存関係がすべて満たされていることを確認します。~/rpmbuild/SOURCES内のソースTAR書庫は、ビルド・ディレクトリに展開され、それぞれが、バイナリRPMパッケージにパッケージ化される前にビルドされます。これは、~/rpmbuild/RPMSに格納されます。

重要:

rootユーザーとしてソースRPMパッケージをビルドしないでください。ビルド・プロセスでは、多くの場合、ユーザーが完全には制御できない可能性があるスクリプトおよびプロセスが実行されます。その上、ビルド・プロセスが原因でシステム障害が起こる可能性が高く、システムが危険にさらされる可能性もあります。

注意:

rpmbuildツールを使用してソースRPMパッケージを直接ビルドするときに、次のような警告メッセージが表示されることがあります。

warning: user mockbuild does not exist - using root

これらの警告は、複雑なビルド環境でmockユーティリティを使用してビルド用にこれらのソース・パッケージを設定する方法に関連したものであるため、無視してかまいません。

SPECファイル内で指定されているビルド依存関係を満たしていない場合は、rpmbuild --rebuildコマンドでエラーが出力され、満たしていない依存関係がリストされます。次に例を示します。

rpmbuild --rebuild bash-4.4.19-12.el8.src.rpm
Installing bash-4.4.19-12.el8.src.rpm
...
error: Failed build dependencies:
  autoconf is needed by bash-4.4.19-12.el8.x86_64
  ncurses-devel is needed by bash-4.4.19-12.el8.x86_64
  texinfo is needed by bash-4.4.19-12.el8.x86_64

警告でリストされた各依存関係を手動でインストールするか、dnf builddepコマンドの使用により、rpmbuildコマンドの実行時に抽出されたSPECファイル内で指定されているすべてのビルド依存関係を解決できます。次に例を示します。

sudo dnf builddep -y ~/rpmbuild/SPECS/bash.spec

すべてのビルド依存関係が満たされており、ソース・パッケージが適切に作成されている場合、rpmbuild --rebuildコマンドは、バイナリ・パッケージのビルドが終わると完了します。それらのパッケージには~/rpmbuild/RPMS内でアクセスできます。

ビルド・プロセスの様々な段階の間に、ソースの変更、代替パッチの適用、または代替アクションを実行するためのSPECファイルの編集が必要になった場合は、それを実行した後に、SPECファイルから直接、バイナリ・パッケージおよびソース・パッケージをビルドしなおすことができます。次に例を示します。

rpmbuild -ba ~/rpmbuild/SPECS/bash.spec

mockユーティリティの使用によるソースのビルド

mockユーティリティは、ソースを安全にビルドするために役立つ、バックグラウンドでビルド依存関係の解決を処理できるラッパーを提供します。このツールは、ビルド・プロセスを処理するためのchrootディレクトリを設定します。chroot環境を作成することで、ビルドに関する潜在的な問題のいくつかに自動的に対処します。最も重要なのは、ビルド・プロセス自体がホスト・システムに影響を与えないようにするということです。chroot環境では、ビルド依存パッケージ、およびビルドの完了に必要なすべてのものをインストールできます。不要なパッケージがホスト・システムに実際にインストールされることはないため、ホスト・システムにビルド・アーティファクトが比較的少ない状態を維持できます。chroot環境にはビルド・プロセスが含まれており、この環境によってホスト・システムが保護されます。そのため、ビルド・プロセスは、含まれている環境内で効果的に権限を与えられます。これにより、直接のビルドが容易になり、エラーの可能性を最小限に抑えることができます。さらに、mockユーティリティの使用により、ビルド依存関係を自動的に解決できます。これにより、必要に応じて、適切なdnf builddepコマンドを安全かつ自動的にトリガーできます。

mockユーティリティは、それを使用してOracle Linuxソースをビルドする前に、事前構成が必要です。最初に次のような構成で/etc/mock/templates/ol-8.tplテンプレート・ファイルを作成すると便利です。

config_opts['chroot_setup_cmd'] = 'install tar gcc-c++ redhat-rpm-config oraclelinux-release which xz sed \
                                   make bzip2 gzip gcc coreutils unzip shadow-utils diffutils cpio bash gawk \
                                   rpm-build info patch util-linux findutils grep'
config_opts['dist'] = 'el8'  # only useful for --resultdir variable subst
config_opts['extra_chroot_dirs'] = [ '/run/lock', ]
config_opts['releasever'] = '8'
config_opts['package_manager'] = 'dnf'
config_opts['root'] = 'ol-8-{{ target_arch }}'

config_opts['dnf.conf'] = """
[main]
keepcache=1
debuglevel=2
reposdir=/dev/null
logfile=/var/log/yum.log
retries=20
obsoletes=1
gpgcheck=1
assumeyes=1
syslog_ident=mock
syslog_device=
install_weak_deps=0
metadata_expire=0
best=1
module_platform_id=platform:el8
protected_packages=

# repos
[ol8_baseos_latest]
name=Oracle Linux 8 BaseOS Latest ($basearch)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

[ol8_appstream]
name=Oracle Linux 8 Application Stream ($basearch)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/appstream/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

[ol8_codeready_builder]
name=Oracle Linux 8 CodeReady Builder ($basearch) - Unsupported
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/codeready/builder/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

[ol8_distro_builder]
name=Oracle Linux 8 Distro Builder ($basearch) - Unsupported
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/distro/builder/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

[ol8_developer_EPEL]
name=Oracle Linux $releasever EPEL Packages for Development ($basearch) 
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/developer/EPEL/$basearch/ 
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle 
gpgcheck=1 
enabled=1

"""

/etc/mock/default.cfgを次の内容に置き換えます。Armプラットフォーム用のパッケージをビルドする予定の場合は、x86_64aarch64に置き換えます。

include('templates/ol-8.tpl')
config_opts['target_arch'] = 'x86_64'
config_opts['legal_host_arches'] = ('x86_64',)

ユーザーにmockユーティリティの使用を可能にするには、そのユーザーをmockグループに追加する必要があります。これを行うには、次のコマンドを実行します。

sudo /usr/sbin/usermod -a -G mock $USER

なお、ユーザーがログイン中の場合、そのユーザーはログアウトしてからシステムに再度ログインしないと、グループ権限に関する変更がアクティブにならない場合があります。

構成を準備できたら、mockユーティリティの使用によるソース・パッケージのビルドを開始できます。たとえば、単にソースRPMパッケージからパッケージを直接ビルドするには、次のようにします。

mock --rebuild bash-4.4.19-12.el8.src.rpm

パッケージは、テンプレート内で定義されているビルド・ルート用に作成された、chroot環境でビルドされます。そのchroot内の/var/lib/mockで使用されているファイル・システムにアクセスできます。たとえば、このドキュメントに記載されている構成を使用すると、次のようになります。

ls /var/lib/mock/ol-8-x86_64/root/builddir/build/SRPMS/
bash-4.4.19-12.el8.src.rpm
ls -lh /var/lib/mock/ol-8-x86_64/root/builddir/build/RPMS/
total 4.9M
-rw-r--r--. 1 root mock 1.6M Feb 3 02:10 bash-4.4.19-12.el8.x86_64.rpm
-rw-r--r--. 1 root mock 1.2M Feb 3 02:10 bash-debuginfo-4.4.19-12.el8.x86_64.rpm
-rw-r--r--. 1 root mock 841K Feb 3 02:10 bash-debugsource-4.4.19-12.el8.x86_64.rpm
-rw-r--r--. 1 root mock 113K Feb 3 02:10 bash-devel-4.4.19-12.el8.x86_64.rpm
-rw-r--r--. 1 root mock 1.3M Feb 3 02:10 bash-doc-4.4.19-12.el8.x86_64.rpm

mockのchroot内のビルド・アーティファクトを使用する必要がある場合は、次のことも実行できます。

mock --shell
INFO: mock.py version 2.4 starting (python version = 3.6.8)...
Start(bootstrap): init plugins
INFO: selinux enabled
Finish(bootstrap): init plugins
Start: init plugins
INFO: selinux enabled
Finish: init plugins
INFO: Signal handler active
Start: run
Start(bootstrap): chroot init
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start(bootstrap): cleaning package manager metadata
Finish(bootstrap): cleaning package manager metadata
INFO: enabled HW Info plugin
Finish(bootstrap): chroot init
Start: chroot init
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start: cleaning package manager metadata
Finish: cleaning package manager metadata
INFO: enabled HW Info plugin
Finish: chroot init
Start: shell
ls -lah /builddir/
total 20K
drwx------. 1 root 1000 120 Feb  4 09:21 .
dr-xr-xr-x. 1 root root 212 Feb  3 02:06 ..
-rw-------. 1 root root  50 Feb  4 09:21 .bash_history
-rw-r--r--. 1 root 1000  18 Aug  2  2020 .bash_logout
-rw-r--r--. 1 root 1000 141 Aug  2  2020 .bash_profile
-rw-r--r--. 1 root 1000 376 Aug  2  2020 .bashrc
-rw-rw-r--. 1 root root 130 Feb  3 02:06 .rpmmacros
drwxrwxr-x. 1 root 1000  88 Feb  3 02:06 build

mockの詳細は、MOCK(1)マニュアル・ページまたはhttps://github.com/rpm-software-management/mock/を参照してください。