Flatpak のパッケージを作ろう (1)

Flatpak は、Linux デスクトップ向けのソフトウェアデプロイメントおよびパッケージ管理を行うユーティリティソフトウェアです。Flatpak でインストールされたアプリケーションは、実行時にホスト環境から隔離(サンドボックス化)されます。

Flatpakは freedesktop.org のプロジェクトとして開始され。以前は xdg-app という名称でした。

Wikipedia より引用・編集
今回のテーマ

はじめて Flatpak のパッケージをビルドする例として、GNU Hello World の CUI プログラムを扱います。

使用した OS は下記の通りです。

Fedora Silverblue 32 x86_64
Ubuntu 20.04 x86_64
CentOS 8 x86_64

Fedora Silverblue は、OS 部分に rpm-ostree による immutable な(変更できない)イメージを、デスクトップアプリケーションには Flatpak パッケージを採用しています。

説明は Fedora Siliverblue の環境で進めますが、Ubuntu と CentOS の場合についても動作確認をしています。

Flatpak の基本的な考え方

Basic concepts — Flatpak documentation を日本語にしました。まだ直訳調ですが、こなれた訳になるよう、随時改善していきます。

Flatpak は、いくつかの重要な概念を通して理解することができます。コマンドラインから Flatpak の使い方を学んだり、アプリケーションを構築するために Flatpak を使う前に、これらの概念を知っておくと便利です。

ランタイム

ランタイムは、アプリケーションが使用する基本的な依存関係を提供します。

各アプリケーションはランタイムに対してビルドされなければならず、アプリケーションを実行するためには、このランタイムがホストシステムにインストールされていなければなりません。

Flatpak は、アプリケーションが必要とするランタイムを自動的にインストールすることができます。複数の異なるランタイムを同時にインストールすることができ、同じランタイムの異なるバージョンを含むこともできます。

ランタイムはディストリビューションに依存せず、特定のディストリビューションのバージョンに依存しません。これは、ランタイムがアプリケーションに安定したクロスディストリビューションベースを提供し、オペレーティングシステムのアップデートに関係なくアプリケーションが動作し続けることを可能にすることを意味します。

バンドルライブラリ

アプリケーションがランタイムにない依存関係を必要とする場合、それらをアプリケーションの一部としてバンドルすることができます。これにより、アプリケーション開発者は、使用する依存関係について柔軟に対応することができます。

  • ランタイムで利用できないライブラリ
  • ランタイムにあるライブラリとは異なるバージョンのライブラリ
  • ライブラリのパッチ版

サンドボックス

Flatpakでは、各アプリケーションは「サンドボックス」と呼ばれる隔離された環境でビルドされ、実行されます。各サンドボックスにはアプリケーションとそのランタイムが含まれています。

デフォルトでは、アプリケーションはサンドボックスの内容にのみアクセスできます。ユーザーファイル、ネットワーク、グラフィックソケット、バス上のサブシステム、デバイスへのアクセスは、明示的に許可されなければなりません。他のプロセスのような他のものへのアクセスは、意図的に不可能です。

必要に応じて、サンドボックス内にあるいくつかのリソースは、ホストシステムが使用するために外部に公開する必要があります。これらは「エクスポート」として知られています。これは、サンドボックスからエクスポートされるファイルで、アプリケーションの .desktop ファイルやアイコンのようなものが含まれます。

ポータル

ポータルは、アプリケーションがサンドボックス内からホスト環境と対話するためのメカニズムです。これにより、サンドボックスのパーミッションを追加することなく、データ、ファイル、サービスと対話することができます。

ポータルからアクセスできる機能の例としては、ファイル選択ダイアログからファイルを開いたり、印刷したりすることが挙げられます。インターフェイスツールキットはポータルの透過的なサポートを実装することができるので、サンドボックス外のリソースへのアクセスは安全に、そして箱から出してすぐに動作します。

リポジトリ

Flatpak のアプリケーションやランタイムは通常、リポジトリを使って保存・公開されますが、これは Git リポジトリと非常によく似ています。Flatpak のリポジトリには、単一のオブジェクトや複数のオブジェクトを格納することができ、各オブジェクトはバージョン管理されているため、アップグレードやダウングレードも可能です。

Flatpak を使用している各システムは、任意の数のリモートリポジトリにアクセスできるように設定することができます。システムが「リモート」にアクセスするように設定されると、リモートリポジトリの内容を検査したり検索したりすることができ、アプリケーションやランタイムのソースとして使用することができます。

アップデートが実行されると、インストールされているアプリケーションやランタイムの新バージョンが関連するリモートからダウンロードされます。Git と同様、バージョン間の差分のみがダウンロードされるため、非常に効率的な処理が可能です。

