2020-08-08

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

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

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

Wikipedia より引用・編集

Hello World プログラムなんて文字列を表示するだけのプログラムですが、Flarpak のアプリをビルドする基本的な流れを理解するのに役立ちます。下記のサイトで紹介されている「はじめての Flatpak ビルド - Building your first Flatpak」にしたがって、Flatpak パッケージをビルドする流れをまとめました。

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

Fedora Silverblue 32 x86_64
» flatpak-1.6.5-1.fc32.x86_64
» flatpak-builder-1.0.10-1.fc32.x86_64

準備

まず、今回のパッケージ作成では flathub のリポジトリを利用することを前提としていますので、下記を実行しておきます。

[bitwalk@silverblue ~]$ flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

また、Flatpak のパッケージを作成するには flatpak-builder をインストールしておく必要があります。Fedora Silverblue 32 では、既にインストールされていました。

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

Hello World!

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

Flatpak では、アプリが依存する基本的なライブラリにアクセスするために使用するランタイムを指定する必要があります。また、各ランタイムに対応して、アプリのビルドに必要なヘッダと開発ツールが含まれている SDK, Software Development Kit を利用できます。この SDK は、ランタイムを使うアプリをビルドする際に必要となります。

ここでは、Freedesktop 19.08 のランタイムと SDK を使用します。現在インストールされているパッケージを flatpak list コマンドで確認すると、既に Freedesktop 19.08 のランタイム, org.freedesktop.Platform がインストールされていることを確認できます。

[bitwalk@silverblue ~]$ flatpak list
Name                                  Application ID                                    Version         Branch Origin  Installation
Skype                                 com.skype.Client                                  8.63.0.76       stable flathub system
Transmission                          com.transmissionbt.Transmission                                   stable fedora  system
WPS Office                            com.wps.Office                                    11.1.0.9615     stable flathub system
Fedora Media Writer                   org.fedoraproject.MediaWriter                     4.1.4           stable fedora  system
Platform                              org.fedoraproject.Platform                                        f32    fedora  system
Freedesktop Platform                  org.freedesktop.Platform                          19.08.12        19.08  flathub system
default                               org.freedesktop.Platform.GL.default                               19.08  flathub system
...
(以下省略)
...
[bitwalk@silverblue ~]$ 

Freedesktop 19.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/19.08
   2) runtime/org.freedesktop.Sdk/x86_64/18.08
   3) runtime/org.freedesktop.Sdk/x86_64/1.6

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


        ID                                   Branch          Op          Remote           Download
 1. [✓] org.freedesktop.Sdk.Locale           19.08           i           flathub           61.8 kB / 322.4 MB
 2. [✓] org.freedesktop.Sdk                  19.08           i           flathub          386.2 MB / 578.9 MB

Installation complete.
[bitwalk@silverblue ~]$ 

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

[bitwalk@silverblue ~]$ flatpak list
Name                                  Application ID                                    Version         Branch Origin  Installation
Skype                                 com.skype.Client                                  8.63.0.76       stable flathub system
Transmission                          com.transmissionbt.Transmission                                   stable fedora  system
WPS Office                            com.wps.Office                                    11.1.0.9615     stable flathub system
Fedora Media Writer                   org.fedoraproject.MediaWriter                     4.1.4           stable fedora  system
Platform                              org.fedoraproject.Platform                                        f32    fedora  system
Freedesktop Platform                  org.freedesktop.Platform                          19.08.12        19.08  flathub system
default                               org.freedesktop.Platform.GL.default                               19.08  flathub system
Intel                                 org.freedesktop.Platform.VAAPI.Intel                              19.08  flathub system
openh264                              org.freedesktop.Platform.openh264                 2.1.0           2.0    flathub system
Freedesktop SDK                       org.freedesktop.Sdk                               19.08.12        19.08  flathub system
...
(以下省略)
...
[bitwalk@silverblue ~]$ 

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

  • フォルダ名に、「プロジェクト」のように日本語名を使ったところ、ビルドのテストなどで不具合を確認しました。今のところ、'Projects' のように ASCII のアルファベットを使用した方が無難です。
[bitwalk@silverblue ~]$ cd Projects/hello_flatpak
[bitwalk@silverblue hello_flatpak]$ 

2. アプリの作成

今回作成するアプリは、文字列を出力するだけのシンプルなスクリプトです。

hello.sh
#!/bin/sh
echo "こんにちは、世界!, from a sandbox"

適当なテキストエディタを使って、上記スクリプトをコピーして hello.sh として保存します。

