Qtその他 - RPMパッケージ
概要
RPM (Red Hat Package Manager) は、RHELやSUSE等のLinuxディストリビューションで使用されるパッケージ管理形式である。
QtアプリケーションをRPMパッケージ化することにより、以下に示すようなメリットがある。
- 依存関係の自動解決
- バージョン管理の一元化
- アップデート配信の容易化
- システムへのクリーンなインストールとアンインストール
- 複数マシンへの展開の効率化
必要なソフトウェア
- Qt 5 / 6
- CMake
- GCC/G++
- rpmbuildツールチェーン
ビルド環境の構築
RPMパッケージを作成するために必要なツールをインストールする。
RHEL
必要なパッケージをインストールする。
# RPMビルドツールのインストール sudo dnf install rpm-build rpmdevtools rpmlint # Qt開発パッケージのインストール sudo dnf install qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtquickcontrols2-devel # ビルドツールのインストール sudo dnf install cmake gcc-c++ desktop-file-utils
SUSE
必要なパッケージをインストールする。
# RPMビルドツールのインストール sudo zypper install rpm-build rpmdevtools rpmlint # OBS (Open Build Service) クライアントのインストール (オプション) sudo zypper install osc build # Qt開発パッケージのインストール (アプリケーション開発に必要なQtパッケージ) 例: sudo zypper install qt6-base-devel qt6-declarative-devel qt6-quickcontrols2-devel # ビルドツールのインストール sudo zypper install cmake gcc-c++ desktop-file-utils update-desktop-files
RPMビルドディレクトリの作成
rpmdev-setuptree コマンドを実行して、RPMビルド用のディレクトリ構造を作成する。
rpmdev-setuptree
このコマンドにより、以下に示すディレクトリ構造が ~/rpmbuild/ に作成される。
~/rpmbuild/ ├── BUILD/ # ビルド作業ディレクトリ ├── BUILDROOT/ # インストール先のルートディレクトリ ├── RPMS/ # 生成されたRPMパッケージ ├── SOURCES/ # ソースコードのアーカイブ ├── SPECS/ # SPECファイル └── SRPMS/ # ソースRPMパッケージ
ソースコードの準備
RPMパッケージを作成するために、ソースコードを適切な形式で準備する。
プロジェクト構造
Qtアプリケーションのプロジェクト構造は以下のようにする。
MyQtApp-1.0.0/
├── CMakeLists.txt
├── src/
│ └── main.cpp
├── include/
│ └── backend.h
├── qml/
│ └── Main.qml
├── resources/
│ └── icons/
│ └── myqtapp.png
└── desktop/
└── myqtapp.desktop
CMakeLists.txtの設定
CMakeLists.txtにインストールルールを追加する。
これはRPMビルド時に make install コマンドでファイルを適切な場所に配置するために必要である。
cmake_minimum_required(VERSION 3.21)
project(MyQtApp VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt6 6.2 REQUIRED COMPONENTS Core Quick Qml QuickControls2)
qt_add_executable(appMyQtApp
src/main.cpp
)
qt_add_qml_module(appMyQtApp
URI MyQtApp
VERSION 1.0
QML_FILES
qml/Main.qml
)
target_link_libraries(appMyQtApp PRIVATE
Qt6::Core
Qt6::Quick
Qt6::Qml
Qt6::QuickControls2
)
# インストールルール
include(GNUInstallDirs)
# 実行ファイルのインストール
install(TARGETS appMyQtApp
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# デスクトップファイルのインストール
install(FILES desktop/MyQtApp.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
)
# アイコンのインストール
install(FILES resources/icons/MyQtApp.png
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/256x256/apps
)
デスクトップエントリファイルの作成
[Desktop Entry]
Name=My Qt App
Comment=Qt Application
Exec=appMyQtApp
Icon=myqtapp
Terminal=false
Type=Application
Categories=Utility;Development;
Keywords=Qt;Application;
ソースアーカイブの作成
ソースコードをtar.gzアーカイブとして圧縮して、~/rpmbuild/SOURCES/ にコピーする。
# プロジェクトディレクトリに移動 cd /path/to/project # 親ディレクトリに移動 cd .. # ソースアーカイブを作成 tar cf MyQtApp-1.0.0.tar.gz MyQtApp-1.0.0/ # SOURCESディレクトリにコピー cp MyQtApp-1.0.0.tar.gz ~/rpmbuild/SOURCES/
SPECファイルの作成
SPECファイルは、RPMパッケージのビルド手順、依存関係、メタデータを定義するファイルである。
RHEL向けSPECファイル
~/rpmbuild/SPECS/MyQtApp.spec ファイルを作成する。
Name: MyQtApp
Version: 1.0.0
Release: 1%{?dist}
Summary: Qt GUI Application
License: GPL-3.0-or-later
URL: https://example.com/myqtapp
Source0: %{name}-%{version}.tar.gz
BuildRequires: cmake >= 3.21
BuildRequires: gcc-c++
BuildRequires: qt6-qtbase-devel >= 6.2
BuildRequires: qt6-qtdeclarative-devel >= 6.2
BuildRequires: qt6-qtquickcontrols2-devel >= 6.2
BuildRequires: desktop-file-utils
Requires: qt6-qtbase >= 6.2
Requires: qt6-qtdeclarative >= 6.2
Requires: qt6-qtquickcontrols2 >= 6.2
%description
MyQtApp is a Qt application built with C++17.
This application demonstrates modern Qt Quick development practices.
%prep
%setup -q
%build
%cmake -DCMAKE_BUILD_TYPE=Release
%cmake_build
%install
%cmake_install
# デスクトップファイルの検証
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
%post
/usr/bin/update-desktop-database &> /dev/null || :
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &> /dev/null || :
%postun
/usr/bin/update-desktop-database &> /dev/null || :
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &> /dev/null || :
%files
%license LICENSE
%doc README.md
%{_bindir}/appMyQtApp
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/256x256/apps/myqtapp.png
%changelog
* Mon Jan 27 2026 Your Name <your.email@example.com> - 1.0.0-1
- Initial release
SUSE向けSPECファイル
SUSE系では、パッケージ名やマクロが異なる。
~/rpmbuild/SPECS/MyQtApp.spec ファイルを作成する。
Name: MyQtApp
Version: 1.0.0
Release: 1
Summary: Qt Application
License: GPL-3.0-or-later
Group: Productivity/Other
URL: https://example.com/myqtapp
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: cmake >= 3.21
BuildRequires: gcc-c++
BuildRequires: qt6-base-devel >= 6.2
BuildRequires: qt6-declarative-devel >= 6.2
BuildRequires: qt6-quickcontrols2-devel >= 6.2
BuildRequires: update-desktop-files
BuildRequires: hicolor-icon-theme
Requires: libQt6Core6 >= 6.2
Requires: libQt6Gui6 >= 6.2
Requires: libQt6Quick6 >= 6.2
Requires: libQt6Qml6 >= 6.2
Requires: qt6-declarative-imports >= 6.2
Requires: qt6-quickcontrols2-imports >= 6.2
%description
MyQtApp is a Qt application built with C++17.
This application demonstrates modern Qt Quick development practices.
%prep
%setup -q
%build
%cmake -DCMAKE_BUILD_TYPE=Release
%cmake_build
%install
%cmake_install
# SUSE固有のデスクトップファイル処理
%suse_update_desktop_file %{name}
%post
%desktop_database_post
%icon_theme_cache_post
%postun
%desktop_database_postun
%icon_theme_cache_postun
%files
%license LICENSE
%doc README.md
%{_bindir}/appMyQtApp
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/256x256/apps/myqtapp.png
%changelog
SPECファイルの主要セクション
- Name
- パッケージ名を指定する。
- Version
- パッケージのバージョン番号を指定する。
- Release
- 同一バージョン内でのリリース番号を指定する。
- Summary
- パッケージの簡潔な説明を記述する。
- License
- ライセンスを指定する (SPDX形式を推奨)。
- BuildRequires
- ビルド時に必要なパッケージを指定する。
- Requires
- 実行時に必要なパッケージを指定する。
- %prep
- ソースコードの展開と準備を行う。
- %build
- ビルドコマンドを実行する。
- %install
- ビルド結果をインストールする。
- %files
- パッケージに含めるファイルを指定する。
- %changelog
- 変更履歴を記録する。
RPMパッケージのビルド
SPECファイルを使用してRPMパッケージをビルドする。
SPECファイルの検証
ビルド前にSPECファイルの構文を検証する。
rpmlint ~/rpmbuild/SPECS/MyQtApp.spec
RPMパッケージのビルド
rpmbuild コマンドを使用してパッケージをビルドする。
# バイナリRPMとソースRPMの両方をビルド rpmbuild -ba ~/rpmbuild/SPECS/MyQtApp.spec # バイナリRPMのみをビルド rpmbuild -bb ~/rpmbuild/SPECS/MyQtApp.spec # ソースRPMのみをビルド rpmbuild -bs ~/rpmbuild/SPECS/MyQtApp.spec
rpmbuildコマンドのオプション
| オプション | 説明 |
|---|---|
| -ba | バイナリRPMとソースRPMの両方をビルド |
| -bb | バイナリRPMのみをビルド |
| -bs | ソースRPMのみをビルド |
| -bp | %prepセクションのみを実行 |
| -bc | %buildセクションまで実行 |
| -bi | %installセクションまで実行 |
ビルド成果物の確認
ビルドが成功すると、以下の場所にRPMパッケージが生成される。
# バイナリRPM ls -la ~/rpmbuild/RPMS/x86_64/ # 出力例: MyQtApp-1.0.0-1.suse15.6.x86_64.rpm # ソースRPM ls -la ~/rpmbuild/SRPMS/ # 出力例: MyQtApp-1.0.0-1.suse15.6.src.rpm
パッケージの検証とインストール
生成されたRPMパッケージを検証して、インストールする。
パッケージ情報の確認
# パッケージ情報の表示 rpm -qip ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.suse15.6.x86_64.rpm # パッケージに含まれるファイル一覧 rpm -qlp ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.suse15.6.x86_64.rpm # パッケージの依存関係 rpm -qpR ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.suse15.6.x86_64.rpm
rpmlintによる品質チェック
rpmlint ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.suse15.6.x86_64.rpm
パッケージのインストール
RHEL
# dnfを使用してインストール (依存関係を自動解決) sudo dnf install ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.suse15.6.x86_64.rpm ## または # rpmコマンドを使用 sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.suse15.6.x86_64.rpm </syntaxhighlight>
SUSE系
# zypperを使用してインストール (依存関係を自動解決) sudo zypper install ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.x86_64.rpm ## または # rpmコマンドを使用 sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.x86_64.rpm
インストールの確認
# パッケージがインストールされているか確認 rpm -q MyQtApp # インストールされたファイルの確認 rpm -ql MyQtApp # アプリケーションの実行 appMyQtApp
パッケージのアンインストール
RHEL
sudo dnf remove MyQtApp
SUSE
sudo zypper remove MyQtApp
Open Build Service (SUSE)
SUSEでは、Open Build Service (OBS) を使用してパッケージをビルド・配布することができる。
OBSアカウントの設定
- build.opensuse.org でアカウントを作成する。
oscコマンドを初期化する。
初回実行時に認証情報の入力を求められる。osc
プロジェクトの作成
# パッケージメタデータの作成 osc meta pkg -e home:username MyQtApp # パッケージのチェックアウト osc checkout home:username/MyQtApp cd home:username/MyQtApp
ファイルの追加とコミット
# ソースアーカイブとSPECファイルをコピー cp /path/to/MyQtApp-1.0.0.tar.gz . cp /path/to/MyQtApp.spec . # ファイルを追加 osc add MyQtApp-1.0.0.tar.gz MyQtApp.spec # コミット (自動的にビルドが開始される) osc commit -m "Initial commit of MyQtApp 1.0.0" </syntaxhighlight>
ビルド状況の確認
# ビルド結果の確認 osc results home:username MyQtApp # ビルドログの確認 osc buildlog home:username MyQtApp openSUSE_Tumbleweed x86_64 # ビルド済みパッケージのダウンロード osc getbinaries home:username MyQtApp openSUSE_Tumbleweed x86_64
GPG署名とリポジトリの作成
パッケージを配布する場合は、GPG署名とリポジトリの作成を行う。
GPG鍵の作成
# GPG鍵の生成 gpg --gen-key # 鍵IDの確認 gpg --list-keys
RPMパッケージへの署名
# ~/.rpmmacrosファイルに署名設定を追加 echo '%_gpg_name Your Name <your.email@example.com>' >> ~/.rpmmacros # パッケージに署名 rpm --addsign ~/rpmbuild/RPMS/x86_64/MyQtApp-1.0.0-1.suse15.6.x86_64.rpm
YUMリポジトリの作成 (RHEL)
# createrepoのインストール sudo dnf install createrepo_c # リポジトリディレクトリの作成 mkdir -p ~/myrepo/packages cp ~/rpmbuild/RPMS/x86_64/*.rpm ~/myrepo/packages/ # リポジトリメタデータの作成 createrepo ~/myrepo/
トラブルシューティング
ビルドエラー: 依存パッケージが見つからない
- 原因
- BuildRequiresに指定したパッケージがインストールされていない。
- 解決方法
# RHEL sudo dnf builddep ~/rpmbuild/SPECS/MyQtApp.spec # SUSE sudo zypper si -d MyQtApp
ビルドエラー: ファイルが見つからない
- 原因
- %filesセクションで指定したファイルがBUILDROOTに存在しない。
- 解決方法
- CMakeLists.txtの
install()コマンドを確認する。 %installセクションでファイルが正しくコピーされているか確認する。- ファイルパスが正しいか確認する。
- CMakeLists.txtの
rpmlint警告: no-documentation
- 原因
- パッケージにドキュメントファイルが含まれていない。
- 解決方法
- SPECファイルの%filesセクションに以下を追加する。
%doc README.md %license LICENSE
Qt6ライブラリが見つからない
- 原因
- Qt6のライブラリパスが正しく設定されていない。
- 解決方法
# Qt6のインストールパスを確認 qmake6 -query QT_INSTALL_PREFIX qmake6 -query QT_INSTALL_LIBS # 環境変数を設定 export LD_LIBRARY_PATH=$(qmake6 -query QT_INSTALL_LIBS):$LD_LIBRARY_PATH
RHELとSUSEでのパッケージ名の違い
| 用途 | RHEL | SUSE |
|---|---|---|
| Qt6 Base開発 | qt6-qtbase-devel | qt6-base-devel |
| Qt6 QML開発 | qt6-qtdeclarative-devel | qt6-declarative-devel |
| Qt6 Quick Controls | qt6-qtquickcontrols2-devel | qt6-quickcontrols2-devel |
| Qt6 Coreランタイム | qt6-qtbase | libQt6Core6 |
| Qt6 GUIランタイム | qt6-qtbase-gui | libQt6Gui6 |
クロスディストリビューション対応
RHELとSUSEの両方に対応するSPECファイルを作成する場合は、条件分岐を使用する。
# ディストリビューション判定
%if 0%{?suse_version}
# SUSEの設定
BuildRequires: qt6-base-devel
BuildRequires: update-desktop-files
%else
# RHELの設定
BuildRequires: qt6-qtbase-devel
BuildRequires: desktop-file-utils
%endif
%install
%cmake_install
%if 0%{?suse_version}
%suse_update_desktop_file %{name}
%else
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
%endif
ディストリビューション検出マクロ
- %{?suse_version}
- SUSE系の場合に定義される。
- 例: 1500 = Leap 15.x
- %{?fedora}
- %{?rhel}
- RHELの場合に定義される。
- 例: 9 = RHEL 9
- Fedoraの場合に定義される。
- 例: 39 = Fedora 39
- %{?dist}
- ディストリビューション識別子
- 例: .fc39, .el9
関連情報