{
  lib,
  stdenv,
  fetchFromGitHub,
  pkgs,
  ...
}:

let
  meta = {
    maintainers = with lib.maintainers; [ peterhoeg ];
    platforms = lib.platforms.linux;
  };

  dep =
    {
      pname,
      version,
      hash,
      rev ? "v${version}",
      buildInputs ? [ ],
    }:
    stdenv.mkDerivation {
      inherit pname version;
      src = fetchFromGitHub {
        owner = "c-util";
        repo = pname;
        inherit hash rev;
      };
      nativeBuildInputs = with pkgs; [
        meson
        ninja
        pkg-config
      ];
      inherit buildInputs;
      meta = meta // {
        description = "The C-Util Project is a collection of utility libraries for the C11 language.";
        homepage = "https://c-util.github.io/";
        license = [
          lib.licenses.asl20
          lib.licenses.lgpl21Plus
        ];
      };
    };

  # These libraries are not used outside of dbus-broker.
  #
  # If that changes, we can always break them out, but they are essentially
  # part of the dbus-broker project, just in separate repositories.
  c-dvar = dep {
    pname = "c-dvar";
    version = "1.1.0";
    hash = "sha256-p/C+BktclVseCtZJ1Q/YK03vP2ClnYRLB1Vmj2OQJD4=";
    buildInputs = [
      c-stdaux
      c-utf8
    ];
  };
  c-ini = dep {
    pname = "c-ini";
    version = "1.1.0";
    hash = "sha256-wa7aNl20hkb/83c4AkQ/0YFDdmBs4XGW+WLUtBWIC98=";
    buildInputs = [
      c-list
      c-rbtree
      c-stdaux
      c-utf8
    ];
  };
  c-list = dep {
    pname = "c-list";
    version = "3.1.0";
    hash = "sha256-fp3EAqcbFCLaT2EstLSzwP2X13pi2EFpFAullhoCtpw=";
  };
  c-rbtree = dep {
    pname = "c-rbtree";
    version = "3.2.0";
    hash = "sha256-dTMeawhPLRtHvMXfXCrT5iCdoh7qS3v+raC6c+t+X38=";
    buildInputs = [ c-stdaux ];
  };
  c-shquote = dep {
    pname = "c-shquote";
    version = "1.1.0";
    hash = "sha256-z6hpQ/kpCYAngMNfxLkfsxaGtvP4yBMigX1lGpIIzMQ=";
    buildInputs = [ c-stdaux ];
  };
  c-stdaux = dep {
    pname = "c-stdaux";
    version = "1.5.0";
    hash = "sha256-MsnuEyVCmOIr/q6I1qyPsNXp48jxIEcXoYLHbOAZtW0=";
  };
  c-utf8 = dep {
    pname = "c-utf8";
    version = "1.1.0";
    hash = "sha256-9vBYylbt1ypJwIAQJd/oiAueh+4VYcn/KzofQuhUea0=";
    buildInputs = [ c-stdaux ];
  };

in

stdenv.mkDerivation (finalAttrs: {
  pname = "dbus-broker";
  version = "36";

  src = fetchFromGitHub {
    owner = "bus1";
    repo = "dbus-broker";
    rev = "v${finalAttrs.version}";
    hash = "sha256-5dAMKjybqrHG57vArbtWEPR/svSj2ION75JrjvnnpVM=";
  };

  nativeBuildInputs = with pkgs; [
    docutils
    meson
    ninja
    pkg-config
  ];

  buildInputs = [
    c-dvar
    c-ini
    c-list
    c-rbtree
    c-shquote
    c-stdaux
    c-utf8
    pkgs.dbus
    pkgs.linuxHeaders
    pkgs.systemd
  ];

  mesonFlags = [
    # while we technically support 4.9 and 4.14, the NixOS module will throw an
    # error when using a kernel that's too old
    "--prefix=/"
    "--bindir=/usr/bin"
    "-D=linux-4-17=true"
    "-D=system-console-users=gdm,sddm,lightdm"
  ];

  PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "/usr/lib/systemd/system";
  PKG_CONFIG_SYSTEMD_SYSTEMDUSERUNITDIR = "/usr/lib/systemd/user";
  PKG_CONFIG_SYSTEMD_CATALOGDIR = "/usr/lib/systemd/catalog";

  preInstall = ''
    export DESTDIR=${placeholder "out"}
  '';

  postInstall = ''
    mkdir -p $out/usr/share
    cp -Pr ${pkgs.dbus.out}/share/* $out/usr/share/
    cp ${pkgs.dbus.out}/etc/systemd/system/dbus.socket $out/usr/lib/systemd/system/
    mv $out/usr/lib/systemd/system/dbus-broker.service $out/usr/lib/systemd/system/dbus.service
    find $out/usr/share/ -type d -exec chmod 755 {} \;
    sed -i 's#/nix/store.*/share#/usr/share#' $out/usr/share/xml/dbus-1/catalog.xml
    sed -i 's#/nix/store.*/libexec#/usr/bin#' $out/usr/share/dbus-1/system.conf
  '';

  doCheck = false;

  meta = meta // {
    description = "Linux D-Bus Message Broker";
    homepage = "https://github.com/bus1/dbus-broker/wiki";
    license = lib.licenses.asl20;
  };
})