2020-08-11

はじめての Flatpak パッケージ作成 (3)

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

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

Wikipedia より引用・編集

いままでブログ記事 [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.Platformorg.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 は次の手順でデプロイしています。

  1. flatpak-builder build-dir com.blogspot.bitwalk.Hello.yaml
    • 作業ディレクトリ build-dir へアプリ com.blogspot.bitwalk.Hello をビルド
  2. flatpak-builder --run build-dir com.blogspot.bitwalk.Hello.yaml hello
    • 作業ディレクトリ build-dir へビルドしたアプリ com.blogspot.bitwalk.Hello の実行
  3. flatpak-builder --repo=$HOME/repo --force-clean build-dir com.blogspot.bitwalk.Hello.yaml
    • ローカルリポジトリ $HOME/repo へアプリ com.blogspot.bitwalk.Hello を再ビルド
  4. flatpak --user remote-add --no-gpg-verify bitwalk $HOME/repo
    • (まだ登録していなければ)ローカルリポジトリ $HOME/repo をシステムのリモート・リポジトリ bitwalk へ追加(登録)
  5. 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 から勉強をはじめています。

参考サイト

  1. bitWalk's: はじめての Flatpak パッケージ作成 [2020-08-08]
  2. bitWalk's: はじめての Flatpak パッケージ作成 (2) [2020-08-10]
  3. bitWalk's: Vala でオブジェクト指向プログラミング [2020-06-22]
  4. bitWalk's: Vala と Meson [2020-06-20]
  5. Sandbox Permissions — Flatpak documentation
  6. Packaging Tutorial :: Fedora Docs Site

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

0 件のコメント: