GNU/Linux >> Linux の 問題 >  >> Linux

CentOS / RedHat でソースから RPM パッケージをビルドする 7 つの手順

オープン ソース アプリケーションのソース コードにアクセスできても、システムにインストールするための RPM ファイルがない場合があります。

そのような状況では、ソース コードをコンパイルしてソース コードからアプリケーションをインストールするか、ソース コードから自分で RPM ファイルを構築し、その RPM ファイルを使用してアプリケーションをインストールすることができます。

開発したアプリケーション用のカスタム RPM パッケージを構築したい場合もあります。

このチュートリアルでは、ソース コードから RPM パッケージをビルドする方法について説明します。

RPM をビルドするには、ソース コードが必要です。これは通常、SPEC ファイルを含む圧縮された tar ファイルを意味します。

通常、SPEC ファイルには、RPM のビルド方法、パッケージの一部であるファイル、およびインストール場所に関する指示が含まれています。

RPM は、ビルド プロセス中に次のタスクを実行します。

<オール>
  • spec ファイルの prep セクションに記載されているコマンドとマクロを実行します。
  • ファイルリストの内容をチェック
  • スペック ファイルのビルド セクションにあるコマンドとマクロを実行します。ファイル リストのマクロもこのステップで実行されます。
  • バイナリ パッケージ ファイルを作成します
  • ソース パッケージ ファイルを作成します
  • 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 つの異なるセクションで構成されます:

    <オール>
  • プリアンブル – プリアンブル セクションには、ビルド中のパッケージに関する情報が含まれ、パッケージへの依存関係が定義されています。一般に、プリアンブルは、1 行に 1 つのエントリで構成され、タグで始まり、その後にコロンが続き、その後にいくつかの情報が続きます。
  • %prep – このセクションでは、ビルド プロセス用のソフトウェアを準備します。このプロセス中に以前のビルドはすべて削除され、ソース ファイル (.tar) ファイルが展開されます。
  • もう 1 つの重要なことは、rpm をビルドするためのさまざまなショートカット オプションを実行するために使用できる定義済みのマクロがあることを理解することです。複雑なパッケージをビルドしようとするときに、このマクロを使用している可能性があります。以下の例では、以前のビルドをすべて削除し、ソース ファイルを解凍し、ファイルの所有権を変更する %setup というマクロを使用しています。 %prep セクションで sh スクリプトを使用してこのアクションを実行することもできますが、%setup マクロは定義済みの sh スクリプトを使用してプロセスを簡素化します。
  • %description – 通常、説明セクションにはパッケージに関する説明が含まれます。
  • %build – ビルドの実行を担当するセクションです。通常、%build セクションは sh スクリプトです。
  • %install – %install セクションも、%prep や %build と同様に sh スクリプトとして実行されます。これは、インストールに使用されるステップです。
  • %files – このセクションには、パッケージの一部であるファイルのリストが含まれています。ファイルが %files セクションの一部でない場合、パッケージで使用できません。完全なパスが必要であり、このセクションでファイルの属性と所有権を設定できます。
  • %clean – このセクションは、アプリケーションの通常のビルド領域の一部ではないすべてのファイルをクリーンアップするように RPM に指示します。例として、アプリケーションがビルドの一部として /tmp/ に一時ディレクトリ構造を作成する場合、それは削除されません。 %clean セクションに sh スクリプトを追加することで、ビルド プロセスの完了後にディレクトリを削除できます。
  • 以下は、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

    Linux
    1. LinuxでRPMまたはDEBパッケージからインストールされたファイルを一覧表示する方法

    2. RPMコマンド

    3. SSL を使用して CentOS 6.2 にソースから Apache 2.4.2 をインストールする方法

    1. CentOS7でソースからBrotliをコンパイルする方法

    2. CheckInstallを使用してソースからパッケージを構築する方法

    3. CentOS / RedHat :ログ ファイル管理の初心者向けガイド

    1. Ansibleを使用してcsvファイルからLinuxユーザーを作成する4つのステップ

    2. RedHat / CentOS / Fedoraで実行可能ファイルまたはファイルが属するパッケージを見つける方法は?

    3. いつソースからコンパイルしてインストールする必要がありますか?