nixGL/README.md
2017-09-16 19:35:16 +02:00

83 lines
2.1 KiB
Markdown

This tool tries to solve the "OpenGL" problem on nix.
# Motivation
You use Nix on any distribution, and any GL application installed fails with this error:
```
$ program
libGL error: unable to load driver: i965_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: i965
libGL error: unable to load driver: i965_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: i965
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast
```
This library contains a wrapper which is able to launch GL application:
```
nixGL program
```
# Installation / Usage
Clone this git repository:
```
git clone https://github.com/guibou/nixGL
```
(Optional) installation:
```
cd nixGL
nix-build
nix-env -i ./result
```
Usage:
```
nixGL program args
```
# Limitations
The idea is really simple and should work reliably in most cases.
However there is still two configurations variables hardcoded in the wrapper.
- `ignored`: the list of all nix packages which may contain a wrong `libGL.so`.
- `systemLibs`: the list of where on the host system the `libGL.so` can be found.
Open a bug / pull request if this does not work on your distribution / driver.
It works with `primus`, but there is some artifacts, mostly due to the next fundamental issue:
## Fundamental issue
If your program libraries depends on different versions of the same library, for example, this dependency tree:
```
program
libFoo-1.2
libBar-1.4
libTurtle-1.6
libBar-1.2
```
One version or the other of `libBar` may be used. In practice this does not happen a lot.
A similar issue will happen if your system `libGL.so` depends on some library which are already in your program dependency list. Undefined behaviors can happen.
## Subprocessus
It does not work with subprocessus, that's all ;(
## Haskell Stack `exec`
You need to call `stack --nix exec -- nixGL yourProgram` instead of `nixGL stack exec -- yourProgram` du to the incompatibility with subprocessus. If `nixGL` is not installed in your stack environment, you can use `stack --nix --no-nix-pure exec ...`.