BlinkGTK を使ったアプリのビルド

BlinkGTK を組み込んだアプリケーションをビルドするための最小限の手引きです。

前提: BlinkGTK 本体はソースからビルドしません

BlinkGTK は Chromium を組み込んでいるため、本体のビルドには Chromium の
ソースツリー (100 GB 超) と数時間から十数時間のビルド時間を要します。
利用者は配布されているパッケージを使ってください。 本ページは
「配布パッケージを使ってアプリをビルドする」手順を説明します。

配布形態は 3 つに分かれています。

パッケージ 用途
runtime 共有ライブラリと Chromium ランタイム。実行に必要
devel ヘッダと .pcビルドに必要
gir GObject Introspection typelib。Python / GJS から使う場合に必要

1. インストール

# Fedora
sudo dnf install ./blinkgtk-bin-1.2.0-build2.fc44.x86_64.rpm \
                 ./blinkgtk-bin-devel-1.2.0-build2.fc44.x86_64.rpm

# Debian / Ubuntu
sudo dpkg -i ./libblinkgtk-0.1-0_1.2.0-build2_amd64.deb \
             ./libblinkgtk-0.1-dev_1.2.0-build2_amd64.deb

tarball を使う場合は任意の場所に展開し、pkg-config に場所を教えます。

tar xzf blinkgtk-1.2.0-build2-linux-x86_64.tar.gz -C /opt/blinkgtk
export PKG_CONFIG_PATH=/opt/blinkgtk/usr/lib64/pkgconfig:$PKG_CONFIG_PATH

2. 必ず pkg-config 経由でリンクする

これが最も間違えやすく、最も分かりにくい失敗を招く点です。

cc -o myapp myapp.c $(pkg-config --cflags --libs blinkgtk-0.1)

-lblinkgtk だけを手で書いてリンクしないでください。BlinkGTK は Chromium の
PartitionAlloc allocator shim を必要とし、これは実行ファイルの直接依存
(DT_NEEDED) として早期にロードされなければなりません。blinkgtk-0.1.pc
Libs にはこの shim が含まれています。

shim を落とすと、ビルドもリンクも通り、起動もするのに ページの読み込みが
完了しない
(ナビゲーションが commit しない = 白いまま) という、原因の分かり
にくい症状になります。

確認方法:

readelf -d ./myapp |

grep allocator_shim
# 1 行以上出れば OK。何も出なければ pkg-config を経由していない
#include <blink_gtk/blink_gtk.h>
#include <gtk/gtk.h>

公開 API はこのヘッダに集約されています。内部ヘッダを直接インクルードしないで
ください (バージョン間で変わります)。

4. 最小構成のアプリ

BlinkGTK アプリケーションのライフサイクル。リソースの場所指定、blink_gtk_init、ウィンドウと WebView の作成、読み込みとメインループ、終了処理の 5 段。

呼び出しの順序が重要です。特に blink_gtk_init() は GTK より先に呼びます。

#include <blink_gtk/blink_gtk.h>
#include <gtk/gtk.h>

static void on_activate(GtkApplication *app, gpointer user_data) {
    GtkWidget *win = gtk_application_window_new(app);
    gtk_window_set_default_size(GTK_WINDOW(win), 1024, 768);

    GtkWidget *view = blink_web_view_new();
    gtk_window_set_child(GTK_WINDOW(win), view);
    gtk_widget_set_visible(win, TRUE);

    blink_web_view_load_uri(BLINK_WEB_VIEW(view), "https://example.com/");
}

int main(int argc, char **argv) {
    blink_gtk_init(&argc, &argv);
    GtkApplication *app = gtk_application_new("com.example.MyApp",
                                              G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);
    /* BlinkGTK は Chromium のブラウザメインループを回す必要がある。
     * g_application_run() ではそれが回らず、ページが読み込まれない
     * (navigation が commit しない)。
     */
    GError *error = NULL;
    if (!g_application_register(G_APPLICATION(app), NULL, &error)) {
        g_printerr("アプリケーションの登録に失敗しました: %s\n", error ? error->message : "不明なエラー");
        g_clear_error(&error);
        g_object_unref(app);
        return 1;
    }
    g_application_activate(G_APPLICATION(app));
    int status = blink_gtk_run_main_loop();
    g_object_unref(app);
    return status;
}

注意: blink_web_view_new()GtkWidget * を返しますが、BlinkGTK の
API は BlinkWebView * を取ります。BLINK_WEB_VIEW() でキャストしてください。

5. Makefile の例

CC      ?= cc
PKGS     = blinkgtk-0.1
CFLAGS  += -O2 -Wall $(shell pkg-config --cflags $(PKGS))
LDLIBS  += $(shell pkg-config --libs $(PKGS))

myapp: myapp.c
    $(CC) $(CFLAGS) -o $@ $< $(LDLIBS)

6. 実行時に必要なもの

Wayland が必要です

BlinkGTK は Wayland 専用です。X11 では動作しません。Wayland セッションで
実行するか、ヘッドレス検証には Weston の headless バックエンドを使ってください。

weston --backend=headless-backend.so --width=1024 --height=768 &
export WAYLAND_DISPLAY=wayland-1

Chromium のリソースファイルの位置

Chromium は ICU データ (icudtl.dat)、V8 スナップショット
(snapshot_blob.bin / v8_context_snapshot.bin)、リソースパック
(content_shell.pak) を必要とします。これらは
カレントディレクトリではなく実行ファイルのあるディレクトリを基準に
探索されます。

RPM / DEB でインストールした場合は正しい場所に配置されるため、通常は何もする
必要はありません。tarball を展開して使う場合や、実行ファイルを別の場所に置いた
場合は次のエラーになります。

ERROR:base/i18n/icu_util.cc: Invalid file descriptor to ICU data received.
FATAL:base/i18n/icu_util.cc: Check failed: result.

このときは、実行ファイルをリソースと同じディレクトリに置くか、ライブラリ
探索パスを合わせてください。

export LD_LIBRARY_PATH=/opt/blinkgtk/usr/lib64/blinkgtk-0.1:\
/opt/blinkgtk/usr/lib64/blinkgtk-0.1/chromium

7. うまくいかないときの確認順序

症状 最初に確認すること
リンクエラー (undefined reference) pkg-config --libs blinkgtk-0.1 が値を返すか。devel パッケージが入っているか
起動するがページが白いまま readelf -d ./myapp | grep allocator_shim — shim が直接依存にあるか (第 2 節)
Invalid file descriptor to ICU data 実行ファイルとリソースの位置関係 (第 6 節)
ウィンドウが出ない Wayland セッションか。echo $WAYLAND_DISPLAY
Python から import できない gir パッケージが入っているか

8. GTK4 の使い方について

BlinkGTK は GTK4 のウィジェットを 1 つ提供するライブラリです。ウィンドウ、
レイアウト、ボタン、メニュー、イベント処理といった GTK4 そのものの使い方は、
GTK4 の公式ドキュメントを参照してください。本ドキュメントでは扱いません。

BlinkWebViewGtkWidget を継承しているため、他の GTK4 ウィジェットと
同じように扱えます (コンテナに入れる、サイズ要求を設定する、シグナルを繋ぐ等)。

ただしメインループだけは例外です。 GTK の g_application_run()
g_main_loop_run() ではなく、blink_gtk_run_main_loop() を使ってください
(第 4 節)。

Python / Rust など他言語から使う場合

BlinkGTK は GObject Introspection に対応しているため、PyGObject や gtk-rs
から利用できます。各言語バインディングの使い方はそれぞれのドキュメントを
参照してください。

関連