Flatpak は、Linux デスクトップ向けのソフトウェアデプロイメントおよびパッケージ管理を行うユーティリティソフトウェアです。Flatpak でインストールされたアプリケーションは、実行時にホスト環境から隔離(サンドボックス化)されます。
Flatpakは freedesktop.org のプロジェクトとして開始され。以前は xdg-app という名称でした。
先日の本ブログ記事 [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 のパッケージにします。
マニフェスト
マニフェストは以下のとおりです。
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.Platform と org.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/repo を bitwalk という名前で登録します。
[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]$
参考サイト
にほんブログ村
0 件のコメント:
コメントを投稿