metabrush/installation_notes.md
2022-12-04 15:52:29 +01:00

163 lines
5.9 KiB
Markdown

# Installation notes
On Windows, we need to install an up-to-date MinGW/MSYS2 toolchain,
together with the packages required by the `haskell-gi` libraries (for `GTK`).
With an `MSYS2` installation at `C:\Haskell\ghcup\msys64`, the following environment variables will need to be set :
`PATH`: `C:\Haskell\ghcup\msys64\mingw64\bin;C:\Haskell\ghcup\msys64\usr\bin`
`PKG_CONFIG_PATH`: `C:\Haskell\ghcup\msys64\mingw64\lib\pkgconfig`
`XDG_DATA_DIRS`: `C:\Haskell\ghcup\msys64\mingw64\share;C:\Haskell\ghcup\msys64\usr\share`
Then we need `pkg-config` and the suite of `GTK` libraries.
After updating the package database if necessary with `pacman -Sy msys2-keyring`, we can do:
```bash
pacman -S -q --noconfirm mingw64/mingw-w64-x86_64-pkg-config mingw64/mingw-w64-x86_64-gobject-introspection mingw64/mingw-w64-x86_64-atk mingw64/mingw-w64-x86_64-gtksourceview5
```
NB: at the time of writing, the relevant gtksource version is 5; this might need to be
updated if you run into issues, as the API of the auto-generated Haskell gi libraries might be
different dependent on the version numbers of the gi foreign libraries.
Note that GHC 9.2 and below are affected by some bugs on Windows, e.g. [#21109](https://gitlab.haskell.org/ghc/ghc/-/issues/21109)
and [#21111](https://gitlab.haskell.org/ghc/ghc/-/issues/21111). So you should use GHC 9.4 (or above),
and make sure that you are using `cabal-install > 3.8` (due to [#21990](https://gitlab.haskell.org/ghc/ghc/-/issues/21990)).
## Possible errors
### pkg-config could not be found
The error
```bash
The program 'pkg-config' is required but it could not be found.
```
means that `pkg-config` couldn't be found on the path. Run the command
```bash
pacman -S -q --noconfirm mingw64/mingw-w64-x86_64-pkg-config
```
to install it.
### gobject could not be found
An error such as
```bash
The pkg-config package 'gobject' is required but it could not be found.
```
indicates missing dependencies for the `haskell-gi` suite of packages.
Ensure these are installed by running the aforementioned `pacman` command.
Also check that the packages are registered with `pkg-config` using the command
```bash
pkg-config --list-all
```
If packages such as `cairo`, `gtk` etc do not appear, this means `PKG_CONFIG_PATH` is not set correctly.
Search for `*.pc` files in your `MSYS2` installation, and ensure their paths are included in `PKG_CONFIG_PATH`.
You might also have multiple different `pkg-config` executables in your `PATH`;
if so, ensure that `cabal` is using the correct one, e.g. by modifying the `extra-prog-path`
field in your `cabal.config` file; see e.g. [ghcup issue #371](https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/371).
### Missing (or bad) C libraries
An error of the form:
```bash
Missing dependencies on foreign libraries:
* Missing (or bad) C libraries: gobject-2.0
```
indicates that `cabal` is not able to find an external C dependency. If the
C dependency is indeed installed, then perhaps `cabal` is calling the wrong
`pkg-config` executable. This could be due to an incorrect `extra-prog-path`
in your `cabal.config` file; see e.g. [ghcup issue #371](https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/371).
To fix this, you need to ensure the `pkg-config` executable is correct, e.g.
by re-ordering the paths in the `extra-prog-path` stanza so that the path
containing the correct `pkg-config` appears first.
### Failed to load shared library
An error of the form
```bash
Failed to load shared library 'libcairo-gobject-2.dll' referenced by the typelib: 'libcairo-gobject-2.dll': The specified procedure could not be found.
gi-cairo> Could not resolve symbol "cairo_gobject_context_get_type" in namespace "cairo"
```
indicates an issue finding exported functions in the `DLL`s that we depend upon.
I'm not yet sure how to fix this issue; see [haskell-gi issue #391](https://github.com/haskell-gi/haskell-gi/issues/391).
### Error compiling C standard libraries
An error of the form
```bash
C:\Haskell\ghcup\ghc\9.4.3\lib\..\mingw\include\c++\v1\cmath:642:26: error:
error: no template named 'numeric_limits'
```
signals that GHC is getting confused about which Unix toolchain to use. This
might be due to having
```cabal
extra-include-dirs: C:\Haskell\ghcup\msys64\mingw64\include
```
in your global `cabal.config` file, or in your `cabal.project.local` file.
You should **not** specify `extra-include-dirs` on a per-package
basis in your `cabal.project.local` file either: these should be handled by `pkg-config`.
Remove any `extra-include-dirs` and `extra-lib-dirs`, both in your global `cabal.config`
and in local `cabal.project`/`cabal.project.local` files to proceed.
### ...is a relative path which makes no sense
Any error of the form:
```bash
include-dirs: /mingw64/bin is a relative path which makes no sense
```
indicates that one of the packages is incorrectly configured with a Unix-style path.
The version of `pkg-config` packaged with MSYS2 should automatically convert into the correct full filepaths.
So you might need to uninstall the currently installed `pkg-config`, and install the `MSYS2` one:
```
pacman -S -q --noconfirm mingw64/mingw-w64-x86_64-pkg-config
```
This should fix the issue. Another solution is to pass the `--force` flag to `ghc-pkg` for the problematic packages.
One dependency which used to present this problem was `graphite2`, which is a dependency of `cairo`.
This causes a problem with the `gi-cairo-render` library, so in the `cabal.project` file we can specify:
```
package gi-cairo-render
ghc-pkg-options: "--force"
```
We can otherwise manually fix this issue by changing the `pkg-config` package file `graphite2.pc` as follows:
```
>>> before:
Libs: -L/mingw64/lib -lgraphite2
Cflags: -I/mingw64/include
>>> after:
Libs: -L${libdir} -lgraphite2
Cflags: -I${includedir}
```
See [this patch](https://github.com/msys2/MINGW-packages/pull/6966).
The package `fontconfig` also presented this issue; this was resolved in [this patch](https://github.com/msys2/MINGW-packages/issues/872).