準備

準備として、Flatpak パッケージを扱える環境と、Flatpak パッケージを作成(ビルド)できる環境を整えます。

Flatpak 関連パッケージのインストール

Flatpak のパッケージを作成するには、パッケージを扱う flatpak と、パッケージをビルドする flatpak-builder が必要となります。

Fedora Silverstone

Fedora Silverblue ではどちらもデフォルトでインストールされています。

[bitwalk@silverblue ~]$ rpm -qa | grep flatpak
flatpak-builder-1.0.10-1.fc32.x86_64
flatpak-libs-1.6.5-1.fc32.x86_64
flatpak-session-helper-1.6.5-1.fc32.x86_64
flatpak-selinux-1.6.5-1.fc32.noarch
flatpak-1.6.5-1.fc32.x86_64
[bitwalk@silverblue ~]$ 

Ubuntu

Ubuntu では Canonical 社が開発、推進している Snap という類似技術がデフォルトで採用されています。

bitwalk@ubuntu-pc:~$ dpkg -l | grep snap
ii  chromium-codecs-ffmpeg-extra               1:85.0.4183.83-0ubuntu0.20.04.1       amd64        Transitional package - chromium-codecs-ffmpeg-extra -> chromium-ffmpeg snap
ii  gir1.2-snapd-1:amd64                       1.57-0ubuntu3                         amd64        Typelib file for libsnapd-glib1
ii  libsnapd-glib1:amd64                       1.57-0ubuntu3                         amd64        GLib snapd library
ii  libsnappy1v5:amd64                         1.1.8-1build1                         amd64        fast compression/decompression library
ii  snapd                                      2.45.1+20.04.2                        amd64        Daemon and tooling that enable snap packages
bitwalk@ubuntu-pc:~$ 

幸い、Flatpak も併せて利用することができます。

bitwalk@ubuntu-pc:~$ sudo apt search flatpak
ソート中... 完了
全文検索... 完了  
flatpak/focal-updates 1.6.5-0ubuntu0.1 amd64
  Application deployment framework for desktop apps

flatpak-builder/focal 1.0.10-1 amd64
  Flatpak application building helper
...

flatpakflatpak-builder をインストールします。

bitwalk@ubuntu-pc:~$ sudo apt install flatpak flatpak-builder
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  elfutils gir1.2-flatpak-1.0 libappstream-glib8 libasm1 libflatpak0 libostree-1-1 ostree
提案パッケージ:
  brz p7zip-full subversion
以下のパッケージが新たにインストールされます:
  elfutils flatpak flatpak-builder gir1.2-flatpak-1.0 libappstream-glib8 libasm1 libflatpak0 libostree-1-1 ostree
アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 0 個。
2,362 kB のアーカイブを取得する必要があります。
この操作後に追加で 9,983 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://jp.archive.ubuntu.com/ubuntu focal/main amd64 libasm1 amd64 0.176-1.1build1 [14.2 kB]
...
(以下省略)
...
bitwalk@ubuntu-pc:~$ 

Flatpak のアプリを GUI でインストールできるように GNOME Software のプラグインパッケージもインストールしておきます。

bitwalk@ubuntu-pc:~$ sudo apt install gnome-software-plugin-flatpak

CentOS

CentOS 8 では、デスクトップ環境を使っている場合は flatpak のみインストールされています。

[bitwalk@centos-pc ~]$ rpm -qa | grep flatpak
flatpak-1.6.2-3.el8_2.x86_64
flatpak-session-helper-1.6.2-3.el8_2.x86_64
flatpak-libs-1.6.2-3.el8_2.x86_64
flatpak-selinux-1.6.2-3.el8_2.noarch
[bitwalk@centos-pc ~]$ 

flatpak-builder をインストールします。

[bitwalk@centos-pc ~]$ sudo dnf install flatpak-builder
[sudo] bitwalk のパスワード:
メタデータの期限切れの最終確認: 0:47:05 時間前の 2020年09月13日 10時30分20秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================
 パッケージ                    アーキテクチャー     バージョン                                        リポジトリー            サイズ
====================================================================================================================================
インストール中:
 flatpak-builder               x86_64               1.0.9-2.el8                                       AppStream               213 k
依存関係のインストール中:
 libserf                       x86_64               1.3.9-8.module_el8.0.0+45+75bba4f4                AppStream                60 k
 subversion-libs               x86_64               1.10.2-1.module_el8.0.0+45+75bba4f4               AppStream               1.5 M
 utf8proc                      x86_64               2.1.1-4.module_el8.0.0+45+75bba4f4                AppStream                67 k
弱い依存関係のインストール中:
 subversion                    x86_64               1.10.2-1.module_el8.0.0+45+75bba4f4               AppStream               1.1 M
モジュールストリームの有効化中:
 subversion                                         1.10                                                                           

トランザクションの概要
====================================================================================================================================
インストール  5 パッケージ

ダウンロードサイズの合計: 3.0 M
インストール済みのサイズ: 11 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/5): libserf-1.3.9-8.module_el8.0.0+45+75bba4f4.x86_64.rpm                                        694 kB/s |  60 kB     00:00    
...
(以下省略)
...
Installed products updated.

インストール済み:
  flatpak-builder-1.0.9-2.el8.x86_64                             libserf-1.3.9-8.module_el8.0.0+45+75bba4f4.x86_64                  
  subversion-1.10.2-1.module_el8.0.0+45+75bba4f4.x86_64          subversion-libs-1.10.2-1.module_el8.0.0+45+75bba4f4.x86_64         
  utf8proc-2.1.1-4.module_el8.0.0+45+75bba4f4.x86_64            

完了しました!
[bitwalk@centos-pc ~]$ 

Flathub リポジトリの追加

Flatpak パッケージをビルドするには、Flatpak の SDK を使用します。ここでは Flathub から入手できる SDK を利用するため、Flathub のレポジトリを登録します。

[bitwalk@silverblue ~]$ sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
[sudo] bitwalk のパスワード:
[bitwalk@silverblue ~]$ flatpak remotes
Name    Options
fedora  system,oci
flathub system

上記は Fedora Silverblue 上での例ですが、 flatpak コマンドを使う限り、Ubuntu あるいは CentOS でも同じ操作になります。ただし、登録されているれリポジトリは、今回が初めてであれば flathub だけです。

Ubuntu

bitwalk@ubuntu-pc:~$ flatpak remotes
Name    Options
flathub system
bitwalk@ubuntu-pc:~$ 

ランタイムと、対応する SDK をインストール

Flatpak は、アプリが依存する基本的なライブラリにアクセスするためにランタイムを使用します。また、Flatpak パッケージをビルドするために、ビルドに必要なヘッダと開発ツールが含まれている SDK, Software Development Kit が必要となります。

必要な SDK はビルドするアプリケーションに依存しますが、ここでは、Freedesktop のランタイム (Freedesktop Platform) と SDK (Freedesktop SDK) を使用します。

NameDescriptionApplication ID
Freedesktop PlatformShared librariesorg.freedesktop.Platform
Freedesktop SDKTools and headers for developing applicationsorg.freedesktop.Sdk

まず、Freedesktop Platform をインストールします。バージョンは 20.08 とします。

[bitwalk@silverblue ~]$ sudo flatpak install flathub org.freedesktop.Platform
[sudo] bitwalk のパスワード:
Looking for matches…
Similar refs found for ‘org.freedesktop.Platform’ in remote ‘flathub’ (system):

   1) runtime/org.freedesktop.Platform/x86_64/1.6
   2) runtime/org.freedesktop.Platform/x86_64/20.08
   3) runtime/org.freedesktop.Platform/x86_64/18.08
   4) runtime/org.freedesktop.Platform/x86_64/19.08

Which do you want to use (0 to abort)? [0-4]: 2


        ID                                              Branch            Op           Remote            Download
 1. [✓] org.freedesktop.Platform.GL.default             20.08             i            flathub            42.1 MB / 42.3 MB
 2. [✓] org.freedesktop.Platform.Locale                 20.08             i            flathub             1.6 MB / 321.8 MB
 3. [✓] org.freedesktop.Platform.VAAPI.Intel            20.08             i            flathub            11.1 MB / 11.2 MB
 4. [✓] org.freedesktop.Platform.openh264               2.0               i            flathub             1.5 MB / 1.5 MB
 5. [✓] org.freedesktop.Platform                        20.08             i            flathub           218.5 MB / 266.1 MB

Installation complete.
[bitwalk@silverblue ~]$ 

つづけて Freedesktop 20.08 の SDK, org.freedesktop.Sdk をインストールします。

[bitwalk@silverblue ~]$ flatpak install flathub org.freedesktop.Sdk
Looking for matches…
Similar refs found for ‘org.freedesktop.Sdk’ in remote ‘flathub’ (system):

   1) runtime/org.freedesktop.Sdk/x86_64/20.08
   2) runtime/org.freedesktop.Sdk/x86_64/19.08
   3) runtime/org.freedesktop.Sdk/x86_64/18.08
   4) runtime/org.freedesktop.Sdk/x86_64/1.6

