summary refs log tree commit diff
path: root/pkgs/development/libraries/dbus
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/libraries/dbus')
-rw-r--r--pkgs/development/libraries/dbus/default.nix125
-rw-r--r--pkgs/development/libraries/dbus/implement-getgrouplist.patch108
-rw-r--r--pkgs/development/libraries/dbus/no-create-dirs.patch26
-rw-r--r--pkgs/development/libraries/dbus/systemd.patch14
-rw-r--r--pkgs/development/libraries/dbus/ucred-dirty-hack.patch18
5 files changed, 245 insertions, 46 deletions
diff --git a/pkgs/development/libraries/dbus/default.nix b/pkgs/development/libraries/dbus/default.nix
index 5716ac6648a0..786a24181f91 100644
--- a/pkgs/development/libraries/dbus/default.nix
+++ b/pkgs/development/libraries/dbus/default.nix
@@ -1,71 +1,104 @@
-{ stdenv, fetchurl, pkgconfig, expat, libX11, libICE, libSM, useX11 ? true }:
+{ stdenv, fetchurl, pkgconfig, autoconf, automake, libtool
+, expat, systemd, glib, dbus_glib, python
+, libX11, libICE, libSM, useX11 ? true }:
 
 let
-  version = "1.6.4";
+  version = "1.6.8"; # 1.7.* isn't recommended, even for gnome 3.8
+  sha256 = "1b0vq5b81synr0hqsfyypyq5yw305q0fq1f9alzv3vmb73pp04zw";
 
-  src = fetchurl {
-    url = "http://dbus.freedesktop.org/releases/dbus/dbus-${version}.tar.gz";
-    sha256 = "1wacqyfkcpayg7f8rvx9awqg275n5pksxq5q7y21lxjx85x6pfjz";
-  };
-
-  patches = [ ./ignore-missing-includedirs.patch ];
+  inherit (stdenv) lib;
 
