about summary refs log tree commit diff
path: root/pkgs/applications/graphics/unigine-valley/default.nix
blob: 6d73cf82cd66e60ab963b694ccfc32d2503984b9 (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
{ lib
, stdenv
, fetchurl

  # Build-time dependencies
, makeWrapper
, file
, makeDesktopItem
, imagemagick
, copyDesktopItems

  # Runtime dependencies
, fontconfig
, freetype
, libX11
, libXext
, libXinerama
, libXrandr
, libXrender
, libglvnd
, openal
}:

let
  version = "1.0";

  arch =
    if stdenv.hostPlatform.system == "x86_64-linux" then
      "x64"
    else if stdenv.hostPlatform.system == "i686-linux" then
      "x86"
    else
      throw "Unsupported platform ${stdenv.hostPlatform.system}";
in

stdenv.mkDerivation rec {
  pname = "unigine-valley";
  inherit version;

  src = fetchurl {
    url = "https://assets.unigine.com/d/Unigine_Valley-${version}.run";
    sha256 = "sha256-XwyL0kMRGFURgrq79fHCD7FOekB4lpckDcr1RkQ2YPQ=";
  };

  sourceRoot = "Unigine_Valley-${version}";
  instPath = "lib/unigine/valley";

  nativeBuildInputs = [ file makeWrapper imagemagick copyDesktopItems ];

  libPath = lib.makeLibraryPath [
    stdenv.cc.cc # libstdc++.so.6
    fontconfig
    freetype
    libX11
    libXext
    libXinerama
    libXrandr
    libXrender
    libglvnd
    openal
  ];

  unpackPhase = ''
    runHook preUnpack

    cp $src extractor.run
    chmod +x extractor.run
    ./extractor.run --target $sourceRoot

    runHook postUnpack
  '';

  postPatch = ''
    # Patch ELF files.
    elfs=$(find bin -type f | xargs file | grep ELF | cut -d ':' -f 1)
    for elf in $elfs; do
      patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux-x86-64.so.2 $elf || true
    done
  '';

  installPhase = ''
    runHook preInstall

    instdir=$out/${instPath}
    mkdir -p $out/share/icons/hicolor $out/share/applications $out/bin $instdir/bin

    # Install executables and libraries
    install -m 0755 bin/browser_${arch} $instdir/bin
    install -m 0755 bin/libApp{Stereo,Surround,Wall}_${arch}.so $instdir/bin
    install -m 0755 bin/libGPUMonitor_${arch}.so $instdir/bin
    install -m 0755 bin/libQt{Core,Gui,Network,WebKit,Xml}Unigine_${arch}.so.4 $instdir/bin
    install -m 0755 bin/libUnigine_${arch}.so $instdir/bin
    install -m 0755 bin/valley_${arch} $instdir/bin
    install -m 0755 valley $instdir
    install -m 0755 valley $out/bin/valley

    # Install other files
    cp -R data documentation $instdir

    # Install and wrap executable
    wrapProgram $out/bin/valley \
      --chdir "$instdir" \
      --prefix LD_LIBRARY_PATH : /run/opengl-driver/lib:$instdir/bin:$libPath

    # Make desktop Icon
    convert $out/lib/unigine/valley/data/launcher/icon.png -resize 128x128 $out/share/icons/Valley.png
    for RES in 16 24 32 48 64 128 256
    do
        mkdir -p $out/share/icons/hicolor/"$RES"x"$RES"/apps
        convert $out/lib/unigine/valley/data/launcher/icon.png -resize "$RES"x"$RES" $out/share/icons/hicolor/"$RES"x"$RES"/apps/Valley.png
    done

    runHook postInstall
  '';

  desktopItems = [
    (makeDesktopItem {
      name = "Valley";
      exec = "valley";
      genericName = "A GPU Stress test tool from the UNIGINE";
      icon = "Valley";
      desktopName = "Valley Benchmark";
    })
  ];

  stripDebugList = [ "${instPath}/bin" ];

  meta = {
    description = "The Unigine Valley GPU benchmarking tool";
    homepage = "https://unigine.com/products/benchmarks/valley/";
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    license = lib.licenses.unfree; # see also: $out/$instPath/documentation/License.pdf
    maintainers = [ lib.maintainers.kierdavis ];
    platforms = [ "x86_64-linux" "i686-linux" ];
    mainProgram = "valley";
  };
}