[bitwalk@silverblue hello_flatpak]$ vi hello.sh
[bitwalk@silverblue hello_flatpak]$ ls
hello.sh
[bitwalk@silverblue hello_flatpak]$ sh ./hello.sh
こんにちは、世界!, from a sandbox
[bitwalk@silverblue hello_flatpak]$ 

3. マニフェストの追加

Flatpak のアプリは、アプリの基本情報とビルド方法が記載されているマニフェストを使用してビルドされます。hello world アプリ (hello.sh) と同じディレクトリに下記の内容のマニフェストを保存します。

org.flatpak.Hello.yml
app-id: org.flatpak.Hello
runtime: org.freedesktop.Platform
runtime-version: '19.08'
sdk: org.freedesktop.Sdk
command: hello.sh
modules:
  - name: hello
    buildsystem: simple
    build-commands:
      - install -D hello.sh /app/bin/hello.sh
    sources:
      - type: file
        path: hello.sh

適当なテキストエディタで、上記内容のマニフェスト org.flatpak.Hello.yml を作成します。

[bitwalk@silverblue hello_flatpak]$ vi org.flatpak.Hello.yml
[bitwalk@silverblue hello_flatpak]$ ls
hello.sh  org.flatpak.Hello.yml
[bitwalk@silverblue hello_flatpak]$ 

4. アプリのビルド

アプリとマニフェスト準備できたので、flatpak-builder コマンドで出力先 build-dir を指定してビルドします。

[bitwalk@silverblue hello_flatpak]$ flatpak-builder build-dir org.flatpak.Hello.yml
Downloading sources
Initializing build dir
Committing stage init to cache
Starting build of org.flatpak.Hello
========================================================================
Building module hello in /var/home/bitwalk/Projects/hello_flatpak/.flatpak-builder/build/hello-1
========================================================================
Running: install -D hello.sh /app/bin/hello.sh
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 hello_flatpak]$ ls -a
.  ..  .flatpak-builder  build-dir  hello.sh  org.flatpak.Hello.yml
[bitwalk@silverblue hello_flatpak]$ 

生成されたディレクトリ build-dir の中を少し確認すると以下のようになっています。

[bitwalk@silverblue hello_flatpak]$ ls build-dir
export  files  metadata  var
[bitwalk@silverblue hello_flatpak]$ ls build-dir/files
bin  manifest.json
[bitwalk@silverblue hello_flatpak]$ ls build-dir/files/bin
hello.sh
[bitwalk@silverblue hello_flatpak]$ 

5. ビルドのテスト

ビルドした結果をテストするには、次のようにしてビルド&インストール (build-dir) して flatpak run で確認します。

[bitwalk@silverblue hello_flatpak]$ flatpak remotes
Name    Options
fedora  system,oci
flathub system
[bitwalk@silverblue hello_flatpak]$ flatpak-builder --force-clean --user --install build-dir org.flatpak.Hello.yml
Emptying app dir 'build-dir'
Downloading sources
Starting build of org.flatpak.Hello
Cache hit for hello, skipping build
Cache hit for cleanup, skipping
Cache hit for finish, skipping
Everything cached, checking out from cache
Exporting org.flatpak.Hello to repo
Commit: 8c68d94fc864e2ccab9f41e5e0868e81044a11a713e59cefd59c8651510686e3
Metadata Total: 9
Metadata Written: 2
Content Total: 3
Content Written: 0
Content Bytes Written: 0 (0 bytes)
Installing app/org.flatpak.Hello/x86_64/master
Pruning cache
[bitwalk@silverblue hello_flatpak]$ flatpak remotes
Name         Options
fedora       system,oci
flathub      system
hello-origin user,no-enumerate,no-gpg-verify
[bitwalk@silverblue hello_flatpak]$ flatpak list --user
Name       Application ID         Version      Branch
Hello      org.flatpak.Hello                   master
[bitwalk@silverblue hello_flatpak]$ 

flatpak run コマンドで org.flatpak.Hello を実行します。

[bitwalk@silverblue hello_flatpak]$ flatpak run org.flatpak.Hello
こんにちは、世界!, from a sandbox
[bitwalk@silverblue hello_flatpak]$ 

アプリを実行できることを確認できました。

6. アプリをリポジトリに入れる

アプリを共有したい場合は、名前を付けたリポジトリ(ディレクトリ、この例では repo)にビルドの結果を出力することができます。flatpak-builder--repo 引数を渡すことで行います。

