Gtk + Rust @ Windows
注意
- ここで紹介しているのはとりあえずビルドできるだけのテンプレートです。デバッガの利用方法は載ってません。
- とても古いアプローチです。後日、最新のものにアップデート予定です。
Gtk
RustでGUIアプリを作る際の一つにGtkを使う選択肢がありますが、Windowsで使おうとすると開発環境の構築が実に面倒です。ここではvcpkgを利用した便利なプロジェクトテンプレートを紹介します。ただし、今のところGtkとgtk-rsのどちらからも公式にサポートされている方法ではない[1]点にご注意ください。
公式サイトのインストール方法 (Windows)
GtkはもともとLinux環境を想定して作られているため、Windows環境で使おうとするといくつか手間がかかる。下記のインストール手順を見ていただければ分かるが、msys2上に環境を作る方法とgvsbuildでライブラリをビルドする方法がある。
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用のテンプレートを作ってくれている先人がいました👏
こちらの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のビルドがブラックボックス
Discussion