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_64
をaarch64
に置き換えます。
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/を参照してください。