おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

UBUNTUにgtk4をインストール

(注 2021/5/13) この記事は現在では古くなっています。

  • Arch, Debian, Ubuntu, Fedoraの最新版では、GTK4パッケージがあるので、ソースからインストールする必要はありません。
  • 仮にソースからインストールするにしても、前提条件となる諸ライブラリが各ディストリビューションでパッケージ化されているので、ソースからインストールする必要がありません。

Ubuntu 21.04では、

$ sudo apt-get install libgtk-4-bin libgtk-4-common libgtk-4-dev libgtk-4-doc

でgtk4のパッケージをインストールできます。

以下に当時の記述は残しておきますが、多くの人には必要のない記事になっています。

gtk4をubuntuにインストール

前回のブログで、gtk4をChromebookのLinux(ベータ版)にインストールしたことを書きました。 gtk4自体には問題はないのですが、Chromebookのウィンドウ・マネージャーはubuntuと違って、ウィンドウ・タイトルが表示されないようです。 それで、やはりubuntuでgtk4を動かしたくなりました。

gtk4を/usr/localに入れると、nautilusなどのGUIを使った既存のアプリケーションに問題が出ることは分かっていたので(それに気づかなかった自分が情けない・・・)、 今回はユーザディレクトリにインストールすることにしました。 mesonでコンパイル環境を整えるときに、インストール先のディレクトリを指定できます。

$ meson --prefix $HOME/local _build

このようにして、ユーザディレクトリ下のlocalフォルダにインストールすることにしました。 gtk4のインストールの必要条件として、glib, pango, gdk-pixbuf, gtk-docをソースファイルからビルド、インストールする必要がありました。 順を追って説明します。

glibのインストール

glibの前提条件として、必要なパッケージをapt-getを使ってインストールしておきます。 まず、ソースファイルをダウンロードします。

$ wget https://download.gnome.org/sources/glib/2.67/glib-2.67.1.tar.xz
$ tar -Jxf glib-2.67.1.tar.xz

必要なパッケージは、mesonでglibのコンパイル環境を整えるときのメッセージを見れば分かります。 コンパイルとインストールは、次のようにします。

$ meson --prefix $HOME/local _build
$ ninja -C _build
$ ninja -C _build install

インストール先がユーザ領域なので、インストール時にsudoは要りません。 インストールしたglibライブラリをその後にコンパイルするpango, gdk-pixbuf, gtk-doc, gtk4で使うので、環境変数を整えておく必要があります。 そこで、次のようなファイルenv.shを作ります。

# compiler
CPPFLAGS="-I$HOME/local/include"
LDFLAGS="-L$HOME/local/lib"
PKG_CONFIG_PATH="$HOME/local/lib/pkgconfig:$HOME/local/lib/x86_64-linux-gnu/pkgconfig"
export CPPFLAGS LDFLAGS PKG_CONFIG_PATH
# linker
LD_LIBRARY_PATH="$HOME/local/lib/x86_64-linux-gnu/"
PATH="$HOME/local/bin:$PATH"
export LD_LIBRARY_PATH PATH

そして、bashにこれを取り込むのですが、ピリオド(.)またはsourceコマンドを使います。 この2つは同じコマンドだと思って構いません。 このコマンドは、現在のシェル(子シェルではない)の中でファイルを読み、コマンドを実行します。 「現在のシェルで」というところが、シェル・スクリプトと違います。 (シェル・スクリプトは、子プロセスのbashを起動してスクリプトを実行させる)。 したがって、exportコマンドによる環境変数の定義は現在のシェルの中で行われます。

(注)もしも子シェルでexportしても、現在のシェルの環境変数はなんらその影響を受けません。 もし、env.shをシェル・スクリプトとして実行すると、環境変数の定義は子シェルで実行され、スクリプトの終了とともに子シェルも終了します。 その結果、親シェルに戻ったときには環境変数は元のままになっており、env.shの実行は何の意味もなくなってしまいます。

$ . env.sh

または、

$ source env.sh

pangoのインストール

まずは、ソースファイルのダウンロードです。

$ wget https://download.gnome.org/sources/pango/1.48/pango-1.48.0.tar.xz
$ tar -Jxf pango-1.48.0.tar.xz

コンパイルの方法はglibと同じです。 mesonにライブラリが足りないと文句を言われたら、apt-getでパッケージをインストールしてください。

$ meson --prefix $HOME/local _build
$ ninja -C _build
$ ninja -C _build install

インストールでは、Pango-1.0.girなどのファイルを、$HOME/local/share/gir-1.0の下に配置します。 もしも、prefixが変更されなければ、/usr/local/share/gir-1.0に配置されるべきところです。 このshareディレクトリは、XDG_DATA_DIRSという環境変数に保存されていて、各プログラムはそれを使ってサーチします。 例えば、/usr/shareや/usr/local/shareなどがXDG_DATA_DIRSに書かれています。 そのため、$HOME/local/shareも追加しないと、後のコンパイルでエラーが発生することがあります。

$ export XDG_DATA_DIRS=$HOME/local/share:$XDG_DATA_DIRS

gdk-pixbuf, gtk-docのインストール

ソースファイルのダウンロード。

$ wget https://download.gnome.org/sources/gdk-pixbuf/2.42/gdk-pixbuf-2.42.2.tar.xz
$ tar -Jxf gdk-pixbuf-2.42.2.tar.xz
$ wget https://download.gnome.org/sources/gtk-doc/1.33/gtk-doc-1.33.1.tar.xz
$ tar -Jxf gtk-doc-1.33.1.tar.xz

各々のコンパイル、必要なパッケージのapt-getでのインストールは同様です。

gtk-docは、pkg-configのためのファイルを$HOME/local/shareに置くので、PKG_CONFIG_PATHにそれを追加しなければなりません。

$ export PKG_CONFIG_PATH="$HOME/local/share/pkgconfig:$PKG_CONFIG_PATH"

gtk4のインストール

ソースファイルは、開発中のgitレポジトリから最新のものをコピーし、今後も必要に応じて最新版に更新することにします。 そのためには、git cloneコマンドを用います。 gitが必要なので、apt-getでインストールしておきます。

$ git clone https://gitlab.gnome.org/GNOME/gtk.git

クローンには少し時間がかかります。 今後最新版にしたいときには、

$ git pull

でダウンロードできます。 現在も活発にgtk4は更新が続いています。

コンパイルは今までと同様です。

$ meson --prefix $HOME/local _build
$ ninja -C _build
$ ninja -C _build install

env.shの更新

これまで環境変数を3回に分けて定義しました。 環境変数は一度ログアウトすると消えてしまいます。 ですので、gtk4を使ってコンパイルをしたいときに、改めて環境変数を定義しなければなりません。 そのためのenv.shを更新しておきましょう。

# compiler
CPPFLAGS="-I$HOME/local/include"
LDFLAGS="-L$HOME/local/lib"
PKG_CONFIG_PATH="$HOME/local/lib/pkgconfig:$HOME/local/lib/x86_64-linux-gnu/pkgconfig:$HOME/local/share/pkgconfig"
export CPPFLAGS LDFLAGS PKG_CONFIG_PATH
# linker
LD_LIBRARY_PATH="$HOME/local/lib/x86_64-linux-gnu/"
PATH="$HOME/local/bin:$PATH"
export LD_LIBRARY_PATH PATH
# gir
XDG_DATA_DIRS=$HOME/local/share:$XDG_DATA_DIRS
export XDG_DATA_DIRS

このスクリプトを.profileに書いておけば、ログイン時に自動的に設定されて便利だと思う人がいるかもしれません。 しかし、これらの環境変数はgtk4のコンパイルの時のみに必要なもので、通常のubuntuアプリケーションには不必要で、場合によっては有害なものです。 ですので、.profileに書くのはお勧めしません。 gtk4を使う場合のみenv.shを取り込んで設定してください。

gtk4を使ったプログラムのコンパイル

コンパイルには、事前に環境変数の設定が必要です。

$ . env.sh

その後は、普通にコンパイルできます。 例えば、sample.cというプログラムをコンパイルするには、

$ gcc `pkg-config --cflags gtk4` sample.c `pkg-config --libs gtk4`

とします。

普通はコマンドをこのように打つのではなく、make, rake, mesonとninja のいずれかを使うことが多いと思います。 詳しいことは、gtk4_tutorialが参考になります。 ただし、このチュートリアルは英語であり、まだ書きかけで、内容も頻繁に更新されているのでご注意ください。