2020-08-10

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

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

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

Wikipedia より引用・編集

先日の本ブログ記事 [1] で Flatpak のパッケージの作成方法をまとめましたが、引用した hello world が、文字列を表示するシェルスクリプトだったため、SDK との関わりが見えませんでした。そこで、他に例がないか探したところ、下記のサイトに C プログラムでコンパイルする hello world プログラムを利用した例が紹介されていました。

これを、自分の環境で試してみました。使用した OS の環境は下記の通りです。

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

GNU Autotools でビルドするプログラム

今回は GNU のサイトで公開されている hello world のプログラムを扱います。このサンプルは、GNU Autotools を用いて C ソースをコンパイルしてビルドします。

今回のテーマ

GNU Autotools を利用してビルドする C のプログラムを、Flatpak のパッケージにします。

マニフェスト

マニフェストは以下のとおりです。

org.gnu.Hello.yml
id: org.gnu.Hello
runtime: org.freedesktop.Platform
runtime-version: '19.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

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

必要なランタイムと SDK は、前回 [1] と同じ org.freedesktop.Platformorg.freedesktop.Sdk です。

[bitwalk@silverblue org.gnu.Hello]$ flatpak list | grep Freedesktop
Freedesktop Platform org.freedesktop.Platform 19.08.12 19.08 flathub system
Freedesktop SDK org.freedesktop.Sdk 19.08.12 19.08 flathub system
[bitwalk@silverblue org.gnu.Hello]$ 

今回は、$HOME/Projects/org.gnu.Hello というディレクトリを用意して、ここを作業ディレクトリにしています。ソースはインターネットからダウンロードしますので、ビルドに必要なのは YAML 形式のマニフェスト org.gnu.Hello.yml だけです。

[bitwalk@silverblue org.gnu.Hello]$ ls -a
.  ..  org.gnu.Hello.yml
[bitwalk@silverblue org.gnu.Hello]$ 

ビルド

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

[bitwalk@silverblue org.gnu.Hello]$ flatpak-builder build-dir org.gnu.Hello.yml
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   417k      0  0:00:01  0:00:01 --:--:--  417k
Initializing build dir
Committing stage init to cache
Starting build of org.gnu.Hello
========================================================================
Building module hello in /var/home/bitwalk/Projects/org.gnu.Hello/.flatpak-builder/build/hello-1
========================================================================
checking for a BSD-compatible install... /usr/bin/install -c
...
(途中省略)
...
configure: creating ./config.status
config.status: creating Makefile
...
(途中省略)
...
make  all-recursive
make[1]: Entering directory '/run/build/hello'
Making all in po
make[2]: Entering directory '/run/build/hello/po'
...
(途中省略)
...
depbase=`echo src/hello.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
gcc -DLOCALEDIR=\"/app/share/locale\" -DHAVE_CONFIG_H -I.  -Ilib -I./lib -Isrc -I./src   -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 -MT src/hello.o -MD -MP -MF $depbase.Tpo -c -o src/hello.o src/hello.c &&\
...
(途中省略)
...
make[1]: Leaving directory '/run/build/hello'
make  install-recursive
make[1]: Entering directory '/run/build/hello'
...
(途中省略)
...
stripping /var/home/bitwalk/Projects/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-N1MqOY/files/bin/hello to /var/home/bitwalk/Projects/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-N1MqOY/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.yml hello
Hello, world!
[bitwalk@silverblue org.gnu.Hello]$ 

リポジトリにビルド結果を出力

前回 [1] は、作業ディレクトリ内に repo を指定してレポジトリ内でビルドする例を紹介しましたが、複数のプロジェクトで共有できるように、ローカルのリポジトリを $HOME/repo としました。出力先にこのリポジトリを指定して再コンパイルします。

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

リポジトリの登録

Flatpak のリモート・リポジトリに、$HOME/repobitwalk という名前で登録します。

[bitwalk@silverblue org.gnu.Hello]$ flatpak remotes
Name    Options
fedora  system,oci
flathub system
[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]$ 

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

ビルドした 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.0 kB

Installation complete.
[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]$ 

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

[参考]フツーにビルドしてみた

hello-2.10.tar.gz を解凍して、フツーにビルドしてみました。

上記 Fedora Siliverblue では、通常の開発環境を利用できないので、GNU Autotools などの開発環境を揃えている下記の環境を使っています。

Fedora Workstation 32 x86_64

https://ftp.gnu.org/gnu/hello/ から tar zxvf hello-2.10.tar.gz をダウンロードして解凍します。

[bitwalk@fedora-pc ダウンロード]$ tar zxvf hello-2.10.tar.gz
hello-2.10/
hello-2.10/COPYING
...
(途中省略)
...
hello-2.10/contrib/de_franconian_po.txt
[bitwalk@fedora-pc ダウンロード]$ 

configure を実行して、Makefile を生成します。

[bitwalk@fedora-pc ダウンロード]$ cd hello-2.10
[bitwalk@fedora-pc hello-2.10]$ ls
ABOUT-NLS  ChangeLog    INSTALL      NEWS        README-release  aclocal.m4  configure     doc      m4        po
AUTHORS    ChangeLog.O  Makefile.am  README      THANKS          build-aux   configure.ac  hello.1  maint.mk  src
COPYING    GNUmakefile  Makefile.in  README-dev  TODO            config.in   contrib       lib      man       tests
[bitwalk@fedora-pc hello-2.10]$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
...
(途中省略)
...
configure: creating ./config.status
config.status: creating Makefile
config.status: creating po/Makefile.in
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
[bitwalk@fedora-pc hello-2.10]$ 

make とタイプして Makefile に沿ったビルドをします。

[bitwalk@fedora-pc hello-2.10]$ make
rm -f lib/configmake.h-t && \
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
...
(途中省略)
...
mv lib/wctype.h-t lib/wctype.h
make  all-recursive
make[1]: Entering directory '/home/bitwalk/ダウンロード/hello-2.10'
Making all in po
make[2]: Entering directory '/home/bitwalk/ダウンロード/hello-2.10/po'
...
(途中省略)
...
depbase=`echo src/hello.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
gcc -DLOCALEDIR=\"/usr/local/share/locale\" -DHAVE_CONFIG_H -I.  -Ilib -I./lib -Isrc -I./src   -g -O2 -MT src/hello.o -MD -MP -MF $depbase.Tpo -c -o src/hello.o src/hello.c &&\
mv -f $depbase.Tpo $depbase.Po
gcc  -g -O2   -o hello src/hello.o  ./lib/libhello.a 
rm -f lib/charset.alias-t lib/charset.alias && \
/bin/sh ./lib/config.charset 'x86_64-unknown-linux-gnu' > lib/charset.alias-t && \
mv lib/charset.alias-t lib/charset.alias
rm -f lib/ref-add.sed-t lib/ref-add.sed && \
sed -e '/^#/d' -e 's/@''PACKAGE''@/hello/g' lib/ref-add.sin > lib/ref-add.sed-t && \
mv lib/ref-add.sed-t lib/ref-add.sed
rm -f lib/ref-del.sed-t lib/ref-del.sed && \
sed -e '/^#/d' -e 's/@''PACKAGE''@/hello/g' lib/ref-del.sin > lib/ref-del.sed-t && \
mv lib/ref-del.sed-t lib/ref-del.sed
make[2]: Leaving directory '/home/bitwalk/ダウンロード/hello-2.10'
make[1]: Leaving directory '/home/bitwalk/ダウンロード/hello-2.10'
[bitwalk@fedora-pc hello-2.10]$ 

