83 lines
2.1 KiB
Markdown
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 ...`.
|