オープン ソース アプリケーションのソース コードにアクセスできても、システムにインストールするための RPM ファイルがない場合があります。
そのような状況では、ソース コードをコンパイルしてソース コードからアプリケーションをインストールするか、ソース コードから自分で RPM ファイルを構築し、その RPM ファイルを使用してアプリケーションをインストールすることができます。
開発したアプリケーション用のカスタム RPM パッケージを構築したい場合もあります。
このチュートリアルでは、ソース コードから RPM パッケージをビルドする方法について説明します。
RPM をビルドするには、ソース コードが必要です。これは通常、SPEC ファイルを含む圧縮された tar ファイルを意味します。
通常、SPEC ファイルには、RPM のビルド方法、パッケージの一部であるファイル、およびインストール場所に関する指示が含まれています。
RPM は、ビルド プロセス中に次のタスクを実行します。
<オール>RPM が上記の手順を実行すると、バイナリ パッケージ ファイルとソース パッケージ ファイルが作成されます。
バイナリ パッケージ ファイルは、すべてのソース ファイルと、パッケージをインストールまたはアンインストールするための追加情報で構成されます。
通常、プラットフォーム固有のパッケージをインストールするためのすべてのオプションで有効になります。バイナリ パッケージ ファイルには、特定のアーキテクチャ用にコンパイルされた完全なアプリケーションまたは関数のライブラリが含まれています。ソース パッケージは通常、元の圧縮 tar ファイル、仕様ファイル、およびバイナリ パッケージ ファイルの作成に必要なパッチで構成されます。
tar ファイルを使用して単純なソースと BIN RPM パッケージを作成する方法を見てみましょう。
rpm パッケージを初めて使用する場合は、最初に rpm コマンドを使用して CentOS または RedHat でパッケージをインストール、アップグレード、および削除する方法を理解することをお勧めします。
1. rpm-build パッケージをインストール
作成したばかりのスペック ファイルに基づいて rpm ファイルをビルドするには、rpmbuild コマンドを使用する必要があります。
rpmbuild コマンドは rpm-build パッケージの一部です。以下のようにインストールしてください。
# yum install rpm-build
rpm-build は以下のパッケージに依存しています。これらをまだインストールしていない場合は、yum がこれらの依存関係を自動的にインストールします。
elfutils-libelf rpm rpm-libs rpm-python
2. RPM ビルド ディレクトリ
rpm-build は、RPM ビルド中に使用される次のディレクトリ構造を自動的に作成します。
# ls -lF /root/rpmbuild/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 BUILD/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 BUILDROOT/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 RPMS/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SOURCES/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SPECS/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SRPMS/
注:上記のディレクトリ構造は、rpmbuild パッケージを使用する場合の CentOS と RedHat の両方に適用されます。 /usr/src/redhat ディレクトリーを使用することもできますが、rpm ビルド中にそれに応じて topdir パラメーターを変更する必要があります。 SuSE Enterprise Linux でこれを行う場合は、/usr/src/packages ディレクトリを使用してください。
/root/rpmbuild の代わりに独自のディレクトリ構造を使用する場合は、次のオプションのいずれかを使用できます:
- –buildroot オプションを使用して、rpmbuild 中にカスタム ディレクトリを指定します
- rpmrc ファイルまたは rpmmacros ファイルで topdir パラメータを指定します。
3.ソース tar ファイルをダウンロード
次に、ビルドするパッケージのソース tar ファイルをダウンロードし、SOURCES ディレクトリに保存します。
この例では、マルチメディア ストリーミング用のサーバー ソフトウェアである icecase オープン ソース アプリケーションのソース コードを使用しました。ただし、手順は他のアプリケーションの RPM をビルドする場合とまったく同じです。ビルドしようとしている RPM に対応するソース コードをダウンロードするだけです。
# cd /root/rpmbuild/SOURCES/ # wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz # ls -l -rw-r--r--. 1 root root 1161774 Jun 11 2012 icecast-2.3.3.tar.gz
4. SPEC ファイルを作成
このステップでは、スペック ファイルを作成して、ビルド プロセスで RPM を指示します。仕様ファイルは通常、次の 8 つの異なるセクションで構成されます:
<オール>以下は、icecast アプリケーションが RPM ファイルを作成するために作成した SPEC ファイルです。
# cat /root/rpmbuild/SPECS/icecast.spec Name: icecast Version: 2.3.3 Release: 0 Summary: Xiph Streaming media server that supports multiple formats. Group: Applications/Multimedia License: GPL URL: http://www.icecast.org/ Vendor: Xiph.org Foundation [email protected] Source: http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gz Prefix: %{_prefix} Packager: Karthik BuildRoot: %{_tmppath}/%{name}-root %description Icecast is a streaming media server which currently supports Ogg Vorbis and MP3 audio streams. It can be used to create an Internet radio station or a privately running jukebox and many things in between. It is very versatile in that new formats can be added relatively easily and supports open standards for commuincation and interaction. %prep %setup -q -n %{name}-%{version} %build CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --mandir=%{_mandir} --sysconfdir=/etc make %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name} %clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc README AUTHORS COPYING NEWS TODO ChangeLog %doc doc/*.html %doc doc/*.jpg %doc doc/*.css %config(noreplace) /etc/%{name}.xml %{_bindir}/icecast %{_prefix}/share/icecast/* %changelog In this file, under % prep section you may noticed the macro “%setup -q -n %{name}-%{version}”. This macro executes the following command in the background. cd /usr/src/redhat/BUILD rm -rf icecast gzip -dc /usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz | tar -xvvf - if [ $? -ne 0 ]; then exit $? fi cd icecast cd /usr/src/redhat/BUILD/icecast chown -R root.root . chmod -R a+rX,g-w,o-w .
%build セクションには、RPM インストール中に使用できるオプションを定義する構成オプションを含む CFLAGS と、プレフィックス オプション、インストールに存在する必須ディレクトリ、およびシステム ファイルをコピーする必要がある sysconfig ディレクトリが表示されます。 .
その行の下に、コンパイルが必要なファイルのリストを決定し、それらを適切にコンパイルする make ユーティリティが表示されます。
% install セクションで、%install の下にある「make install」という行は、前のステップでコンパイルされたバイナリを取得し、アクセスできるように適切な場所にインストールまたはコピーするために使用されます。
5. rpmbuild を使用して RPM ファイルを作成します
SPEC ファイルの準備ができたら、rpm –b コマンドで rpm の構築を開始できます。 –b オプションは、ビルド プロセスのすべてのフェーズを実行するために使用されます。この段階でエラーが発生した場合は、再試行する前にエラーを解決する必要があります。通常、エラーはライブラリの依存関係にあるため、必要に応じてダウンロードしてインストールできます。
# cd /root/rpmbuild/SPECS # rpmbuild -ba icecast.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kohe4t + umask 022 + cd /root/rpmbuild/BUILD + cd /root/rpmbuild/BUILD + rm -rf icecast-2.3.3 + /usr/bin/gzip -dc /root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz + /bin/tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + cd icecast-2.3.3 + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.ynm7H7 + umask 022 + cd /root/rpmbuild/BUILD + cd icecast-2.3.3 + CFLAGS='-O2 -g' + ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether to enable maintainer-specific portions of Makefiles... no checking for gcc... gcc .. .. .. Wrote: /root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.dzahrv + umask 022 + cd /root/rpmbuild/BUILD + cd icecast-2.3.3 + '[' /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 '!=' / ']' + rm -rf /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 + exit 0
注:SuSE Linux を使用している場合、rpmbuild が利用できない場合は、「rpm -ba」を使用して rpm パッケージをビルドしてみてください。
上記の rpmbuild のインストール中に、次のエラー メッセージが表示される場合があります:
エラー 1:XSLT 構成が見つかりません
checking for xslt-config... no configure: error: XSLT configuration could not be found error: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build) RPM build errors: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
解決策 1:libxstl-devel をインストールする
xslt-config の場合、以下に示すように libxstl-devel パッケージをインストールする必要があります。
yum install libxstl-devel
これにより、次の依存関係もインストールされます:
- libgcrypt
- libgcrypt-devel
- libgpg-error-devel
エラー 2:libvorbis エラー
checking for libvorbis... configure: error: must have Ogg Vorbis v1.0 or above installed error: Bad exit status from /var/tmp/rpm-tmp.m4Gk3f (%build)
解決策 2:libvorbis-devel をインストールする
Ogg Vorbis v1.0 の場合、以下に示すように libvorbis-devel パッケージをインストールします。
yum install libvorbis-devel
これにより、次の依存関係もインストールされます:
- リボッグ
- libogg-devel
- libvorbis
6.ソースおよびバイナリ RPM ファイルを確認する
rpmbuild が完了すると、ソース rpm とバイナリ rpm が以下のディレクトリに作成されていることを確認できます。
# ls -l /root/rpmbuild/SRPMS/ -rw-r--r-- 1 root root 1162483 Aug 25 15:46 icecast-2.3.3-0.src.rpm # ls -l /root/rpmbuild/RPMS/x86_64/ -rw-r--r--. 1 root root 349181 Feb 4 12:54 icecast-2.3.3-0.x86_64.rpm
7. RPM ファイルをインストールして確認する
最後のステップとして、バイナリ rpm をインストールして、正常にインストールされ、すべての依存関係が解決されていることを確認できます。
# rpm -ivvh /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm D: ============== /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key D: loading keyring from rpmdb D: opening db environment /var/lib/rpm cdb:mpool:joinenv D: opening db index /var/lib/rpm/Packages rdonly mode=0x0 D: read h# 210 Header sanity check: OK D: added key gpg-pubkey-c105b9de-4e0fd3a3 to keyring D: Using legacy gpg-pubkey(s) from rpmdb D: Expected size: 349181 = lead(96)+sigs(180)+pad(4)+data(348901) D: Actual size: 349181 D: ========== relocations D: added binary package [0] D: found 0 source and 1 binary packages D: ========== +++ icecast-2.3.3-0 x86_64/linux 0x2 .. ..
上記のインストール後、以下に示すように、カスタム作成した rpm ファイルが正常にインストールされたことを確認できます。
# rpm -qa icecast icecast-2.3.3-0.x86_64