vscode-extensions.capatech.betacode: init at 0.1.10 (#355720)
[NixPkgs.git] / pkgs / servers / mpd / default.nix
blob124297a9b7523eb0e2f7ce485b5356d141f6423b
1 { lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, glib, systemd, boost, fmt, buildPackages
2 # Darwin inputs
3 , AudioToolbox, AudioUnit
4 # Inputs
5 , curl, libcdio, libcdio-paranoia, libmms, libnfs, liburing, samba
6 # Archive support
7 , bzip2, zziplib
8 # Codecs
9 , audiofile, faad2, ffmpeg, flac, fluidsynth, game-music-emu
10 , libmad, libmikmod, mpg123, libopus, libvorbis, lame
11 # Filters
12 , libsamplerate, soxr
13 # Outputs
14 , alsa-lib, libjack2, libpulseaudio, libshout, pipewire
15 # Misc
16 , icu, sqlite, avahi, dbus, pcre2, libgcrypt, expat
17 # Services
18 , yajl
19 # Client support
20 , libmpdclient
21 # Tag support
22 , libid3tag
23 , nixosTests
24 # For documentation
25 , doxygen
26 , python3Packages # for sphinx-build
27 # For tests
28 , gtest
29 , zip
32 let
33   concatAttrVals = nameList: set: lib.concatMap (x: set.${x} or []) nameList;
35   featureDependencies = {
36     # Storage plugins
37     udisks        = [ dbus ];
38     webdav        = [ curl expat ];
39     # Input plugins
40     cdio_paranoia = [ libcdio libcdio-paranoia ];
41     curl          = [ curl ];
42     io_uring      = [ liburing ];
43     mms           = [ libmms ];
44     nfs           = [ libnfs ];
45     smbclient     = [ samba ];
46     # Archive support
47     bzip2         = [ bzip2 ];
48     zzip          = [ zziplib ];
49     # Decoder plugins
50     audiofile     = [ audiofile ];
51     faad          = [ faad2 ];
52     ffmpeg        = [ ffmpeg ];
53     flac          = [ flac ];
54     fluidsynth    = [ fluidsynth ];
55     gme           = [ game-music-emu ];
56     mad           = [ libmad ];
57     mikmod        = [ libmikmod ];
58     mpg123        = [ mpg123 ];
59     opus          = [ libopus ];
60     vorbis        = [ libvorbis ];
61     # Encoder plugins
62     vorbisenc     = [ libvorbis ];
63     lame          = [ lame ];
64     # Filter plugins
65     libsamplerate = [ libsamplerate ];
66     soxr          = [ soxr ];
67     # Output plugins
68     alsa          = [ alsa-lib ];
69     jack          = [ libjack2 ];
70     pipewire      = [ pipewire ];
71     pulse         = [ libpulseaudio ];
72     shout         = [ libshout ];
73     # Commercial services
74     qobuz         = [ curl libgcrypt yajl ];
75     soundcloud    = [ curl yajl ];
76     # Client support
77     libmpdclient  = [ libmpdclient ];
78     # Tag support
79     id3tag        = [ libid3tag ];
80     # Misc
81     dbus          = [ dbus ];
82     expat         = [ expat ];
83     icu           = [ icu ];
84     pcre          = [ pcre2 ];
85     sqlite        = [ sqlite ];
86     syslog        = [ ];
87     systemd       = [ systemd ];
88     yajl          = [ yajl ];
89     zeroconf      = [ avahi dbus ];
90   };
92   nativeFeatureDependencies = {
93     documentation = [ doxygen python3Packages.sphinx ];
94   };
96   run = { features ? null }:
97     let
98       # Disable platform specific features if needed
99       # using libmad to decode mp3 files on darwin is causing a segfault -- there
100       # is probably a solution, but I'm disabling it for now
101       platformMask = lib.optionals stdenv.hostPlatform.isDarwin [ "mad" "pulse" "jack" "smbclient" ]
102                   ++ lib.optionals (!stdenv.hostPlatform.isLinux) [ "alsa" "pipewire" "io_uring" "systemd" "syslog" ];
104       knownFeatures = builtins.attrNames featureDependencies ++ builtins.attrNames nativeFeatureDependencies;
105       platformFeatures = lib.subtractLists platformMask knownFeatures;
107       features_ = if (features == null )
108         then platformFeatures
109         else
110           let unknown = lib.subtractLists knownFeatures features; in
111           if (unknown != [])
112             then throw "Unknown feature(s): ${lib.concatStringsSep " " unknown}"
113             else
114               let unsupported = lib.subtractLists platformFeatures features; in
115               if (unsupported != [])
116                 then throw "Feature(s) ${lib.concatStringsSep " " unsupported} are not supported on ${stdenv.hostPlatform.system}"
117                 else features;
119     in stdenv.mkDerivation rec {
120       pname = "mpd";
121       version = "0.23.15";
123       src = fetchFromGitHub {
124         owner  = "MusicPlayerDaemon";
125         repo   = "MPD";
126         rev    = "v${version}";
127         sha256 = "sha256-QURq7ysSsxmBOtoBlPTPWiloXQpjEdxnM0L1fLwXfpw=";
128       };
130       buildInputs = [
131         glib
132         boost
133         fmt
134         # According to the configurePhase of meson, gtest is considered a
135         # runtime dependency. Quoting:
136         #
137         #    Run-time dependency GTest found: YES 1.10.0
138         gtest
139       ]
140         ++ concatAttrVals features_ featureDependencies
141         ++ lib.optionals stdenv.hostPlatform.isDarwin [ AudioToolbox AudioUnit ];
143       nativeBuildInputs = [
144         meson
145         ninja
146         pkg-config
147       ]
148         ++ concatAttrVals features_ nativeFeatureDependencies;
150       depsBuildBuild = [ buildPackages.stdenv.cc ];
152       postPatch = lib.optionalString (stdenv.hostPlatform.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinSdkVersion "12.0") ''
153         substituteInPlace src/output/plugins/OSXOutputPlugin.cxx \
154           --replace kAudioObjectPropertyElement{Main,Master} \
155           --replace kAudioHardwareServiceDeviceProperty_Virtual{Main,Master}Volume
156       '';
158       # Otherwise, the meson log says:
159       #
160       #    Program zip found: NO
161       nativeCheckInputs = [ zip ];
163       doCheck = true;
165       mesonAutoFeatures = "disabled";
167       outputs = [ "out" "doc" ]
168         ++ lib.optional (builtins.elem "documentation" features_) "man";
170       CXXFLAGS = lib.optionals stdenv.hostPlatform.isDarwin [
171         "-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0"
172       ];
174       mesonFlags = [
175         "-Dtest=true"
176         "-Dmanpages=true"
177         "-Dhtml_manual=true"
178       ]
179         ++ map (x: "-D${x}=enabled") features_
180         ++ map (x: "-D${x}=disabled") (lib.subtractLists features_ knownFeatures)
181         ++ lib.optional (builtins.elem "zeroconf" features_)
182           "-Dzeroconf=avahi"
183         ++ lib.optional (builtins.elem "systemd" features_)
184           "-Dsystemd_system_unit_dir=etc/systemd/system";
186       passthru.tests.nixos = nixosTests.mpd;
188       meta = with lib; {
189         description = "Flexible, powerful daemon for playing music";
190         homepage    = "https://www.musicpd.org/";
191         license     = licenses.gpl2Only;
192         maintainers = with maintainers; [ astsmtl tobim ];
193         platforms   = platforms.unix;
194         mainProgram = "mpd";
196         longDescription = ''
197           Music Player Daemon (MPD) is a flexible, powerful daemon for playing
198           music. Through plugins and libraries it can play a variety of sound
199           files while being controlled by its network protocol.
200         '';
201       };
202     };
205   mpd = run { };
206   mpd-small = run { features = [
207     "webdav" "curl" "mms" "bzip2" "zzip" "nfs"
208     "audiofile" "faad" "flac" "gme"
209     "mpg123" "opus" "vorbis" "vorbisenc"
210     "lame" "libsamplerate" "shout"
211     "libmpdclient" "id3tag" "expat" "pcre"
212     "yajl" "sqlite"
213     "soundcloud" "qobuz"
214   ] ++ lib.optionals stdenv.hostPlatform.isLinux [
215     "alsa" "systemd" "syslog" "io_uring"
216   ] ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
217     "mad" "jack"
218   ]; };
219   mpdWithFeatures = run;