depot/third_party/nixpkgs/pkgs/servers/mpd/default.nix

340 lines
7.4 KiB
Nix

{
lib,
stdenv,
fetchFromGitHub,
meson,
ninja,
pkg-config,
glib,
systemd,
boost,
fmt,
buildPackages,
# Darwin inputs
AudioToolbox,
AudioUnit,
# Inputs
curl,
libcdio,
libcdio-paranoia,
libmms,
libnfs,
liburing,
samba,
# Archive support
bzip2,
zziplib,
# Codecs
audiofile,
faad2,
ffmpeg,
flac,
fluidsynth,
game-music-emu,
libmad,
libmikmod,
mpg123,
libopus,
libvorbis,
lame,
# Filters
libsamplerate,
soxr,
# Outputs
alsa-lib,
libjack2,
libpulseaudio,
libshout,
pipewire,
# Misc
icu,
sqlite,
avahi,
dbus,
pcre2,
libgcrypt,
expat,
# Services
yajl,
# Client support
libmpdclient,
# Tag support
libid3tag,
nixosTests,
# For documentation
doxygen,
python3Packages, # for sphinx-build
# For tests
gtest,
zip,
}:
let
concatAttrVals = nameList: set: lib.concatMap (x: set.${x} or [ ]) nameList;
featureDependencies = {
# Storage plugins
udisks = [ dbus ];
webdav = [
curl
expat
];
# Input plugins
cdio_paranoia = [
libcdio
libcdio-paranoia
];
curl = [ curl ];
io_uring = [ liburing ];
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 ];
soxr = [ soxr ];
# Output plugins
alsa = [ alsa-lib ];
jack = [ libjack2 ];
pipewire = [ pipewire ];
pulse = [ libpulseaudio ];
shout = [ libshout ];
# Commercial services
qobuz = [
curl
libgcrypt
yajl
];
soundcloud = [
curl
yajl
];
# Client support
libmpdclient = [ libmpdclient ];
# Tag support
id3tag = [ libid3tag ];
# Misc
dbus = [ dbus ];
expat = [ expat ];
icu = [ icu ];
pcre = [ pcre2 ];
sqlite = [ sqlite ];
syslog = [ ];
systemd = [ systemd ];
yajl = [ yajl ];
zeroconf = [
avahi
dbus
];
};
nativeFeatureDependencies = {
documentation = [
doxygen
python3Packages.sphinx
];
};
run =
{
features ? null,
}:
let
# 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.hostPlatform.isDarwin [
"mad"
"pulse"
"jack"
"smbclient"
]
++ lib.optionals (!stdenv.hostPlatform.isLinux) [
"alsa"
"pipewire"
"io_uring"
"systemd"
"syslog"
];
knownFeatures =
builtins.attrNames featureDependencies
++ builtins.attrNames nativeFeatureDependencies;
platformFeatures = lib.subtractLists platformMask knownFeatures;
features_ =
if (features == null) then
platformFeatures
else
let
unknown = lib.subtractLists knownFeatures features;
in
if (unknown != [ ]) then
throw "Unknown feature(s): ${lib.concatStringsSep " " unknown}"
else
let
unsupported = lib.subtractLists platformFeatures features;
in
if (unsupported != [ ]) then
throw "Feature(s) ${lib.concatStringsSep " " unsupported} are not supported on ${stdenv.hostPlatform.system}"
else
features;
in
stdenv.mkDerivation rec {
pname = "mpd";
version = "0.23.16";
src = fetchFromGitHub {
owner = "MusicPlayerDaemon";
repo = "MPD";
rev = "v${version}";
sha256 = "sha256-0To+V+4xLjymGpRSpsyE/Une5uUpCEiAg+d041guPA0=";
};
buildInputs =
[
glib
boost
fmt
# According to the configurePhase of meson, gtest is considered a
# runtime dependency. Quoting:
#
# Run-time dependency GTest found: YES 1.10.0
gtest
]
++ concatAttrVals features_ featureDependencies
++ lib.optionals stdenv.hostPlatform.isDarwin [
AudioToolbox
AudioUnit
];
nativeBuildInputs = [
meson
ninja
pkg-config
] ++ concatAttrVals features_ nativeFeatureDependencies;
depsBuildBuild = [ buildPackages.stdenv.cc ];
postPatch =
lib.optionalString
(stdenv.hostPlatform.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinSdkVersion "12.0")
''
substituteInPlace src/output/plugins/OSXOutputPlugin.cxx \
--replace kAudioObjectPropertyElement{Main,Master} \
--replace kAudioHardwareServiceDeviceProperty_Virtual{Main,Master}Volume
'';
# Otherwise, the meson log says:
#
# Program zip found: NO
nativeCheckInputs = [ zip ];
doCheck = true;
mesonAutoFeatures = "disabled";
outputs = [
"out"
"doc"
] ++ lib.optional (builtins.elem "documentation" features_) "man";
CXXFLAGS = lib.optionals stdenv.hostPlatform.isDarwin [
"-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0"
];
mesonFlags =
[
"-Dtest=true"
"-Dmanpages=true"
"-Dhtml_manual=true"
]
++ map (x: "-D${x}=enabled") features_
++ map (x: "-D${x}=disabled") (lib.subtractLists features_ knownFeatures)
++ lib.optional (builtins.elem "zeroconf" features_) "-Dzeroconf=avahi"
++ lib.optional (builtins.elem "systemd" features_) "-Dsystemd_system_unit_dir=etc/systemd/system";
passthru.tests.nixos = nixosTests.mpd;
meta = with lib; {
description = "Flexible, powerful daemon for playing music";
homepage = "https://www.musicpd.org/";
license = licenses.gpl2Only;
maintainers = with maintainers; [
astsmtl
tobim
];
platforms = platforms.unix;
mainProgram = "mpd";
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"
"bzip2"
"zzip"
"nfs"
"audiofile"
"faad"
"flac"
"gme"
"mpg123"
"opus"
"vorbis"
"vorbisenc"
"lame"
"libsamplerate"
"shout"
"libmpdclient"
"id3tag"
"expat"
"pcre"
"yajl"
"sqlite"
"soundcloud"
"qobuz"
]
++ lib.optionals stdenv.hostPlatform.isLinux [
"alsa"
"systemd"
"syslog"
"io_uring"
]
++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
"mad"
"jack"
];
};
mpdWithFeatures = run;
}