Which do you want to use (0 to abort)? [0-4]: 1


        ID                                   Branch          Op          Remote           Download
 1. [✓] org.freedesktop.Sdk.Locale           20.08           i           flathub           69.9 kB / 326.1 MB
 2. [✓] org.freedesktop.Sdk                  20.08           i           flathub          350.9 MB / 566.5 MB

Installation complete.
[bitwalk@silverblue ~]$ 

念の為 flatpak list コマンドで、インストールされていることを確認します。

[bitwalk@silverblue ~]$ flatpak list
Name                           Application ID                             Version       Branch       Origin       Installation
Platform                       org.fedoraproject.Platform                               f32          fedora       system
Freedesktop Platform           org.freedesktop.Platform                   20.08.0       20.08        flathub      system
default                        org.freedesktop.Platform.GL.default                      20.08        flathub      system
Intel                          org.freedesktop.Platform.VAAPI.Intel                     20.08        flathub      system
openh264                       org.freedesktop.Platform.openh264          2.1.0         2.0          flathub      system
Freedesktop SDK                org.freedesktop.Sdk                        20.08.0       20.08        flathub      system
Baobab                         org.gnome.Baobab                                         stable       fedora       system
GNOME 電卓                     org.gnome.Calculator                       3.36.0        stable       fedora       system
...
(途中省略)
...
[bitwalk@silverblue ~]$ 

念の為、Ubuntu の場合を示しました。

Ubuntu

bitwalk@ubuntu-pc:~$ flatpak list
Name                          Application ID                                Version          Branch         Installation
Freedesktop Platform          org.freedesktop.Platform                      20.08.0          20.08          system
default                       org.freedesktop.Platform.GL.default                            20.08          system
Intel                         org.freedesktop.Platform.VAAPI.Intel                           20.08          system
openh264                      org.freedesktop.Platform.openh264             2.1.0            2.0            system
Freedesktop SDK               org.freedesktop.Sdk                           20.08.0          20.08          system
bitwalk@ubuntu-pc:~$ 

Hello World プログラム

今回は GNU Project のサイトで公開されている hello world のプログラムを扱います [1]

以下の作業は、あらかじめ準備しておいたプロジェクトフォルダ, $HOME/プロジェクト/org.gnu.Hello 内で行うことにします。

[bitwalk@silverblue ~]$ cd $HOME/プロジェクト/org.gnu.Hello
[bitwalk@silverblue hello_flatpak]$ 

マニフェスト

Flatpak のアプリをビルドするには、YAML 形式あるいは JSON 形式のマニフェストファイルにビルドに関する情報を記述します。

今回の Hello World プログラムをビルドするためのマニフェストファイルは以下のとおりです。

org.gnu.Hello.yaml
id: org.gnu.Hello
runtime: org.freedesktop.Platform
runtime-version: '20.08'
sdk: org.freedesktop.Sdk
command: hello
modules:
  - name: hello
    buildsystem: autotools
    no-autogen: true
    sources:
      - type: archive
        url: https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
        sha256: 31e066137a962676e89f69d1b65382de95a7ef7d914b8cb956f41ea72e0f516b

このプログラムは GNU Autotools でビルドするプログラムですので、modules リストにある buildsystem フィールドに autotools を指定しています。他に cmake, meson, qmake などを指定できます。

ソースはビルド時に公開されているサイトからダウンロードします。ダウンロードするファイルのチェックサム(ハッシュ値)が必要だったので、あらかじめダウンロードして sha256sum で調べました。

[bitwalk@fedora-pc ダウンロード]$ sha256sum hello-2.10.tar.gz
31e066137a962676e89f69d1b65382de95a7ef7d914b8cb956f41ea72e0f516b  hello-2.10.tar.gz
[bitwalk@fedora-pc ダウンロード]$ 

ビルド

次のようにアプリをビルドします。