[bitwalk@silverblue hello_flatpak]$ flatpak-builder --repo=repo --force-clean build-dir org.flatpak.Hello.yml
Emptying app dir 'build-dir'
Downloading sources
Starting build of org.flatpak.Hello
Cache hit for hello, skipping build
Cache hit for cleanup, skipping
Cache hit for finish, skipping
Everything cached, checking out from cache
Exporting org.flatpak.Hello to repo
Commit: 3ae9a852e6b06edfb41889cb0e9477d5af770b221d26542ab9d52758ba6b3d0b
Metadata Total: 9
Metadata Written: 6
Content Total: 3
Content Written: 3
Content Bytes Written: 814 (814 bytes)
Pruning cache
[bitwalk@silverblue hello_flatpak]$ 

7. アプリのインストール

先ほど作成したリポジトリ repo を Flatpak が管理しているリモートリポジトリのリストに tutorial-repo として追加します。

[bitwalk@silverblue hello_flatpak]$ flatpak --user remote-add --no-gpg-verify tutorial-repo repo
[bitwalk@silverblue hello_flatpak]$ ls -a
.  ..  .flatpak-builder  build-dir  hello.sh  org.flatpak.Hello.yml  repo
[bitwalk@silverblue hello_flatpak]$ flatpak remotes
Name          Options
fedora        system,oci
flathub       system
tutorial-repo user,no-gpg-verify
hello-origin  user,no-enumerate,no-gpg-verify
[bitwalk@silverblue hello_flatpak]$ 

hello world のアプリ org.flatpak.Hellotutorial-repo にインストールしようとすると、既に(ビルドのテスト用に作成した)hello-origin にインストールされているというエラーが出るので、hello-origin を削除して、もう一度、インストールを実行します。

[bitwalk@silverblue hello_flatpak]$ flatpak --user install tutorial-repo org.flatpak.Hello
Looking for matches…
error: org.flatpak.Hello/x86_64/master is already installed from remote hello-origin
[bitwalk@silverblue hello_flatpak]$ flatpak remote-delete hello-origin
The following refs are installed from remote 'hello-origin':

   1) app/org.flatpak.Hello/x86_64/master

Remove them? [y/n]: y
Uninstalling app/org.flatpak.Hello/x86_64/master
[bitwalk@silverblue hello_flatpak]$ flatpak --user install tutorial-repo org.flatpak.Hello
Looking for matches…


        ID                         Branch          Op          Remote                 Download
 1. [✓] org.flatpak.Hello          master          i           tutorial-repo          1.0 kB / 587 bytes

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

この場合、リポジトリとアプリがシステム全体ではなく、ユーザーごとに追加されます。

なお、アプリがビルドされたときに GPG キーが指定されていなかったため、リポジトリは --no-gpg-verify で追加されています。公式リポジトリの場合はプライベートな GPG キーで署名する必要があります。

8. アプリを実行する

以下のコマンドでアプリを実行することができます。

[bitwalk@silverblue hello_flatpak]$ cd ~/
[bitwalk@silverblue ~]$ flatpak run org.flatpak.Hello
こんにちは、世界!, from a sandbox
[bitwalk@silverblue ~]$ 

ちなみに、アプリの実体は以下にあります。

[bitwalk@silverblue hello_flatpak]$ ls $HOME/.local/share/flatpak
app  db  exports  repo
[bitwalk@silverblue hello_flatpak]$ ls $HOME/.local/share/flatpak/app
org.flatpak.Hello
[bitwalk@silverblue hello_flatpak]$ ls $HOME/.local/share/flatpak/app/org.flatpak.Hello
current  x86_64
[bitwalk@silverblue hello_flatpak]$ ls $HOME/.local/share/flatpak/app/org.flatpak.Hello/current
5bc54b69d7f13907c34e91558a8e98e866001a0c3307cee361df10a09c6f44d0  active
[bitwalk@silverblue hello_flatpak]$ ls $HOME/.local/share/flatpak/app/org.flatpak.Hello/current/active
deploy  export  files  metadata
[bitwalk@silverblue hello_flatpak]$ ls $HOME/.local/share/flatpak/app/org.flatpak.Hello/current/active/files
bin  manifest.json
[bitwalk@silverblue hello_flatpak]$ ls $HOME/.local/share/flatpak/app/org.flatpak.Hello/current/active/files/bin
hello.sh
[bitwalk@silverblue hello_flatpak]$ 

まとめ

シンプルなサンプルで Flatpak パッケージを作成する流れを確認できました。流れは大体判ったものの、具体的なアプリを Flatpak のパッケージにするには、まだまだ覚えなければないないことがありそうです。当面のゴールを、GNOME あるいは GTK+ アプリを Flatpak のパッケージにすることとして、確認できたことをまとめて行く予定です。

なお、本ブログ記事は、経験が浅いテーマを扱っているため、不正確な表現や間違いが多くある可能性があります。気が付いた時点で修正していることをご了承下さい。

参考サイト

  1. Building your first Flatpak — Flatpak documentation

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

0 件のコメント: