about summary refs log tree commit diff
path: root/pkgs/applications/audio/soundux/default.nix
blob: f6616e58353ec6696d20b38d36a5bf79e5caa4b2 (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
139
140
141
142
{ lib
, stdenv
, fetchFromGitHub
, cmake
, pkg-config
, makeBinaryWrapper
, pipewire
, libpulseaudio
, libappindicator
, libstartup_notification
, openssl
, libwnck
, pcre
, util-linux
, libselinux
, libsepol
, libthai
, libdatrie
, xorg
, libxkbcommon
, libepoxy
, dbus
, at-spi2-core
, nlohmann_json
, fancypp
, httplib
, semver-cpp
, webkitgtk
, yt-dlp
, ffmpeg
, lsb-release
}:

stdenv.mkDerivation rec {
  pname = "soundux";
  version = "0.2.7";

  src = fetchFromGitHub {
    owner = "Soundux";
    repo = "Soundux";
    rev = version;
    sha256 = "sha256-aSCsg6nJt6F+6O7UeXnvYva0vllTfsxK/cjaeOhObZY=";
    fetchSubmodules = true;
  };

  nativeBuildInputs = [
    cmake
    pkg-config
    makeBinaryWrapper
  ];

  buildInputs = [
    pipewire
    libpulseaudio
    libappindicator
    openssl
    libwnck
    pcre
    util-linux
    libselinux
    libsepol
    libthai
    libdatrie
    xorg.libXdmcp
    xorg.libXtst
    xorg.libXres
    libxkbcommon
    libepoxy
    dbus
    at-spi2-core
    nlohmann_json
    fancypp
    httplib
    semver-cpp
    libstartup_notification
    webkitgtk
    yt-dlp
    ffmpeg
  ];

  postPatch = ''
    # cannot be overwritten with variables
    substituteInPlace CMakeLists.txt \
      --replace "set(CMAKE_INSTALL_PREFIX \"/opt/soundux\" CACHE PATH \"Install path prefix, prepended onto install directories.\" FORCE)" "" \
      --replace "/usr/share" "$out/usr/share"
    substituteInPlace src/ui/impl/webview/webview.cpp \
      --replace "/usr/share/pixmaps/soundux.png" "$out/share/pixmaps/soundux.png"
  '';

  # We need to append /opt to our CMAKE_INSTALL_PREFIX
  dontAddPrefix = true;

  preConfigure = ''
    # This needs to be set in preConfigure to access the $prefix variable
    export cmakeFlags="-DCMAKE_INSTALL_PREFIX=$prefix/opt $cmakeFlags"

    # Replace some fetched submodules with symlinks nix packages.
    rm -rf \
      lib/json \
      lib/fancypp \
      lib/lib-httplib \
      lib/semver

    ln -s ${nlohmann_json} lib/json
    ln -s ${fancypp} lib/fancypp
    ln -s ${httplib} lib/lib-httplib
    ln -s ${semver-cpp} lib/semver
  '';

  # Somehow some of the install destination paths in the build system still
  # gets transformed to point to /var/empty/share, even though they are at least
  # relative to the nix output directory with our earlier patching.
  postInstall = ''
    mv "$out/var/empty/share" "$out"
    rm -rf "$out/var"
    mkdir "$out/bin"
    ln -s "$out/opt/soundux" "$out/bin"
    substituteInPlace "$out/share/applications/soundux.desktop" \
      --replace "/opt/soundux/soundux" "soundux"
  '';

  postFixup = let
    rpaths = lib.makeLibraryPath [libwnck pipewire libpulseaudio];
  in ''
    # Wnck, PipeWire, and PulseAudio are dlopen-ed by Soundux, so they do
    # not end up on the RPATH during the build process.
    patchelf --add-rpath "${rpaths}" "$out/opt/soundux-${version}"

    # Work around upstream bug https://github.com/Soundux/Soundux/issues/435
    wrapProgram "$out/bin/soundux" \
      --set WEBKIT_DISABLE_COMPOSITING_MODE 1 \
      --prefix PATH : ${lib.makeBinPath [ yt-dlp ffmpeg lsb-release ]} \
  '';

  meta = with lib; {
    description = "A cross-platform soundboard.";
    homepage = "https://soundux.rocks/";
    license = licenses.gpl3Plus;
    platforms = platforms.linux;
    maintainers = with maintainers; [ aidalgol ];
  };
}