ここでは、実際に実機のシステムツリー内にインストールするのではなく、パッケージの配布用として DESTDIR にインストール先のルートディレクトリを指定した上で、make install コマンドでインストールします。

[bitwalk@fedora-pc hello-2.10]$ make DESTDIR=$HOME/test install
make  install-recursive
make[1]: Entering directory '/home/bitwalk/ダウンロード/hello-2.10'
Making install in po
make[2]: Entering directory '/home/bitwalk/ダウンロード/hello-2.10/po'
installing bg.gmo as /home/bitwalk/test/usr/local/share/locale/bg/LC_MESSAGES/hello.mo
...
(途中省略)
...
 /usr/bin/mkdir -p '/home/bitwalk/test/usr/local/share/info'
 /usr/bin/install -c -m 644 ./doc/hello.info '/home/bitwalk/test/usr/local/share/info'
 /usr/bin/mkdir -p '/home/bitwalk/test/usr/local/share/man/man1'
 /usr/bin/install -c -m 644 hello.1 '/home/bitwalk/test/usr/local/share/man/man1'
make[3]: Leaving directory '/home/bitwalk/ダウンロード/hello-2.10'
make[2]: Leaving directory '/home/bitwalk/ダウンロード/hello-2.10'
make[1]: Leaving directory '/home/bitwalk/ダウンロード/hello-2.10'
[bitwalk@fedora-pc hello-2.10]$ 

tree コマンドでインストール先を確認しました。

[bitwalk@fedora-pc hello-2.10]$ tree $HOME/test
/home/bitwalk/test
└── usr
    └── local
        ├── bin
        │   └── hello
        └── share
            ├── info
            │   └── hello.info
            ├── locale
            │   ├── bg
            │   │   └── LC_MESSAGES
            │   │       └── hello.mo
...
(途中省略)
...
            │   ├── ja
            │   │   └── LC_MESSAGES
            │   │       └── hello.mo
...
(途中省略)
...
            │   └── zh_TW
            │       └── LC_MESSAGES
            │           └── hello.mo
            └── man
                └── man1
                    └── hello.1

92 directories, 45 files
[bitwalk@fedora-pc hello-2.10]$ 

参考サイト

  1. bitWalk's: はじめての Flatpak パッケージ作成 [2020-08-08]
  2. How to build a Flatpak | Opensource.com

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

0 件のコメント: