nixpkgs/pkgs/servers/pulseaudio/default.nix
2015-06-04 14:54:48 +02:00

197 lines
9 KiB
Nix

{ stdenv, fetchurl, pkgconfig, intltool, automake, autoconf, libtool
, json_c, libsndfile, gettext, check
# Optional Dependencies
, xlibs ? null, libcap ? null, valgrind ? null, oss ? null, coreaudio ? null
, alsaLib ? null, esound ? null, glib ? null, gtk3 ? null, gconf ? null
, avahi ? null, libjack2 ? null, libasyncns ? null, lirc ? null, dbus ? null
, sbc ? null, bluez5 ? null, udev ? null, openssl ? null, fftw ? null
, speexdsp ? null, systemd ? null, webrtc-audio-processing ? null
# Database selection
, tdb ? null, gdbm ? null
# Extra options
, prefix ? ""
}:
let
mkFlag = trueStr: falseStr: cond: name: val:
if cond == null then null else
"--${if cond != false then trueStr else falseStr}${name}${if val != null && cond != false then "=${val}" else ""}";
mkEnable = mkFlag "enable-" "disable-";
mkWith = mkFlag "with-" "without-";
mkOther = mkFlag "" "" true;
shouldUsePkg = pkg: if pkg != null && stdenv.lib.any (x: x == stdenv.system) pkg.meta.platforms then pkg else null;
libOnly = prefix == "lib";
hasXlibs = xlibs != null;
optLibcap = shouldUsePkg libcap;
hasCaps = optLibcap != null || stdenv.isFreeBSD; # Built-in on FreeBSD
optOss = if libOnly then null else shouldUsePkg oss;
hasOss = optOss != null || stdenv.isFreeBSD; # Built-in on FreeBSD
optCoreaudio = if libOnly then null else shouldUsePkg coreaudio;
optAlsaLib = if libOnly then null else shouldUsePkg alsaLib;
optEsound = if libOnly then null else shouldUsePkg esound;
optGlib = shouldUsePkg glib;
optGtk3 = if libOnly || !hasXlibs then null else shouldUsePkg gtk3;
optGconf = if libOnly then null else shouldUsePkg gconf;
optAvahi = if libOnly then null else shouldUsePkg avahi;
optLibjack2 = if libOnly then null else shouldUsePkg libjack2;
optLibasyncns = shouldUsePkg libasyncns;
optLirc = if libOnly then null else shouldUsePkg lirc;
optDbus = shouldUsePkg dbus;
optSbc = if libOnly then null else shouldUsePkg sbc;
optBluez5 = if optDbus == null || optSbc == null then null
else shouldUsePkg bluez5;
optUdev = if libOnly then null else shouldUsePkg udev;
optOpenssl = if libOnly then null else shouldUsePkg openssl;
optFftw = shouldUsePkg fftw;
optSpeexdsp = shouldUsePkg speexdsp;
optSystemd = shouldUsePkg systemd;
optWebrtc-audio-processing = if libOnly then null else shouldUsePkg webrtc-audio-processing;
hasWebrtc = if libOnly then null else optWebrtc-audio-processing != null;
# Pick a database to use
databaseName = if tdb != null then "tdb" else
if gdbm != null then "gdbm" else "simple";
database = {
tdb = tdb;
gdbm = gdbm;
simple = null;
}.${databaseName};
in
stdenv.mkDerivation rec {
name = "${prefix}pulseaudio-${version}";
version = "6.0";
src = fetchurl {
url = "http://freedesktop.org/software/pulseaudio/releases/pulseaudio-${version}.tar.xz";
sha256 = "1xpnfxa0d8pgf6b4qdgnkcvrvdxbbbjd5ync19h0f5hbp3h401mm";
};
patches = [ ./caps-fix.patch ];
nativeBuildInputs = [ pkgconfig intltool automake autoconf libtool ];
buildInputs = [
json_c libsndfile gettext check database
optLibcap valgrind optOss optCoreaudio optAlsaLib optEsound optGlib
optGtk3 optGconf optAvahi optLibjack2 optLibasyncns optLirc optDbus optUdev
optOpenssl optFftw optSpeexdsp optSystemd optWebrtc-audio-processing
] ++ stdenv.lib.optionals hasXlibs (with xlibs; [
libX11 libxcb libICE libSM libXtst xextproto libXi
]) ++ stdenv.lib.optionals (optBluez5 != null) [ optBluez5 optSbc ];
preConfigure = ''
# Performs and autoreconf
export NOCONFIGURE="yes"
patchShebangs bootstrap.sh
./bootstrap.sh
# Move the udev rules under $(prefix).
sed -i "src/Makefile.in" \
-e "s|udevrulesdir[[:blank:]]*=.*$|udevrulesdir = $out/lib/udev/rules.d|g"
# don't install proximity-helper as root and setuid
sed -i "src/Makefile.in" \
-e "s|chown root|true |" \
-e "s|chmod r+s |true |"
'';
configureFlags = [
(mkOther "localstatedir" "/var")
(mkOther "sysconfdir" "/etc")
(mkEnable false "atomic-arm-memory-barrier" null) # TODO: Enable on armv8
(mkEnable false "neon-opt" null) # TODO: Enable on armv8
(mkEnable hasXlibs "x11" null)
(mkWith hasCaps "caps" optLibcap)
(mkEnable true "tests" null)
(mkEnable false "samplerate" null) # Deprecated
(mkWith true "database" databaseName)
(mkEnable hasOss "oss-output" null)
(mkEnable true "oss-wrapper" null) # Does not use OSS
(mkEnable (optCoreaudio != null) "coreaudio-output" null)
(mkEnable (optAlsaLib != null) "alsa" null)
(mkEnable (optEsound != null) "esound" null)
(mkEnable false "solaris" null)
(mkEnable false "waveout" null) # Windows Only
(mkEnable (optGlib != null) "glib2" null)
(mkEnable (optGtk3 != null) "gtk3" null)
(mkEnable (optGconf != null) "gconf" null)
(mkEnable (optAvahi != null) "avahi" null)
(mkEnable (optLibjack2 != null) "jack" null)
(mkEnable (optLibasyncns != null) "asyncns" null)
(mkEnable false "tcpwrap" null)
(mkEnable (optLirc != null) "lirc" null)
(mkEnable (optDbus != null) "dbus" null)
(mkEnable false "bluez4" null)
(mkEnable (optBluez5 != null) "bluez5" null)
(mkEnable (optBluez5 != null) "bluez5-ofono-headset" null)
(mkEnable (optBluez5 != null) "bluez5-native-headset" null)
(mkEnable (optUdev != null) "udev" null)
(mkEnable false "hal-compat" null)
(mkEnable true "ipv6" null)
(mkEnable (optOpenssl != null) "openssl" null)
(mkWith (optFftw != null) "fftw" null)
(mkWith (optSpeexdsp != null) "speex" null)
(mkEnable false "xen" null)
(mkEnable false "gcov" null)
(mkEnable (optSystemd != null) "systemd-daemon" null)
(mkEnable (optSystemd != null) "systemd-login" null)
(mkEnable (optSystemd != null) "systemd-journal" null)
(mkEnable true "manpages" null)
(mkEnable hasWebrtc "webrtc-aec" null)
(mkEnable true "adrian-aec" null)
(mkWith true "system-user" "pulse")
(mkWith true "system-group" "pulse")
(mkWith true "access-group" "audio")
(mkWith true "systemduserunitdir" "\${out}/lib/systemd/user")
(mkWith stdenv.isDarwin "mac-sysroot" "/")
];
enableParallelBuilding = true;
# not sure what the best practices are here -- can't seem to find a way
# for the compiler to bring in stdlib and stdio (etc.) properly
# the alternative is to copy the files from /usr/include to src, but there are
# probably a large number of files that would need to be copied (I stopped
# after the seventh)
NIX_CFLAGS_COMPILE = stdenv.lib.optionalString stdenv.isDarwin
"-I/usr/include";
installFlags = [
"sysconfdir=$(out)/etc"
"pulseconfdir=$(out)/etc/pulse"
];
postInstall = stdenv.lib.optionalString libOnly ''
rm -rf $out/{bin,share,etc,lib/{pulse-*,systemd}}
'';
meta = with stdenv.lib; {
description = "Sound server for POSIX and Win32 systems";
homepage = http://www.pulseaudio.org/;
# Note: Practically, the server is under the GPL due to the
# dependency on `libsamplerate'. See `LICENSE' for details.
licenses = licenses.lgpl2Plus;
maintainers = with maintainers; [ lovek323 wkennington ];
platforms = platforms.unix;
longDescription = ''
PulseAudio is a sound server for POSIX and Win32 systems. A
sound server is basically a proxy for your sound applications.
It allows you to do advanced operations on your sound data as it
passes between your application and your hardware. Things like
transferring the audio to a different machine, changing the
sample format or channel count and mixing several sounds into
one are easily achieved using a sound server.
'';
};
}