]>
Commit | Line | Data |
---|---|---|
65e64925 IB |
1 | { stdenv, fetchFromGitHub, meson, ninja, pkgconfig, glib, systemd, boost, darwin |
2 | # Inputs | |
3 | , curl, libmms, libnfs, samba | |
4 | # Archive support | |
5 | , bzip2, zziplib | |
6 | # Codecs | |
7 | , audiofile, faad2, ffmpeg, flac, fluidsynth, game-music-emu | |
8 | , libmad, libmikmod, mpg123, libopus, libvorbis, lame | |
9 | # Filters | |
10 | , libsamplerate | |
11 | # Outputs | |
12 | , alsaLib, libjack2, libpulseaudio, libshout | |
13 | # Misc | |
14 | , icu, sqlite, avahi, dbus, pcre, libgcrypt, expat | |
15 | # Services | |
16 | , yajl | |
17 | # Client support | |
18 | , mpd_clientlib | |
19 | # Tag support | |
20 | , libid3tag | |
21 | }: | |
22 | ||
23 | let | |
65e64925 | 24 | lib = stdenv.lib; |
65e64925 IB |
25 | |
26 | featureDependencies = { | |
27 | # Storage plugins | |
28 | udisks = [ dbus ]; | |
29 | webdav = [ curl expat ]; | |
30 | # Input plugins | |
31 | curl = [ curl ]; | |
32 | mms = [ libmms ]; | |
33 | nfs = [ libnfs ]; | |
34 | smbclient = [ samba ]; | |
35 | # Archive support | |
36 | bzip2 = [ bzip2 ]; | |
37 | zzip = [ zziplib ]; | |
38 | # Decoder plugins | |
39 | audiofile = [ audiofile ]; | |
40 | faad = [ faad2 ]; | |
41 | ffmpeg = [ ffmpeg ]; | |
42 | flac = [ flac ]; | |
43 | fluidsynth = [ fluidsynth ]; | |
44 | gme = [ game-music-emu ]; | |
45 | mad = [ libmad ]; | |
46 | mikmod = [ libmikmod ]; | |
47 | mpg123 = [ mpg123 ]; | |
48 | opus = [ libopus ]; | |
49 | vorbis = [ libvorbis ]; | |
50 | # Encoder plugins | |
51 | vorbisenc = [ libvorbis ]; | |
52 | lame = [ lame ]; | |
53 | # Filter plugins | |
54 | libsamplerate = [ libsamplerate ]; | |
55 | # Output plugins | |
56 | alsa = [ alsaLib ]; | |
57 | jack = [ libjack2 ]; | |
58 | pulse = [ libpulseaudio ]; | |
59 | shout = [ libshout ]; | |
60 | # Commercial services | |
61 | qobuz = [ curl libgcrypt yajl ]; | |
62 | soundcloud = [ curl yajl ]; | |
63 | tidal = [ curl yajl ]; | |
64 | # Client support | |
65 | libmpdclient = [ mpd_clientlib ]; | |
66 | # Tag support | |
67 | id3tag = [ libid3tag ]; | |
68 | # Misc | |
69 | dbus = [ dbus ]; | |
70 | expat = [ expat ]; | |
71 | icu = [ icu ]; | |
72 | pcre = [ pcre ]; | |
73 | sqlite = [ sqlite ]; | |
5400b9b6 | 74 | syslog = [ ]; |
65e64925 IB |
75 | systemd = [ systemd ]; |
76 | yajl = [ yajl ]; | |
77 | zeroconf = [ avahi dbus ]; | |
78 | }; | |
79 | ||
80 | run = { features ? null }: | |
81 | let | |
65e64925 IB |
82 | # Disable platform specific features if needed |
83 | # using libmad to decode mp3 files on darwin is causing a segfault -- there | |
84 | # is probably a solution, but I'm disabling it for now | |
5400b9b6 IB |
85 | platformMask = lib.optionals stdenv.isDarwin [ "mad" "pulse" "jack" "nfs" "smbclient" ] |
86 | ++ lib.optionals (!stdenv.isLinux) [ "alsa" "systemd" "syslog" ]; | |
87 | ||
88 | knownFeatures = builtins.attrNames featureDependencies; | |
89 | platformFeatures = lib.subtractLists platformMask knownFeatures; | |
90 | ||
91 | features_ = if (features == null ) | |
92 | then platformFeatures | |
93 | else | |
94 | let unknown = lib.subtractLists knownFeatures features; in | |
95 | if (unknown != []) | |
96 | then throw "Unknown feature(s): ${lib.concatStringsSep " " unknown}" | |
97 | else | |
98 | let unsupported = lib.subtractLists platformFeatures features; in | |
99 | if (unsupported != []) | |
100 | then throw "Feature(s) ${lib.concatStringsSep " " unsupported} are not supported on ${stdenv.hostPlatform.system}" | |
101 | else features; | |
65e64925 IB |
102 | |
103 | in stdenv.mkDerivation rec { | |
5400b9b6 IB |
104 | pname = "mpd"; |
105 | version = "0.21.21"; | |
65e64925 IB |
106 | |
107 | src = fetchFromGitHub { | |
108 | owner = "MusicPlayerDaemon"; | |
109 | repo = "MPD"; | |
110 | rev = "v${version}"; | |
5400b9b6 | 111 | sha256 = "0ysyjlmmfm1y5jqyv83bs9p7zqr9pgj1hmdq2b7kx9kridclbnng"; |
65e64925 IB |
112 | }; |
113 | ||
114 | buildInputs = [ glib boost ] | |
115 | ++ (lib.concatLists (lib.attrVals features_ featureDependencies)) | |
5400b9b6 | 116 | ++ lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.AudioToolbox darwin.apple_sdk.frameworks.AudioUnit ]; |
65e64925 IB |
117 | |
118 | nativeBuildInputs = [ meson ninja pkgconfig ]; | |
119 | ||
120 | enableParallelBuilding = true; | |
121 | ||
5400b9b6 | 122 | mesonAutoFeatures = "disabled"; |
65e64925 | 123 | mesonFlags = |
5400b9b6 IB |
124 | map (x: "-D${x}=enabled") features_ |
125 | ++ map (x: "-D${x}=disabled") (lib.subtractLists features_ knownFeatures) | |
126 | ++ lib.optional (builtins.elem "zeroconf" features_) | |
65e64925 | 127 | "-Dzeroconf=avahi" |
5400b9b6 | 128 | ++ lib.optional (builtins.elem "systemd" features_) |
65e64925 IB |
129 | "-Dsystemd_system_unit_dir=etc/systemd/system"; |
130 | ||
131 | meta = with stdenv.lib; { | |
132 | description = "A flexible, powerful daemon for playing music"; | |
5400b9b6 | 133 | homepage = "https://www.musicpd.org/"; |
65e64925 | 134 | license = licenses.gpl2; |
5400b9b6 | 135 | maintainers = with maintainers; [ astsmtl ehmry fpletz tobim ]; |
65e64925 IB |
136 | platforms = platforms.unix; |
137 | ||
138 | longDescription = '' | |
139 | Music Player Daemon (MPD) is a flexible, powerful daemon for playing | |
140 | music. Through plugins and libraries it can play a variety of sound | |
141 | files while being controlled by its network protocol. | |
142 | ''; | |
143 | }; | |
144 | }; | |
145 | in | |
146 | { | |
147 | mpd = run { }; | |
148 | mpd-small = run { features = [ | |
5400b9b6 | 149 | "webdav" "curl" "mms" "bzip2" "zzip" |
65e64925 | 150 | "audiofile" "faad" "flac" "gme" "mad" |
5400b9b6 IB |
151 | "mpg123" "opus" "vorbis" "vorbisenc" |
152 | "lame" "libsamplerate" "shout" | |
153 | "libmpdclient" "id3tag" "expat" "pcre" | |
154 | "yajl" "sqlite" | |
65e64925 | 155 | "soundcloud" "qobuz" "tidal" |
5400b9b6 IB |
156 | ] ++ lib.optionals stdenv.isLinux [ |
157 | "alsa" "systemd" "syslog" | |
158 | ] ++ lib.optionals (!stdenv.isDarwin) [ | |
159 | "mad" "jack" "nfs" | |
65e64925 | 160 | ]; }; |
5400b9b6 | 161 | mpdWithFeatures = run; |
65e64925 | 162 | } |