😸

Gtk + Rust @ Windows

2021/01/12に公開

注意

  • ここで紹介しているのはとりあえずビルドできるだけのテンプレートです。デバッガの利用方法は載ってません。
  • とても古いアプローチです。後日、最新のものにアップデート予定です。

Gtk

RustでGUIアプリを作る際の一つにGtkを使う選択肢がありますが、Windowsで使おうとすると開発環境の構築が実に面倒です。ここではvcpkgを利用した便利なプロジェクトテンプレートを紹介します。ただし、今のところGtkとgtk-rsのどちらからも公式にサポートされている方法ではない[1]点にご注意ください。

https://www.gtk.org/

公式サイトのインストール方法 (Windows)

GtkはもともとLinux環境を想定して作られているため、Windows環境で使おうとするといくつか手間がかかる。下記のインストール手順を見ていただければ分かるが、msys2上に環境を作る方法とgvsbuildでライブラリをビルドする方法がある。

https://www.gtk.org/docs/installations/windows/

msys2環境

  • メリット
    • pacmanで必要なライブラリを手軽にインストールできる
  • デメリット
    • ツールチェーンにgunを使う必要がある。

このデメリットについては実は使い方によるが、例えばGtkと一緒にmsvc用にビルドしたライブラリを使おうとするとリンカーエラーが起きてしまいます。

ちなみに、ツールチェーンをデフォルトのmsvcからgnuに切り替えるには、例えば以下のコマンドを使います。

rustup toolchain install stable-x86_64-pc-windows-gnu
rustup override set stable-x86_64-pc-windows-gnu # within project directory

gvsbuildでビルド

ツールチェーンにmsvcを使おうとすると、msvcでビルドしたGtkライブラリが必要です。これをやってくれるのがgvsbuildです。

  • メリット
    • デフォルトのツールチェーン(msvc)を使える
  • デメリット
    • ビルド環境の構築にやっぱりmsys2が必要
    • ライブラリの管理をすべて自前でやらなくてはならない。

ライブラリの面倒を自分で見るということは、例えばビルドスクリプト(build.rs)をメンテしたり、配布用にdllをコピーしたりする作業が必要になります。msys2環境だとpkg-configに任せる部分ですね。これではちょっとしたGUIを作りたいだけ・・・という時にはハードルが高すぎますね。

vcpkgを利用する

実はvcpkgで簡単にWindows用のGtkの利用環境がサクッと構築できてします。これを利用したRust用のテンプレートを作ってくれている先人がいました👏

https://github.com/kykc/gtk-rs-msvc

こちらのREADMEに従うとすぐにセットアップを構築できます。ビルドステップはMakefile.tomlにスクリプトを埋め込んだりしてるあたり、頑張ってハックしてる感じはありますが[2]

何をやってくれているのかというと、主に以下の3つです。

  • リンカーへの適切なlibファイル等の指定 (vcpkgを利用)
  • 実行時に必要なdllのコピー (vcpkgを利用)
  • Windows 10の見た目が残念にならないようにassetsをコピー (templateに含まれている)

注意点

現時点ではパッケージングをテンプレートではサポしていないようで、target/release/のあたりからリリースに必要なexe/dllのファイルやassets/setting等をディレクトリを主導でコピーして配布用のファイルセットを作る必要があるそうです。

vcpkgでのgtkライブラリのインストール

x86_64用かx64用かに応じてインストールする。Visual Studioに英語パックがないとインストール時にエラーが出るので、追加してから再度インストールコマンドを実行してみてください。なお、ビルドに40-50分かかるみたいです。

vcpkg install gtk:x64-windows

英語パックがないと次のようなエラーがでる。

The following packages will be built and installed:
  * atk[core]:x64-windows
  * bzip2[core]:x64-windows
  * cairo[core]:x64-windows
  * dirent[core]:x64-windows
  * expat[core]:x64-windows
  * fontconfig[core]:x64-windows
  * freetype[core]:x64-windows
  * gdk-pixbuf[core]:x64-windows
  * gettext[core]:x64-windows
  * glib[core]:x64-windows
    gtk[core]:x64-windows
  * harfbuzz[core,glib,ucdn]:x64-
  * libepoxy[core]:x64-windows
  * libffi[core]:x64-windows
  * libiconv[core]:x64-windows
  * libpng[core]:x64-windows
  * pango[core]:x64-windows
  * pcre[core]:x64-windows
  * pixman[core]:x64-windows
  * ragel[core]:x64-windows
  * tool-meson[core]:x64-windows
  * zlib[core]:x64-windows
Additional packages (*) will be modified to complete this operation.
Starting package 1/22: tool-meson:x64-windows
Building package tool-meson[core]:x64-windows...
Warning: The following VS instances are excluded because the English language pack is unavailable.
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional
Could not locate a complete toolset.
The following paths were examined:
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsall.bat
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\bin\HostX86\x86\dumpbin.exe

テンプレートをビルドしてみる

cargo-makeを使ってビルドプロセスを呼び出します。VCPKG_PATHは各自の環境に応じて設定してみてください。

# cargo install cargo-make  # cargo-makeがない場合
git clone https://github.com/kykc/gtk-rs-msvc
cd gtk-rs-msvc
cargo make build-win --env-file=.\environments\win64-release --env VCPKG_PATH=C:\path\to\vcpkg

デメリット

  • vcpkgが必要になる
  • vcpkg依存でGtkのビルドがブラックボックス
脚注
  1. https://github.com/gtk-rs/gtk-rs/issues/116 ↩︎

  2. 自前でやろうとすると四苦八苦することになります。https://www.reddit.com/r/rust/comments/bzkhmt/how_to_use_gtkrs_on_windows_using_the_msvc/ ↩︎

Discussion