Qtその他 - RPMパッケージ

提供: MochiuWiki : SUSE, EC, PCB

2026年1月28日 (水) 16:19時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == RPM (Red Hat Package Manager) は、RHELやSUSE等のLinuxディストリビューションで使用されるパッケージ管理形式である。<br> <br> QtアプリケーションをRPMパッケージ化することにより、以下に示すようなメリットがある。<br> * 依存関係の自動解決 * バージョン管理の一元化 * アップデート配信の容易化 * システムへのクリーンなインストールとアンイ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

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コマンドのオプション

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アカウントの設定

  1. build.opensuse.org でアカウントを作成する。
  2. osc コマンドを初期化する。
    初回実行時に認証情報の入力を求められる。
  3. 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に存在しない。
  • 解決方法
    1. CMakeLists.txtの install() コマンドを確認する。
    2. %install セクションでファイルが正しくコピーされているか確認する。
    3. ファイルパスが正しいか確認する。


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でのパッケージ名の違い

ディストリビューション別 Qt 6パッケージ名
用途 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



関連情報