website/content/blog/2020-09-04-relm-on-windows.md

111 lines
2.7 KiB
Markdown
Raw Normal View History

+++
title = "Relm on Windows"
+++
There are essentially 2 methods for compiling Gtk apps
- using *msvc* compiler and .LIB files
- using \"gnu\" backend and msys2 libraries
It is a pick your poison situation, the first option requires unpacking
zip files and organizing stuff so the rust compiler can find the
libraries and the runtime the DLLs.
The other option requires configuring rust to essentially cross compile
to the *x86~64~-pc-windows-gnu* target.
Since I know how to cross compile from my recent experiments with
compiling for embedded ARM processors and I generally know my way better
around the unixy msys environment, the latter it is.
# Installing Gtk in Msys2/Mingw64
Installing gtk3 is easy as it can be installed with *pacman*
``` example
$ pacman -S mingw64/mingw-w64-x86_64-gtk3
```
Add some support for integrating with c libraries and linking, etc...
``` example
$ pacman -S mingw-w64-x86_64-toolchain base-devel
```
Being optimistic I installed glade. Probably wont need it today but it
is a good test to see if Gtk apps at least start.
``` example
$ pacman -S mingw-w64-x86_64-glade
```
Glade starts and shows the GUI so the first milestone was reached.
# Preparing rust and cargo
First install the cross compilation target
``` example
$ rustup target add x86_64-pc-windows-gnu
```
I can now compile with
``` example
$ PKG_CONFIG_ALLOW_CROSS=1 cargo build --target=x86_64-pc-windows-gnu
```
To always enably this environment variable in the project folder I added
a *.env* file with
``` example
PKG_CONFIG_ALLOW_CROSS=1
```
which is picked up by the zsh dotenv plugin when I enter the folder.
Similarly we can change the default target for cargo with adding
``` example
build]
target = "x86_64-pc-windows-gnu"
```
to \*.cargo/config.toml
We can now simply do
``` example
$ rust build
```
or
``` example
$ rust run
```
# Using VSCode
When using *vscode* the rust language server needs to have this
enviroment setup too so it can do its magic. For debugging and running
you can do this in *launch.json* by setting the variables in the *env*
property, but this is (logically) not used for the language server.
There seem no way to have *vscode* respect the *.env* file soon enough
for the language server to pick it up.
The solution I settled on was to launch *vscode* from the command line
in the project folder:
``` example
$ code .
```
The prompt returns immediately and *vscode* is seeing the same
environment as the shell. (This does imply that the vscode bin directory
is on the path.)
Of course this wisdom was gained by fixing 1 error message after another
while trying to build an example in a 2018 blogpost. In hindsight I
could have started with the examples provided with the relm sourcecode,
but where would be the fun in that?