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をインストールするとどうなりますか?
- ソースRPMをインストールすると、
tar
が作成されます ファイルとspec
rpmbuild
内のファイル ディレクトリ。これにより、アプリケーションを再コンパイルし、RPMspec
を修正できます。 ファイルなど。$ ls rpmbuild/{SPECS,SOURCES} rpmbuild/SOURCES: jdumpertools-v0.1.tar.gz rpmbuild/SPECS: jdumpertools.spec
- バイナリ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%]
- インストールされているパッケージが存在することを確認します:
$ 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パッケージングガイドラインを必ず確認してください。