-  configureFlags = "--localstatedir=/var --sysconfdir=/etc --with-session-socket-dir=/tmp";
-
-in rec {
+  buildInputsX = lib.optionals useX11 [ libX11 libICE libSM ];
 
-  libs = stdenv.mkDerivation {
-    name = "dbus-library-" + version;
+  # also other parts than "libs" need this statically linked lib
+  makeInternalLib = "(cd dbus && make libdbus-internal.la)";
 
-    nativeBuildInputs = [ pkgconfig ];
 
-    buildInputs = [ expat ];
+  # A generic builder for individual parts (subdirs) of D-Bus
+  dbus_drv = name: subdirs: merge: stdenv.mkDerivation (lib.mergeAttrsByFuncDefaultsClean [{
 
-    # FIXME: dbus has optional systemd integration when checking
-    # at_console policies.  How to enable this without introducing a
-    # circular dependency between dbus and systemd?
+    name = "dbus-${name}-${version}";
 
-    inherit src patches configureFlags;
+    src = fetchurl {
+      url = "http://dbus.freedesktop.org/releases/dbus/dbus-${version}.tar.gz";
+      inherit sha256;
+    };
 
-    preConfigure =
-      ''
-        sed -i '/mkinstalldirs.*localstatedir/d' bus/Makefile.in
-        sed -i '/SUBDIRS/s/ tools//' Makefile.in
-      '';
+    configureFlags = [
+      "--localstatedir=/var"
+      "--sysconfdir=/etc"
+      "--with-session-socket-dir=/tmp"
+      "--with-systemdsystemunitdir=$(out)/lib/systemd"
+    ];
 
-    # Enable X11 autolaunch support in libdbus.  This doesn't actually
-    # depend on X11 (it just execs dbus-launch in dbus.tools),
-    # contrary to what the configure script demands.
-    NIX_CFLAGS_COMPILE = "-DDBUS_ENABLE_X11_AUTOLAUNCH=1";
+    preConfigure = ''
+      patchShebangs .
+      substituteInPlace tools/Makefile.am --replace 'install-localstatelibDATA:' 'disabled:'
+      autoreconf -fi
+    '';
 
     installFlags = "sysconfdir=$(out)/etc";
-  };
-
-  tools = stdenv.mkDerivation {
-    name = "dbus-tools-" + version;
 
-    inherit src patches;
+    doCheck = true;
 
-    configureFlags = "${configureFlags} --with-dbus-daemondir=${daemon}/bin";
+    patches = [
+      ./ignore-missing-includedirs.patch ./implement-getgrouplist.patch
+      ./ucred-dirty-hack.patch ./no-create-dirs.patch
+    ];
 
     nativeBuildInputs = [ pkgconfig ];
+    propagatedBuildInputs = [ expat ];
+    buildInputs = [ autoconf automake libtool ]; # ToDo: optional selinux?
+
+    # build only the specified subdirs
+    postPatch = "sed '/SUBDIRS/s/=.*/=" + subdirs + "/' -i Makefile.am\n"
+      # use already packaged libdbus instead of trying to build it again
+      + lib.optionalString (name != "libs") ''
+          for mfile in */Makefile.am; do
+            sed 's,\$(top_builddir)/dbus/\(libdbus-[0-9]\),${libs}/lib/\1,g' -i "$mfile"
+          done
+        '';
+
+  } merge ]);
+
+  libs = dbus_drv "libs" "dbus" {
+    buildInputs = [ systemd.headers ];
+    patches = [ ./systemd.patch ]; # bypass systemd detection
+
+    # Enable X11 autolaunch support in libdbus. This doesn't actually depend on X11
+    # (it just execs dbus-launch in dbus.tools), contrary to what the configure script demands.
+    NIX_CFLAGS_COMPILE = "-DDBUS_ENABLE_X11_AUTOLAUNCH=1";
+  };
 
-    buildInputs = [ expat libs ]
-      ++ stdenv.lib.optionals useX11 [ libX11 libICE libSM ];
+in rec {
 
-    NIX_LDFLAGS = "-ldbus-1";
+  # This package has been split because most applications only need dbus.lib
+  # which serves as an interface to a *system-wide* daemon,
+  # see e.g. http://en.wikipedia.org/wiki/D-Bus#Architecture .
+  # Also some circular dependencies get split by this (like with systemd).
 
-    preConfigure =
-      ''
-        sed -i 's@$(top_builddir)/dbus/libdbus-1.la@@' tools/Makefile.in
-        substituteInPlace tools/Makefile.in --replace 'install-localstatelibDATA:' 'disabled:'
-      '';
+  inherit libs;
 
-    postConfigure = "cd tools";
+  tools = dbus_drv "tools" "tools" {
+    configureFlags = [ "--with-dbus-daemondir=${daemon}/bin" ];
+    buildInputs = buildInputsX ++ [ libs daemon systemd dbus_glib ];
+    NIX_CFLAGS_LINK = "-Wl,--as-needed -ldbus-1";
+  };
 
-    installFlags = "localstatedir=$TMPDIR/var";
+  daemon = dbus_drv "daemon" "bus" {
+    preBuild = makeInternalLib;
+    buildInputs = [ systemd ];
   };
 
-  # I'm too lazy to separate daemon and libs now.
-  daemon = libs;
+  # Some of the tests don't work yet; in fact, @vcunat tried several packages
+  # containing dbus testing, and all of them have some test failure.
+  tests = dbus_drv "tests" "test" {
+    preBuild = makeInternalLib;
+    buildInputs = buildInputsX ++ [ systemd libs tools daemon dbus_glib python ];
+    NIX_CFLAGS_LINK = "-Wl,--as-needed -ldbus-1";
+  };
+
+  docs = dbus_drv "docs" "doc" {
+    postInstall = ''rm -r "$out/lib"'';
+  };
 }
diff --git a/pkgs/development/libraries/dbus/implement-getgrouplist.patch b/pkgs/development/libraries/dbus/implement-getgrouplist.patch
new file mode 100644
index 000000000000..e3a4a25cb720
--- /dev/null
+++ b/pkgs/development/libraries/dbus/implement-getgrouplist.patch
@@ -0,0 +1,108 @@
+Compatibility patch for Illumos/Solaris and possibly other platforms.
+Implements getgrouplist when not provided by OS.
+Without it, only the user's primary group is used in authentication!
+--- 	1970-01-01 00:00:00.000000000 +0000
++++ dbus-1.6.8/dbus/getgrouplist.c	2013-02-28 13:10:51.081792722 +0000
+@@ -0,0 +1,89 @@
++/*	$OpenBSD: getgrouplist.c,v 1.12 2005/08/08 08:05:34 espie Exp $ */
++/*
++ * Copyright (c) 1991, 1993
++ *	The Regents of the University of California.  All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. Neither the name of the University nor the names of its contributors
++ *    may be used to endorse or promote products derived from this software
++ *    without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++/* OPENBSD ORIGINAL: lib/libc/gen/getgrouplist.c */
++
++/*
++ * get credential
++ */
++#include <sys/types.h>
++#include <string.h>
++#include <unistd.h>
++#include <grp.h>
++
++int
++getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt)
++{
++	struct group *grp;
++	int i, ngroups;
++	int ret, maxgroups;
++	int bail;
++
++	ret = 0;
++	ngroups = 0;
++	maxgroups = *grpcnt;
++
++	/*
++	 * install primary group
++	 */
++	if (ngroups >= maxgroups) {
++		*grpcnt = ngroups;
++		return (-1);
++	}
++	groups[ngroups++] = agroup;
++
++	/*
++	 * Scan the group file to find additional groups.
++	 */
++	setgrent();
++	while ((grp = getgrent())) {
++		if (grp->gr_gid == agroup)
++			continue;
++		for (bail = 0, i = 0; bail == 0 && i < ngroups; i++)
++			if (groups[i] == grp->gr_gid)
++				bail = 1;
++		if (bail)
++			continue;
++		for (i = 0; grp->gr_mem[i]; i++) {
++			if (!strcmp(grp->gr_mem[i], uname)) {
++				if (ngroups >= maxgroups) {
++					ret = -1;
++					goto out;
++				}
++				groups[ngroups++] = grp->gr_gid;
++				break;
++			}
++		}
++	}
++out:
++	endgrent();
++	*grpcnt = ngroups;
++	return (ret);
++}
+--- dbus-1.6.8/dbus/dbus-sysdeps-unix.c.orig	2013-02-28 13:08:52.171215237 +0000
++++ dbus-1.6.8/dbus/dbus-sysdeps-unix.c	2013-02-28 13:13:52.224615146 +0000
+@@ -21,6 +21,10 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+  *
+  */
++#ifndef HAVE_GETGROUPLIST
++#include "getgrouplist.c"
++#define HAVE_GETGROUPLIST
++#endif
+ 
+ #include <config.h>
+ 
diff --git a/pkgs/development/libraries/dbus/no-create-dirs.patch b/pkgs/development/libraries/dbus/no-create-dirs.patch
new file mode 100644
index 000000000000..cf10d9775991
--- /dev/null
+++ b/pkgs/development/libraries/dbus/no-create-dirs.patch
@@ -0,0 +1,26 @@
+diff --git a/bus/Makefile.am b/bus/Makefile.am
+index 6cbc09a..be60bb8 100644
+--- a/bus/Makefile.am
++++ b/bus/Makefile.am
+@@ -212,7 +212,6 @@ clean-local:
+ 	/bin/rm *.bb *.bbg *.da *.gcov || true
+ 
+ install-data-hook:
+-	$(mkinstalldirs) $(DESTDIR)$(localstatedir)/run/dbus
+ 	$(mkinstalldirs) $(DESTDIR)$(configdir)/system.d
+ 	$(mkinstalldirs) $(DESTDIR)$(configdir)/session.d
+ 	$(mkinstalldirs) $(DESTDIR)$(datadir)/dbus-1/services
+diff --git a/tools/Makefile.am b/tools/Makefile.am
+index cfd54b8..b6e28f9 100644
+--- a/tools/Makefile.am
++++ b/tools/Makefile.am
+@@ -74,7 +74,7 @@ CLEANFILES = 				\
+ 
+ # create the /var/lib/dbus directory for dbus-uuidgen
+ install-data-local:
+-	$(MKDIR_P) $(DESTDIR)$(localstatedir)/lib/dbus
++	:
+ 
+ installcheck-local:
+-	test -d $(DESTDIR)$(localstatedir)/lib/dbus
++	:
diff --git a/pkgs/development/libraries/dbus/systemd.patch b/pkgs/development/libraries/dbus/systemd.patch
new file mode 100644
index 000000000000..7e6cb1f87d07
--- /dev/null
+++ b/pkgs/development/libraries/dbus/systemd.patch
@@ -0,0 +1,14 @@
+diff --git a/configure.ac b/configure.ac
+index 24fcc9e..98e0459 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1167,7 +1167,8 @@ else
+     PKG_CHECK_MODULES(SYSTEMD,
+         [libsystemd-login >= 32, libsystemd-daemon >= 32],
+         have_systemd=yes,
+-        have_systemd=no)
++        have_systemd=yes)
++    AC_MSG_NOTICE([NixOS: do not care whether we found systemd or not])
+ fi
+ 
+ if test x$have_systemd = xyes; then
diff --git a/pkgs/development/libraries/dbus/ucred-dirty-hack.patch b/pkgs/development/libraries/dbus/ucred-dirty-hack.patch
new file mode 100644
index 000000000000..a07abcc15fb0
--- /dev/null
+++ b/pkgs/development/libraries/dbus/ucred-dirty-hack.patch
@@ -0,0 +1,18 @@
+diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c
+index b4ecc96..267984a 100644
+--- a/dbus/dbus-sysdeps-unix.c
++++ b/dbus/dbus-sysdeps-unix.c
+@@ -1635,6 +1635,13 @@ write_credentials_byte (int             server_fd,
+     }
+ }
+ 
++struct ucred
++{
++  pid_t pid;			/* PID of sending process.  */
++  uid_t uid;			/* UID of sending process.  */
++  gid_t gid;			/* GID of sending process.  */
++};
++
+ /**
+  * Reads a single byte which must be nul (an error occurs otherwise),
+  * and reads unix credentials if available. Clears the credentials