[bitwalk@silverblue org.gnu.Hello]$ flatpak-builder build-dir org.gnu.Hello.yaml
Downloading sources
Downloading https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  708k  100  708k    0     0   419k      0  0:00:01  0:00:01 --:--:--  419k
Initializing build dir
Committing stage init to cache
Starting build of org.gnu.Hello
========================================================================
Building module hello in /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/build/hello-1
========================================================================
checking for a BSD-compatible install... /usr/bin/install -c
...
(途中省略)
...
make[1]: Leaving directory '/run/build/hello'
compressing debuginfo in: /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/bin/hello
processing: /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/bin/hello
[30] .debug_aranges compressed -> .zdebug_aranges (752 => 216 28.72%)
[31] .debug_info compressed -> .zdebug_info (30938 => 15818 51.13%)
[32] .debug_abbrev compressed -> .zdebug_abbrev (5280 => 1345 25.47%)
[33] .debug_line compressed -> .zdebug_line (12216 => 5368 43.94%)
[34] .debug_str compressed -> .zdebug_str (11700 => 3649 31.19%)
[35] .debug_loc compressed -> .zdebug_loc (40517 => 6932 17.11%)
[36] .debug_ranges compressed -> .zdebug_ranges (6784 => 1138 16.77%)
[39] Updating section string table
stripping /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/bin/hello to /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/lib/debug/bin/hello.debug
Committing stage build-hello to cache
Cleaning up
Committing stage cleanup to cache
Finishing app
Please review the exported files and the metadata
Committing stage finish to cache
Pruning cache
[bitwalk@silverblue org.gnu.Hello]$ 

使用している Fedora Silverblue の OS 環境は、ソフトウェア開発のパッケージがインストールされていませんので、端末エミュレータ上で gcc などのコマンドを利用できません。そういうわけで、確かに SDK を利用してビルドしていることが解ります。

動作確認

次のように build-dir を指定して、直接、動作確認します。

[bitwalk@silverblue org.gnu.Hello]$ flatpak-builder --run build-dir org.gnu.Hello.yaml hello
Hello, world!
[bitwalk@silverblue org.gnu.Hello]$ 

ローカル・リポジトリに出力

ローカルのリポジトリを $HOME/repo として、出力先にこのリポジトリを指定して再コンパイルします。

[bitwalk@silverblue org.gnu.Hello]$ flatpak-builder --repo=$HOME/repo --force-clean build-dir org.gnu.Hello.yaml
Emptying app dir 'build-dir'
Downloading sources
Starting build of org.gnu.Hello
...
(途中省略)
...
Content Total: 20
Content Written: 20
Content Bytes Written: 155556 (155.6 kB)
Pruning cache
[bitwalk@silverblue org.gnu.Hello]$ 

ローカル・リポジトリを登録

Flatpak に登録されているリモートリポジトリは以下のようになっています。

[bitwalk@silverblue org.gnu.Hello]$ flatpak remotes
Name    Options
fedora  system,oci
flathub system

ローカル・リポジトリ $HOME/repo を、Flatpak のリモート・リポジトリに bitwalk という名前で登録します。

[bitwalk@silverblue org.gnu.Hello]$ flatpak --user remote-add --no-gpg-verify bitwalk $HOME/repo
[bitwalk@silverblue org.gnu.Hello]$ flatpak remotes
Name    Options
fedora  system,oci
flathub system
bitwalk user,no-gpg-verify
[bitwalk@silverblue org.gnu.Hello]$ 

ちなみに Ubuntu でも同じです。

Ubuntu

bitwalk@ubuntu-pc:~/プロジェクト/org.gnu.Hello$ flatpak remotes
Name    Options
flathub system
bitwalk user,no-gpg-verify
bitwalk@ubuntu-pc:~/プロジェクト/org.gnu.Hello$ 

アプリのデプロイ(インストール)と実行結果

ビルドした org.gnu.Hello をインストール(デプロイ)します。

[bitwalk@silverblue org.gnu.Hello]$ flatpak --user install bitwalk org.gnu.Hello
Looking for matches…


        ID                            Branch          Op         Remote          Download
 1. [✓] org.gnu.Hello.Locale          master          i          bitwalk         1.0 kB / 52.9 kB
 2. [✓] org.gnu.Hello                 master          i          bitwalk         1.0 kB / 25.2 kB

Installation complete.
[bitwalk@silverblue org.gnu.Hello]$

デプロイしたパッケージの一覧を表示します。パッケージは system と user の領域に区別され、user 領域にインストールされた Flatpak パッケージのみ一覧を表示するには --user を付けます。

[bitwalk@silverblue org.gnu.Hello]$ flatpak list --user
Name       Application ID      Version     Branch
Hello      org.gnu.Hello                   master
[bitwalk@silverblue org.gnu.Hello]$ 

実行してみるとビックリです。メッセージがローカライズされています。

[bitwalk@silverblue org.gnu.Hello]$ flatpak run org.gnu.Hello
世界よ、こんにちは!
[bitwalk@silverblue org.gnu.Hello]$ 

世界よ、ですか、なるほど…。🤔

以上、パッケージのビルドは Fedora Silverblue で説明しましたが、Ubuntu、CentOS でも同じようにビルでできることを確認しています。

参考サイト

  1. Hello - GNU Project - Free Software Foundation
  2. Welcome to Flatpak’s documentation! — Flatpak documentation

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: