{ stdenv, fetchFromGitHub, meson, ninja, pkgconfig, glib, systemd, boost, darwin # Inputs , curl, libmms, libnfs, samba # Archive support , bzip2, zziplib # Codecs , audiofile, faad2, ffmpeg, flac, fluidsynth, game-music-emu , libmad, libmikmod, mpg123, libopus, libvorbis, lame # Filters , libsamplerate # Outputs , alsaLib, libjack2, libpulseaudio, libshout # Misc , icu, sqlite, avahi, dbus, pcre, libgcrypt, expat # Services , yajl # Client support , mpd_clientlib # Tag support , libid3tag }: let major = "0.21"; minor = "7"; lib = stdenv.lib; mkDisable = f: "-D${f}=disabled"; mkEnable = f: "-D${f}=enabled"; keys = lib.mapAttrsToList (k: v: k); featureDependencies = { # Storage plugins udisks = [ dbus ]; webdav = [ curl expat ]; # Input plugins curl = [ curl ]; mms = [ libmms ]; nfs = [ libnfs ]; smbclient = [ samba ]; # Archive support bzip2 = [ bzip2 ]; zzip = [ zziplib ]; # Decoder plugins audiofile = [ audiofile ]; faad = [ faad2 ]; ffmpeg = [ ffmpeg ]; flac = [ flac ]; fluidsynth = [ fluidsynth ]; gme = [ game-music-emu ]; mad = [ libmad ]; mikmod = [ libmikmod ]; mpg123 = [ mpg123 ]; opus = [ libopus ]; vorbis = [ libvorbis ]; # Encoder plugins vorbisenc = [ libvorbis ]; lame = [ lame ]; # Filter plugins libsamplerate = [ libsamplerate ]; # Output plugins alsa = [ alsaLib ]; jack = [ libjack2 ]; pulse = [ libpulseaudio ]; shout = [ libshout ]; # Commercial services qobuz = [ curl libgcrypt yajl ]; soundcloud = [ curl yajl ]; tidal = [ curl yajl ]; # Client support libmpdclient = [ mpd_clientlib ]; # Tag support id3tag = [ libid3tag ]; # Misc dbus = [ dbus ]; expat = [ expat ]; icu = [ icu ]; pcre = [ pcre ]; sqlite = [ sqlite ]; systemd = [ systemd ]; yajl = [ yajl ]; zeroconf = [ avahi dbus ]; }; run = { features ? null }: let fl = if (features == null ) then keys featureDependencies else features; # Disable platform specific features if needed # using libmad to decode mp3 files on darwin is causing a segfault -- there # is probably a solution, but I'm disabling it for now platformMask = lib.optionals stdenv.isDarwin [ "mad" "pulse" "jack" "nfs" "smb" ] ++ lib.optionals (!stdenv.isLinux) [ "alsa" "systemd" ]; features_ = lib.subtractLists platformMask fl; in stdenv.mkDerivation rec { name = "mpd-${version}"; version = "${major}${if minor == "" then "" else "." + minor}"; src = fetchFromGitHub { owner = "MusicPlayerDaemon"; repo = "MPD"; rev = "v${version}"; sha256 = "11zi8hmlj63ngzl06vzx05669k20j4cdsp0caz4p4ayn46fd4m17"; }; buildInputs = [ glib boost ] ++ (lib.concatLists (lib.attrVals features_ featureDependencies)) ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.AudioToolbox; nativeBuildInputs = [ meson ninja pkgconfig ]; enableParallelBuilding = true; mesonFlags = map mkEnable features_ ++ map mkDisable (lib.subtractLists features_ (keys featureDependencies)) ++ [ "-Dsyslog=enabled" ] ++ lib.optional (lib.any (x: x == "zeroconf") features_) "-Dzeroconf=avahi" ++ lib.optional stdenv.isLinux "-Dsystemd_system_unit_dir=etc/systemd/system"; meta = with stdenv.lib; { description = "A flexible, powerful daemon for playing music"; homepage = http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki; license = licenses.gpl2; maintainers = with maintainers; [ astsmtl fuuzetsu ehmry fpletz ]; platforms = platforms.unix; longDescription = '' Music Player Daemon (MPD) is a flexible, powerful daemon for playing music. Through plugins and libraries it can play a variety of sound files while being controlled by its network protocol. ''; }; }; in { mpd = run { }; mpd-small = run { features = [ "webdav" "curl" "mms" "nfs" "bzip2" "zzip" "audiofile" "faad" "flac" "gme" "mad" "mpg123" "opus" "vorbis" "vorbisenc" "lame" "libsamplerate" "alsa" "shout" "libmpdclient" "id3tag" "expat" "pcre" "yajl" "sqlite" "soundcloud" "qobuz" "tidal" "systemd" ]; }; }