Flatpak は、Linux デスクトップ向けのソフトウェアデプロイメントおよびパッケージ管理を行うユーティリティソフトウェアです。Flatpak でインストールされたアプリケーションは、実行時にホスト環境から隔離(サンドボックス 化)されます。
Flatpakは freedesktop.org のプロジェクトとして開始され。以前は xdg-app という名称でした。
いままでブログ記事 [1] [2] で扱った Flatpak へデプロイする hello world のプログラムは、コンソール上で実行するプログラム (CUI) でした。Flatpak はデスクトップ向けソフトウェアを扱っているのですから、GUI プログラムを Flatpak 用のパッケージに作成してみたくなります。そこで、今回のテーマでは GUI プログラムを扱います。
今回のテーマ Meson を利用してビルドする Vala の GUI プログラム (hello.vala) を、Flatpak のパッケージにします。
使用した OS の環境は下記の通りです。
Fedora Silverblue 32
x86_64
» flatpak-1.6.5-1.fc32.x86_64
» flatpak-builder-1.0.10-1.fc32.x86_64
Meson でビルドする GUI プログラム
Vala プログラムと Meson
Vala のサンプルは以前のブログ記事 [3] をベースにしています。ただし、日本語表示が、最初のビルド後の動作確認時に文字化けした(ただし、デプロイ後の文字化け無し)ので、英語表示に直しています。
src/hello.vala
#!/usr/bin/env vala
using Gtk;
public class HelloWorld : Gtk.Window {
public HelloWorld () {
this.destroy.connect (Gtk.main_quit);
this.title = "Hello, World!";
this.border_width = 10;
this.set_default_size (350, 70);
this.window_position = Gtk.WindowPosition.CENTER;
var label = new Gtk.Label ("Hello, World!");
this.add (label);
}
}
public static int main (string[] args) {
Gtk.init (ref args);
HelloWorld app = new HelloWorld ();
app.show_all ();
Gtk.main ();
return 0;
}
meson.build は以前のブログ記事 [4] で紹介した内容をベースに、インストールの機能を追加しています。
src/meson.build
project('vala sample', 'vala', 'c')
dependencies = [
dependency('glib-2.0'),
dependency('gobject-2.0'),
dependency('gtk+-3.0'),
]
sources = files('hello.vala')
executable('hello', sources, dependencies: dependencies, install: true)
マニフェスト
マニフェストは以下のとおりです。ビルドする Vala のソースファイルと Meson ファイルは、作業ディレクトリ内のディレクトリ src 内に保存するようにしました。
また、Flatpak のサンドボックス内で GUI アプリを実行するにあたって、ホスト環境へのアクセス設定 (Sandbox Permissions [5] ) をする必要がありました。この設定について詳しく語るほどの知識が無いので、後日フォローすることにします。今回は、参考サイト [6] の設定を参考にしました。
com.blogspot.bitwalk.Hello.yaml
id: com.blogspot.bitwalk.Hello
runtime: org.gnome.Platform
runtime-version: '3.36'
sdk: org.gnome.Sdk
command: hello
finish-args:
- --socket=pulseaudio
- --socket=x11
- --share=ipc
- --socket=wayland
- --device=dri
- --share=network
- --filesystem=xdg-run/dconf
- --filesystem=~/.config/dconf:ro
- --talk-name=ca.desrt.dconf
- --env=DCONF_USER_CONFIG_DIR=.config/dconf
- --talk-name=org.gnome.OnlineAccounts
- --own-name=org.gnome.FeedReader.ArticleView
- --talk-name=org.freedesktop.Notifications
- --talk-name=org.freedesktop.secrets
- --env=DECSYNC_DIR=.local/share/decsync
- --filesystem=~/.local/share/decsync
modules:
- name: hello
buildsystem: meson
no-autogen: true
sources:
- type: dir
path: src
必要なランタイムと SDK は、org.gnome.Platform と org.freedesktop.Sdk です。インストールされていなければ、flatpak install flathub ... として、あらかじめインストールしておきます。
今回は、$HOME/Projects/com.blogspot.bitwalk.Hello というディレクトリを用意して、ここを作業ディレクトリにしています。サンプルのビルドに使用するファイルとディレクトリの階層構造は下記のようになっています。
com.blogspot.bitwalk.Hello
├── com.blogspot.bitwalk.Hello.yaml
└── src
├── hello.vala
└── meson.build
ビルド
次のようにアプリをビルドします。
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$ flatpak-builder build-dir com.blogspot.bitwalk.Hello.yaml
Downloading sources
Initializing build dir
Committing stage init to cache
Starting build of com.blogspot.bitwalk.Hello
========================================================================
Building module hello in /var/home/bitwalk/Projects/com.blogspot.bitwalk.Hello/.flatpak-builder/build/hello-1
========================================================================
The Meson build system
Version: 0.53.2
Source dir: /run/build/hello
Build dir: /run/build/hello/_flatpak_build
Build type: native build
Project name: vala sample
Project version: undefined
Appending CFLAGS from environment: '-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection'
Appending LDFLAGS from environment: ['-L/app/lib', '-Wl,-z,relro,-z,now', '-Wl,--as-needed']
Appending CFLAGS from environment: '-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection'
Appending LDFLAGS from environment: ['-L/app/lib', '-Wl,-z,relro,-z,now', '-Wl,--as-needed']
C compiler for the host machine: ccache cc (gcc 9.2.0 "cc (GCC) 9.2.0")
C linker for the host machine: cc ld.bfd 2.32
Vala compiler for the host machine: valac (valac 0.48.7)
Host machine cpu family: x86_64
Host machine cpu: x86_64
Found pkg-config: /usr/bin/pkg-config (1.6.3)
Run-time dependency glib-2.0 found: YES 2.64.4
Run-time dependency gobject-2.0 found: YES 2.64.4
Run-time dependency gtk+-3.0 found: YES 3.24.21
Build targets in project: 1
Found ninja-1.9.0 at /usr/bin/ninja
[3/3] Linking target hello.
[0/1] Installing files.
Installing hello to /app/bin
compressing debuginfo in: /var/home/bitwalk/Projects/com.blogspot.bitwalk.Hello/.flatpak-builder/rofiles/rofiles-O9PedF/files/bin/hello
processing: /var/home/bitwalk/Projects/com.blogspot.bitwalk.Hello/.flatpak-builder/rofiles/rofiles-O9PedF/files/bin/hello
[30] .debug_aranges compressed -> .zdebug_aranges (320 => 111 34.69%)
[31] .debug_info compressed -> .zdebug_info (19811 => 11521 58.15%)
[32] .debug_abbrev compressed -> .zdebug_abbrev (1527 => 607 39.75%)
[33] .debug_line compressed -> .zdebug_line (2430 => 1141 46.95%)
[34] .debug_str compressed -> .zdebug_str (14787 => 5864 39.66%)
[35] .debug_loc compressed -> .zdebug_loc (1407 => 344 24.45%)
[36] .debug_ranges compressed -> .zdebug_ranges (272 => 93 34.19%)
[39] Updating section string table
stripping /var/home/bitwalk/Projects/com.blogspot.bitwalk.Hello/.flatpak-builder/rofiles/rofiles-O9PedF/files/bin/hello to /var/home/bitwalk/Projects/com.blogspot.bitwalk.Hello/.flatpak-builder/rofiles/rofiles-O9PedF/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 com.blogspot.bitwalk.Hello]$
動作確認
次のように build-dir を指定して、直接、動作確認します。
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$ flatpak-builder --run build-dir com.blogspot.bitwalk.Hello.yaml hello
(hello:2): dbind-WARNING **: 12:04:27.663 : AT-SPI: Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: org.freedesktop.DBus.Error.ServiceUnknown
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$
localdomain.localhost.Hello の実行例 (1)
警告が出ますが、一応ウィンドウが表示されます。現在の知識では、警告を出ないようにする方法が判りません。ひきつづき調べます。
ローカルリポジトリにビルド
前回 [2] では、複数のプロジェクトで共有できるように、ローカルのリポジトリを $HOME/repo としました。出力先にこのリポジトリを指定して再ビルドします。
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$ flatpak-builder --repo=$HOME/repo --force-clean build-dir com.blogspot.bitwalk.Hello.yaml
Emptying app dir 'build-dir'
Downloading sources
Starting build of com.blogspot.bitwalk.Hello
Cache miss, checking out last cache hit
========================================================================
Building module hello in /var/home/bitwalk/Projects/com.blogspot.bitwalk.Hello/.flatpak-builder/build/hello-1
========================================================================
The Meson build system
...
(途中省略)
...
Content Bytes Written: 32926 (32.9 kB)
Pruning cache
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$
アプリのデプロイ(インストール)と実行結果
ビルドした com.blogspot.bitwalk.Hello をインストール(デプロイ)します。
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$ flatpak list --user
Name Application ID Version Branch
Hello org.gnu.Hello master
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$ flatpak --user install bitwalk com.blogspot.bitwalk.Hello
Looking for matches…
com.blogspot.bitwalk.Hello permissions:
ipc network pulseaudio wayland x11 dri
file access [1] dbus access [2] bus ownership [3]
[1] xdg-run/dconf, ~/.config/dconf:ro, ~/.local/share/decsync
[2] ca.desrt.dconf, org.freedesktop.Notifications, org.freedesktop.secrets, org.gnome.OnlineAccounts
[3] org.gnome.FeedReader.ArticleView
ID Branch Op Remote Download
1. [✓] com.blogspot.bitwalk.Hello master i bitwalk 1.0 kB / 4.1 kB
Installation complete.
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$ flatpak list --user
Name Application ID Version Branch
Hello com.blogspot.bitwalk.Hello master
Hello org.gnu.Hello master
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$
実行結果は以下のようになります。今回は警告が出ませんでした。
[bitwalk@silverblue com.blogspot.bitwalk.Hello]$ flatpak run com.blogspot.bitwalk.Hello
localdomain.localhost.Hello の実行例 (2)
まとめ
パッケージ作成のまとめ 今回取り上げた com.blogspot.bitwalk.Hello は次の手順でデプロイしています。
flatpak-builder build-dir com.blogspot.bitwalk.Hello.yaml
作業ディレクトリ build-dir へアプリ com.blogspot.bitwalk.Hello をビルド
flatpak-builder --run build-dir com.blogspot.bitwalk.Hello.yaml hello
作業ディレクトリ build-dir へビルドしたアプリ com.blogspot.bitwalk.Hello の実行
flatpak-builder --repo=$HOME/repo --force-clean build-dir com.blogspot.bitwalk.Hello.yaml
ローカルリポジトリ $HOME/repo へアプリ com.blogspot.bitwalk.Hello を再ビルド
flatpak --user remote-add --no-gpg-verify bitwalk $HOME/repo
(まだ登録していなければ)ローカルリポジトリ $HOME/repo をシステムのリモート・リポジトリ bitwalk へ追加(登録)
flatpak --user install bitwalk com.blogspot.bitwalk.Hello
リモート・リポジトリ bitwalk へ、アプリ com.blogspot.bitwalk.Hello をインストール(デプロイ)
三回に亘って、Flatpak のパッケージの基本的な作り方をまとめました。しかし本格的に利用するには、まだまだ情報が足りません。今後、不定期になりますが更なる情報を調べてまとめて行く予定です。
GNOME でアプリケーションコンテナを利用するというアイデアからはじまった Flatpak(旧称:xdg-app)のプロジェクトですが、他にも Ubuntu の Canonical 社が推進する Snap などの類似技術があるので、将来 Flatpak が主流になるかどうかは判りません。ただ、Fedora Workstation や Silverblue では Flatpak はデフォルトで利用できるようになっているので、Fedora をメインに使っている者としては、まず Flatpak から勉強をはじめています。
参考サイト
bitWalk's: はじめての Flatpak パッケージ作成 [2020-08-08]
bitWalk's: はじめての Flatpak パッケージ作成 (2) [2020-08-10]
bitWalk's: Vala でオブジェクト指向プログラミング [2020-06-22]
bitWalk's: Vala と Meson [2020-06-20]
Sandbox Permissions — Flatpak documentation
Packaging Tutorial :: Fedora Docs Site
VIDEO
にほんブログ村