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

LinuxソフトウェアをRPMでパッケージ化するためのその他のヒント

Red Hat Enterprise Linux(RHEL)またはFedoraを使用している場合は、すぐにdnfを使用していることに気付くでしょう。 (またはyum )ソフトウェアパッケージをインストールします。 Red Hat Package Manager(RPM)は、これらのLinuxディストリビューションで最も重要なソフトウェア管理ツールです。この記事では、このフレームワークを利用して独自のアプリケーションを配布する方法を示します。

うまくいけば、あなたは同じ主題に関するバレンティン・バジュラミの記事を読む機会があったでしょう。ここで同じ概念のいくつかを繰り返し、途中で見つかる可能性のあるいくつかの問題を説明します。また、さらに2つの複雑な例を使用して、ネイティブアプリケーションをパッケージ化するときに発見する可能性のあるいくつかの問題を特定します。

この記事では、配布用に独自のネイティブアプリケーションをコンパイルおよびパッケージ化する方法を決定する方法を示します。フォローアップ記事では、RPMパッケージがない、またはある場合はカスタマイズするサードパーティアプリケーションをパッケージ化する方法について説明します。

前提条件は次のとおりです。

  • RPMを使用してパッケージを照会し、パッケージをインストールまたは削除する方法に関する基本的な知識があります。そうでない場合は、最初にこれらの概念に精通してから、ここに戻って楽しんでください。
  • ここに含まれている演習を完了するために必要になるため、Make、Git、GCC、およびJavaがインストールされています。必須ではありませんが、私が進むにつれて練習していただければ幸いです。

DNFパッケージマネージャーを使用してMake、GCC、Java 11、およびGitをインストールするには、次のコマンドを実行します。

$ sudo dnf install \
make gcc-10 java-11-openjdk-headless git

RPMを使用して独自のソフトウェアをパッケージ化します

この記事では、このステップでjdumpertoolsと呼ばれる小さなオープンソースプロジェクトを使用します。

Linuxターミナルで、jdumpertoolsのクローンを作成します そしてそれをコンパイルします(MakeとGCCコンパイラをインストールしましたよね?):

$ git clone [email protected]:josevnz/jdumpertools.git
$ cd jdumpertools
$ make all

$ ls -l jdu jutmp *.so
-rwxrwxr-x 1 josevnz josevnz 32728 Oct  3 16:40 jdu
-rwxrwxr-x 1 josevnz josevnz 32752 Oct  3 16:40 jutmp
-rwxrwxr-x 1 josevnz josevnz 29024 Oct  3 16:40 libjdumpertools.so

次に、生成されたプログラムのいずれかを実行できます。たとえば、jduを試してみてください (duのより単純なバージョン 結果をJSON形式で出力するコマンド):

$ LD_LIBRARY_PATH=$PWD $PWD/jdu /
[{"partition": "/", "free_space": 462140129280.000000, "total_space": 510405902336.000000}]

これまでのところ、とても良いです。

このディレクトリのjdumpertools.specファイルは、jdumpertoolsのコンパイルとパッケージ化の方法を制御するRPM仕様ファイルです。 RPMを使用します。

次に、RPMファイルの作成に移る前に、いくつかのサポートツールをインストールします。

RPMビルディングブロックをインストールする

必要なrpmdevtoolsを入手してください 実行によるユーティリティ:

$ sudo dnf install rpm-build rpmdevtools

次に、rpmdevtoolsを使用してRPMを構築するためのサンドボックスを準備します 。このステップではrootを使用せず、個人または開発者のLinuxアカウントを使用してください(-dを渡します) デバッグフラグ):

$ rpmdev-setuptree -d
josevnz       /home/josevnz    /home/josevnz/.rpmmacros
/home/josevnz/rpmbuild/RPMS    /home/josevnz/rpmbuild/SOURCES     /home/josevnz/rpmbuild/SPECS
/home/josevnz/rpmbuild/SRPMS   /home/josevnz/rpmbuild/BUILD

より良いビューは次のとおりです:

$ tree ~/rpmbuild
/home/josevnz/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

5 directories, 0 files

今のところ、注意を払う必要があるのは次の2つのディレクトリだけです。SOURCES およびSPECS 。他の人については後で説明します。

~/.rpmmacrosという新しいファイルもあります 。 RPMパッケージを構築する際の反復的なタスクを回避するために、そこにいくつかの特別なマクロを配置またはオーバーライドできます。このファイルはrpmbuildを固定するため、重要です。 ホームディレクトリのある環境。

アプリケーションをパッケージ化します

まず、tarを作成します ~/rpmbuild/SOURCES内のソースコードのファイル ディレクトリ:

VERSION=v0.1
NAME=jdumpertools
TARFILE=$(NAME)-$(VERSION).tar.gz
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)

通常、tar ファイルには、パッケージ化プロセスでコンパイルするスクリプトとソースコードが含まれています。

次に、RPM specを作成します ファイル。繰り返しますが、rpmdevtools 次のように、有利なスタートを切ることができます:

$ rpmdev-newspec ~/rpmbuild/jose-package.spec
/home/josevnz/rpmbuild/jose-package.spec created; type minimal, rpm version >= 4.16.

$ cat  ~/rpmbuild/jose-package.spec
Name:           jose-package
Version:        
Release:        1%{?dist}
Summary:        

License:        
URL:            
Source0:        

BuildRequires:  
Requires:       

%description

%prep
%autosetup

%build
%configure
%make_build

%install
rm -rf $RPM_BUILD_ROOT
%make_install


%files
%license add-license-file-here
%doc add-docs-here

%changelog
* Sun Oct 03 2021 Jose Vicente Nunez <[email protected]>
- 

このファイルを今すぐ理解できなくても心配しないでください。 jdumpertools.specをコピーします ~/rpmbuild/SPECSへのファイル ディレクトリ:

$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS

そして、ソースとバイナリRPMファイルを作成します:

$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.spec
setting SOURCE_DATE_EPOCH=1609718400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.kBlIwO
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd /home/josevnz/rpmbuild/BUILD
+ rm -rf jdumpertools
+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jdumpertools
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
[...]
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uEyCyL
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd jdumpertools
+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0

最終結果は、ソースRPMとバイナリRPMの2つのファイルになります。

Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm

RPMのインストール中に何が起こるか

では、各カスタムRPMをインストールするとどうなりますか?

  1. ソースRPMをインストールすると、tarが作成されます ファイルとspec rpmbuild内のファイル ディレクトリ。これにより、アプリケーションを再コンパイルし、RPM specを修正できます。 ファイルなど。
    $ ls rpmbuild/{SPECS,SOURCES}
    rpmbuild/SOURCES:
    jdumpertools-v0.1.tar.gz
    
    rpmbuild/SPECS:
    jdumpertools.spec
  2. バイナリRPMをインストールする場合は、実際にアプリケーションをインストールしています。
    $ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
    Verifying...                ################ [100%]
    Preparing...                ################ [100%]
    Updating / installing...
       1:jdumpertools-v0.1-1.fc33  ################ [100%]
  3. インストールされているパッケージが存在することを確認します:
    $ rpm -qi jdumpertools
    Name        : jdumpertools
    Version     : v0.1
    Release     : 1.fc33
    Architecture: x86_64
    Install Date: Sun 03 Oct 2021 06:32:50 PM EDT
    Group       : Unspecified
    Size        : 95002
    License     : Apache License 2.0
    Signature   : (none)
    Source RPM  : jdumpertools-v0.1-1.fc33.src.rpm
    Build Date  : Sun 03 Oct 2021 06:27:11 PM EDT
    Build Host  : dmaf5.home
    URL         : https://github.com/josevnz/jdumpertools
    Summary     : Programs that can be used to dump Linux usage data in JSON format.
    Description :
    
    Jdumpertools is a collection of programs used to dump Linux usage data in JSON format to be ingested by other tools.
    
    * jdu: Similar to UNIX 'du' command.
    * jutmp: UTMP database dumper

:好奇心旺盛な読者はおそらくMakefileを開いたでしょう rpmというターゲットを見ました :

rpm: all
    test -x /usr/bin/rpmdev-setuptree && /usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
    /usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
    /usr/bin/rpmbuild -ba jdumpertools.spec

これは、rpmbuildを準備するための便利なショートカットです。 サンドボックス、tar makeでコンパイルされた後のファイル 、rpmbuildを使用してパッケージ化します 指図。 make rpmまでお気軽にお電話ください 何が起こるか見てみましょう。

[Bashシェルスクリプトのチートシートをダウンロードして、その他のヒントを入手してください。 ]

生成に使用するコマンドとツールを紹介しました RPMファイルですが、今度は書き込みの時間です。 RPM spec ファイル。

jdumperツールのスペックファイルを作成する

スペックファイルを操作するには、アプリケーションをコンパイルまたはパッケージ化する方法を説明するだけでなく、いくつかのメタデータタグを入力する必要があります。 Jdumpertools は単純なANSICアプリケーションであるため、ソースを解凍してコンパイルし、中間領域(~/rpmbuild/BUILDROOT)にコピーします。 )、配布用にパッケージ化します。

まず、RPMスペックファイルを見てください:

Name:           jdumpertools
# TODO: Figure out a better way to update version here and on Makefile
Version:        v0.1        
Release:        1%{?dist}
Summary:        Programs that can be used to dump Linux usage data in JSON format. 

License:        Apache License 2.0
URL:            https://github.com/josevnz/jdumpertools
Source0:        %{name}-%{version}.tar.gz

BuildRequires:  bash,tar,gzip,rpmdevtools,rpmlint,make,gcc >= 10.2.1
Requires:       bash

%global debug_package %{nil}

%description

Jdumpertools is a collection of programs you can use to dump Linux usage data in JSON format to be ingested by other tools.

* jdu: Similar to UNIX 'du' command.
* jutmp: UTMP database dumper

%prep
%setup -q -n jdumpertools

%build
make all

%install
rm -rf %{buildroot}
/usr/bin/mkdir -p %{buildroot}/%{_bindir}
/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}
/usr/bin/mkdir -p %{buildroot}/%{_libdir}
/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}

%clean
rm -rf %{buildroot}

%files
%{_bindir}/jdu
%{_bindir}/jutmp
%{_libdir}/libjdumpertools.so
%license LICENSE
%doc README.md


%changelog
* Mon Jan  4 2021 Jose Vicente Nunez <[email protected]> - 0.1
- First version being packaged

ここで重要なことを確認してください:

  • バージョン、名前、Source0などのメタデータ。変数またはマクロを使用できます
  • %prepでソースを解凍します %setupを使用したセクション マクロ(RPMガイドにはフラグに関する詳細がたくさんあります)
  • BuildRequires :パッケージをビルドするために必要な依存関係をリストする必要があります。これらは動的に検出できません。
  • %build セクション:makeでコンパイルする
  • %install セクション:プログラムが機能するために必要なもの(プログラム、ライブラリなど)をコピーします
  • %ファイル セクション:ファイルがドキュメントであるかどうかを指定できる場所(%doc )、ライセンスファイル(%ライセンス )、または通常のファイル

また重要:

  • %global debug_package %{nil}を使用してパッケージ化中にデバッグコードの作成を無効にしました 。
  • changelog この新しいパッケージバージョンで何が変更されたかを文書化します。

rpmlintを使用してスペックファイルのエラーをチェックします

あなたはあなたのRPMが完璧ではないという難しい方法を見つけたくありません。したがって、明らかなエラーやRPMを改善する方法を確認することをお勧めします。

$ sudo dnf install rpmlint

次に、RPM specを確認します ファイル:

$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec 
/home/josevnz/rpmbuild/SPECS/jdumpertools.spec: W: invalid-url Source0: jdumpertools-v0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings.

rpmlintのドキュメントには、 Source0 と記載されています 明確に定義されたURLである必要があります(値は有効なパブリックHTTP、HTTPS、またはFTP URLである必要があります)。この警告について心配する必要はありません。

RPM自体はどうですか?

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: summary-ended-with-dot C Programs that can be used to dump Linux usage data in JSON format.
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
jdumpertools.x86_64: E: description-line-too-long C Jdumpertools is a collection of programs that can be used to dump linux usage data in JSON format, so it can be ingested by other tools.
jdumpertools.x86_64: W: incoherent-version-in-changelog 0.1 ['v0.1-1.fc33', 'v0.1-1']
jdumpertools.x86_64: W: invalid-license Apache License 2.0
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jdu
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jutmp
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-soname /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-manual-page-for-binary jdu
jdumpertools.x86_64: W: no-manual-page-for-binary jutmp
1 packages and 0 specfiles checked; 1 errors, 10 warnings.

10個の警告と1個のエラー。簡単に修正できるものもあります:

  • ライセンスは特定の形式である必要があります
  • プログラムにはmanページが必要なので、troffを使用して非常に単純なページを作成しました
  • ライブラリにsonameを含めます

修正後、残っている警告は1つだけです:

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
The value of this tag appears to be misspelled. Please double-check.

この警告は、duという単語を警告しています。 スペルが間違っているようです。ただし、これは有効なコマンドへの参照にすぎないため、警告は無視してかまいません。

次に、改良されたバージョンでRPMをアップグレードします。

$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm

rpmを使用しています リポジトリからの新しいバージョンではなく、ローカルディスクバージョンからパッケージをアップグレードしたことをより明確にするコマンド。必要に応じて、dnfでも同じことができます。 :

$ sudo dnf install --upgrade \
~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm

あなたが学んだことと次のこと

RPMを使用したソフトウェアのパッケージ化は、最初は威圧的に見えますが、少しの忍耐があれば、すぐにそこに到達します。問題が発生すると、コードを改善する適切な方法も見つかります。以下は、いくつかのリソースと最終的な推奨事項です。

  • 大いに賛成して、Adam Miller、Maxim Svistunov、およびMarieDoleželováによって書かれたRPMパッケージングガイドのコピーを入手してください。それは非常に完全でよく整理されています。真剣に、今それをしなさい;とても良いです。
  • 公式のRPMパッケージガイドとFedoraRPMガイドにも詳細が満載です。ブックマークを付けないでください。
  • rpmlintを使用します。 RPMパッケージを出荷する前に、キャッチして修正できる小さなものがいくつもあることに驚かれることでしょう。
  • 十分ではありませんか? Fedoraには、ソフトウェアをパッケージ化するときに使用できるトリックのリストがあります。
  • まだ興味がありますか? RPMパッケージングガイドラインを必ず確認してください。

Linux
  1. Linuxで印刷するための3つのヒント

  2. Linuxでの印刷にCUPSを使用するためのヒントとコツ

  3. inxiを使用したLinuxシステムの詳細

  1. Linuxで古い親戚をオンラインにするための4つのヒント

  2. あなたの子供のための10の最高のLinux教育ソフトウェア

  3. RPM を使用した Linux ソフトウェア管理の初心者向けガイド

  1. Linuxサーバーのセキュリティを開始するための5つのヒント

  2. Linuxコマンドを使用してDNSを構成し、5分でラボを構築し、システム管理者向けのその他のヒント

  3. Linux用の最高のペイントソフトウェア