summary refs log tree commit diff
path: root/pkgs/development/python-modules/pyglet/default.nix
blob: 393ec9f2e4cc9cfe1c856d22fd29e39019ca5792 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
{ lib, stdenv
, buildPythonPackage
, fetchPypi
, unzip
, pythonOlder
, libGL
, libGLU
, xorg
, pytestCheckHook
, glibc
, gtk2-x11
, gdk-pixbuf
, fontconfig
, freetype
, ffmpeg-full
, openal
, libpulseaudio
}:

buildPythonPackage rec {
  version = "2.0.10";
  pname = "pyglet";
  disabled = pythonOlder "3.6";

  src = fetchPypi {
    inherit pname version;
    hash = "sha256-JCvrGzvWfFvr3+W6EexWtpathrUMbn8qMX+NeDJWuck=";
    extension = "zip";
  };

  # find_library doesn't reliably work with nix (https://github.com/NixOS/nixpkgs/issues/7307).
  # Even naively searching `LD_LIBRARY_PATH` won't work since `libc.so` is a linker script and
  # ctypes.cdll.LoadLibrary cannot deal with those. Therefore, just hardcode the paths to the
  # necessary libraries.
  postPatch = let
    ext = stdenv.hostPlatform.extensions.sharedLibrary;
  in ''
    cat > pyglet/lib.py <<EOF
    import ctypes
    def load_library(*names, **kwargs):
        for name in names:
            path = None
            if name == 'GL':
                path = '${libGL}/lib/libGL${ext}'
            elif name == 'EGL':
                path = '${libGL}/lib/libEGL${ext}'
            elif name == 'GLU':
                path = '${libGLU}/lib/libGLU${ext}'
            elif name == 'c':
                path = '${glibc}/lib/libc${ext}.6'
            elif name == 'X11':
                path = '${xorg.libX11}/lib/libX11${ext}'
            elif name == 'gdk-x11-2.0':
                path = '${gtk2-x11}/lib/libgdk-x11-2.0${ext}'
            elif name == 'gdk_pixbuf-2.0':
                path = '${gdk-pixbuf}/lib/libgdk_pixbuf-2.0${ext}'
            elif name == 'Xext':
                path = '${xorg.libXext}/lib/libXext${ext}'
            elif name == 'fontconfig':
                path = '${fontconfig.lib}/lib/libfontconfig${ext}'
            elif name == 'freetype':
                path = '${freetype}/lib/libfreetype${ext}'
            elif name[0:2] == 'av' or name[0:2] == 'sw':
                path = '${ffmpeg-full}/lib/lib' + name + '${ext}'
            elif name == 'openal':
                path = '${openal}/lib/libopenal${ext}'
            elif name == 'pulse':
                path = '${libpulseaudio}/lib/libpulse${ext}'
            elif name == 'Xi':
                path = '${xorg.libXi}/lib/libXi${ext}'
            elif name == 'Xinerama':
                path = '${xorg.libXinerama}/lib/libXinerama${ext}'
            elif name == 'Xxf86vm':
                path = '${xorg.libXxf86vm}/lib/libXxf86vm${ext}'
            if path is not None:
                return ctypes.cdll.LoadLibrary(path)
        raise Exception("Could not load library {}".format(names))
    EOF
  '';

  nativeBuildInputs = [ unzip ];

  # needs GL set up which isn't really possible in a build environment even in headless mode.
  # tests do run and pass in nix-shell, however.
  doCheck = false;

  nativeCheckInputs = [
    pytestCheckHook
  ];

  preCheck = ''
    export PYGLET_HEADLESS=True
  '';

  # test list taken from .travis.yml
  disabledTestPaths = [
    "tests/base"
    "tests/interactive"
    "tests/integration"
    "tests/unit/text/test_layout.py"
  ];

  pythonImportsCheck = [ "pyglet" ];

  meta = with lib; {
    homepage = "http://www.pyglet.org/";
    description = "A cross-platform windowing and multimedia library";
    license = licenses.bsd3;
    platforms = platforms.mesaPlatforms;
  };
}