about summary refs log tree commit diff
path: root/pkgs/aszlig
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2017-04-23 22:03:34 +0200
committeraszlig <aszlig@redmoonstudios.org>2017-04-23 23:08:05 +0200
commitb3d9a07086cb81e53e20837c96a3153453b0a123 (patch)
treee6c496d73203465d2ec4265d3200bf32f56362b3 /pkgs/aszlig
parent145a8be2b22a3a0459a46e70e8b5d8f4ecc701aa (diff)
pkgs: Move all of my packages into pkgs/aszlig
This already has started in e0abe1dbbda54c1f048b5d38df05e1a3289216a6
with @Profpatsch putting his packages into its own namespace, so let's
continue on that and move my crap into my own namespace as well.

The only difference in my approach is that I'm now also using a new
function called callPackageScope, which declutters pkgs/default.nix a
bit and moves the individual callPackage invocations into
aszlig/default.nix.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'pkgs/aszlig')
-rwxr-xr-xpkgs/aszlig/aacolorize/aacolorize.py182
-rw-r--r--pkgs/aszlig/aacolorize/default.nix13
-rw-r--r--pkgs/aszlig/axbo/default.nix53
-rw-r--r--pkgs/aszlig/default.nix14
-rw-r--r--pkgs/aszlig/git-detach/default.nix33
-rw-r--r--pkgs/aszlig/grandpa/default.nix18
-rw-r--r--pkgs/aszlig/librxtx-java/default.nix47
-rw-r--r--pkgs/aszlig/lockdev/default.nix23
-rw-r--r--pkgs/aszlig/nixops/default.nix37
-rw-r--r--pkgs/aszlig/pvolctrl/default.nix35
-rw-r--r--pkgs/aszlig/santander/default.nix155
-rw-r--r--pkgs/aszlig/santander/pipelight.patch13
-rw-r--r--pkgs/aszlig/santander/wine-no-unixfs.patch292
-rw-r--r--pkgs/aszlig/santander/winscard.patch11
-rw-r--r--pkgs/aszlig/tomahawk/default.nix90
15 files changed, 1016 insertions, 0 deletions
diff --git a/pkgs/aszlig/aacolorize/aacolorize.py b/pkgs/aszlig/aacolorize/aacolorize.py
new file mode 100755
index 00000000..ff19b687
--- /dev/null
+++ b/pkgs/aszlig/aacolorize/aacolorize.py
@@ -0,0 +1,182 @@
+#!/usr/bin/env python
+import os
+import sys
+
+from optparse import Option, OptionParser
+
+COLORS = {
+    "k": (30, "Black"),
+    "r": (31, "Red"),
+    "g": (32, "Green"),
+    "y": (33, "Yellow"),
+    "b": (34, "Blue"),
+    "p": (35, "Pink"),
+    "c": (36, "Cyan"),
+    "w": (37, "White"),
+}
+
+ESC = chr(27)
+
+class ColorizeError(Exception):
+    pass
+
+class Color(object):
+    def __init__(self, ident=None):
+        """
+        Initialize a color object, if no `ident` is given or it's invalid,
+        the Color object represents "no color".
+        """
+        if ident is not None:
+            spec = COLORS.get(ident.lower(), None)
+        else:
+            spec = None
+
+        if spec is None:
+            self.ident = None
+            self.bold = False
+            self.code = None
+            self.name = "None"
+        else:
+            self.ident = ident
+            self.code, self.name = spec
+
+            if ident.isupper():
+                self.bold = True
+            else:
+                self.bold = False
+
+    @property
+    def attrs(self):
+        """
+        A tuple consisting of the SGR attributes.
+        """
+        if self.ident is None:
+            return ()
+
+        if self.bold:
+            return (1, self.code)
+        else:
+            return (self.code,)
+
+    def sgr_attrs(self, *attrs):
+        """
+        Return the attributes specified by `attrs` formatted according
+        to the CSI specification.
+        """
+        return ';'.join(map(lambda c: str(c), attrs))
+
+    def sgr(self, *attrs):
+        """
+        Start Set Graphics Rendition
+        Return the CSI escape code for `attrs`.
+        """
+        return "%s[%sm" % (ESC, self.sgr_attrs(*attrs))
+
+    def sgr_start(self):
+        """
+        Start Set Graphics Rendition
+        Return the CSI start escape code for the current color.
+        """
+        return self.sgr(*self.attrs)
+
+    def sgr_stop(self):
+        """
+        Clear Set Graphics Rendition
+        """
+        return self.sgr()
+
+    def apply(self, value):
+        """
+        Apply the current color to the string in `value`.
+        """
+        return "%s%s%s" % (self.sgr_start(), value, self.sgr_stop())
+
+    def describe(self):
+        """
+        Return the description of the current color IN color :-)
+        """
+        fmt = "%c: <ESC>[%sm -> [%s]"
+        return fmt % (
+            self.ident,
+            self.sgr_attrs(*self.attrs),
+            self.apply(self.name)
+        )
+
+    def transform_to(self, new_color):
+        """
+        Return the CSI sequences needed to transform into `new_color`.
+        """
+        if self.ident is None and new_color.ident is not None:
+            return new_color.sgr_start()
+        elif self.ident is not None and new_color.ident is None:
+            return self.sgr_stop()
+        elif self.ident is None and new_color.ident is None:
+            return ''
+        elif self.code == new_color.code:
+            if not self.bold and new_color.bold:
+                return self.sgr(1)
+            elif self.bold and not new_color.bold:
+                return self.sgr(22)
+            elif self.bold == new_color.bold:
+                return ''
+        else:
+            if self.bold and new_color.bold:
+                return new_color.sgr(new_color.code)
+
+        return self.sgr_stop()+new_color.sgr_start()
+
+    def __repr__(self):
+        if self.bold:
+            return "<Bold color %s>" % self.name.lower()
+        else:
+            return "<Color %s>" % self.name.lower()
+
+def print_colortable():
+    for ident in COLORS.iterkeys():
+        normal = Color(ident).describe()
+        bold = Color(ident.upper()).describe()
+        sys.stdout.write("%-35s%s\n" % (normal, bold))
+
+def colorize_art(art, colmap):
+    if len(art) != len(colmap):
+        raise ColorizeError("Art and colormap differ in size!")
+
+    no_color = Color()
+
+    out = ""
+    last_color = no_color
+    for i, char in enumerate(colmap):
+        color = Color(char)
+        out += last_color.transform_to(color) + art[i]
+        last_color = color
+
+    last_color.transform_to(no_color)
+
+    return out
+
+def colorize_file(artfile, mapfile=None):
+    if mapfile is None:
+        mapfile = os.path.splitext(artfile)[0]+'.colmap'
+
+    asciiart = open(artfile, 'r').read()
+    colormap = open(mapfile, 'r').read()
+
+    return colorize_art(asciiart, colormap)
+
+if __name__ == "__main__":
+    parser = OptionParser(usage="%prog [options] artfile [mapfile]")
+    parser.add_option("-t", "--table", action="store_true", dest="table",
+                      help="Show color table and exit.")
+
+    (options, args) = parser.parse_args()
+
+    if options.table:
+        print_colortable()
+        parser.exit()
+
+    if not len(args) in (1, 2):
+        parser.print_help()
+        parser.exit()
+    else:
+        colorized = colorize_file(*args)
+        sys.stdout.write(colorized)
diff --git a/pkgs/aszlig/aacolorize/default.nix b/pkgs/aszlig/aacolorize/default.nix
new file mode 100644
index 00000000..ef36f4e0
--- /dev/null
+++ b/pkgs/aszlig/aacolorize/default.nix
@@ -0,0 +1,13 @@
+{ pythonPackages, runCommand }:
+
+pythonPackages.buildPythonPackage {
+  name = "aacolorize";
+  src = runCommand "aacolorize-src" {} ''
+    mkdir -p "$out"
+    cp "${./aacolorize.py}" "$out/aacolorize"
+    cat > "$out/setup.py" <<SETUP
+    from distutils.core import setup
+    setup(name='aacolorize', scripts=['aacolorize'])
+    SETUP
+  '';
+}
diff --git a/pkgs/aszlig/axbo/default.nix b/pkgs/aszlig/axbo/default.nix
new file mode 100644
index 00000000..fe503863
--- /dev/null
+++ b/pkgs/aszlig/axbo/default.nix
@@ -0,0 +1,53 @@
+{ stdenv, fetchurl, fetchFromGitHub, jdk, jre, ant, makeWrapper
+, commonsLogging, librxtx_java
+}:
+
+stdenv.mkDerivation rec {
+  name = "axbo-research-${version}";
+  version = "3.0.12";
+
+  src = fetchFromGitHub {
+    owner = "jansolo";
+    repo = "aXbo-research";
+    #rev = "aXbo-research_${version}";
+    # Includes MIT license:
+    rev = "6e6888917b5f200a44509650d6f46ec42c133cdc";
+    sha256 = "0nbyxajl75q80cnyl9c0sjlyk3rmhm7k8w8mksg4lfyh78ynayyc";
+  };
+
+  sourceRoot = "${src.name}/aXbo-research";
+
+  buildInputs = [ jdk ant makeWrapper ];
+
+  buildPhase = ''
+    ant -Dplatforms.JDK_1.7.home="$JAVA_HOME" jar
+  '';
+
+  extraJars = [
+    "commons-beanutils-1.8.3"
+    "commons-digester3-3.2"
+    "commons-io-2.4"
+    "jcommon-1.0.20"
+    "jfreechart-1.0.16"
+    "streamflyer-core-1.0.1"
+    "swingx-all-1.6.4"
+  ];
+
+  installPhase = with stdenv.lib; let
+    classpath = makeSearchPath "share/java/\\*" [
+      "$out"
+      commonsLogging
+      librxtx_java
+    ];
+  in ''
+    for dep in $extraJars; do
+      install -vD -m 644 "lib/$dep.jar" "$out/share/java/$dep.jar"
+    done
+    install -vD -m 644 dist/axbo.jar "$out/share/java/axbo.jar"
+
+    mkdir -p "$out/bin"
+    makeWrapper "${jre}/bin/java" "$out/bin/axbo-research" \
+      --add-flags "-Djava.library.path='${librxtx_java}/lib'" \
+      --add-flags "-cp ${classpath} com.dreikraft.axbo.Axbo"
+  '';
+}
diff --git a/pkgs/aszlig/default.nix b/pkgs/aszlig/default.nix
new file mode 100644
index 00000000..1d2a3e0b
--- /dev/null
+++ b/pkgs/aszlig/default.nix
@@ -0,0 +1,14 @@
+{ callPackage, callPackage_i686, boost155 }:
+
+{
+  aacolorize = callPackage ./aacolorize { };
+  axbo = callPackage ./axbo { };
+  git-detach = callPackage ./git-detach { };
+  grandpa = callPackage ./grandpa { };
+  nixops = callPackage ./nixops { };
+  librxtx_java = callPackage ./librxtx-java { };
+  lockdev = callPackage ./lockdev { };
+  pvolctrl = callPackage ./pvolctrl { };
+  santander = callPackage_i686 ./santander { };
+  tomahawk = callPackage ./tomahawk { boost = boost155; };
+}
diff --git a/pkgs/aszlig/git-detach/default.nix b/pkgs/aszlig/git-detach/default.nix
new file mode 100644
index 00000000..fb20843e
--- /dev/null
+++ b/pkgs/aszlig/git-detach/default.nix
@@ -0,0 +1,33 @@
+{ writeScriptBin, stdenv, git, coreutils, patch }:
+
+writeScriptBin "git-detach" ''
+  #!${stdenv.shell}
+
+  if [ $# -le 0 -o "$1" = "--help" -o "$1" = "-h" ]; then
+      echo "Usage: $0 COMMAND [ARGS...]" >&2
+      echo >&2
+      echo "Run COMMAND in a clean Git working directory" >&2
+      echo "without untracked files and .git directory." >&2
+      exit 1
+  fi
+
+  diffToHead="$("${git}/bin/git" diff HEAD)"
+
+  if tmpdir="$("${coreutils}/bin/mktemp" -d git-detach.XXXXXXXXXX)"; then
+    trap "rm -rf '${"\${tmpdir//\\'/\\'\\\\\\'\\'}"}'" EXIT
+    "${git}/bin/git" archive --format=tar HEAD | (
+      set -e
+      basedir="$tmpdir/$("${coreutils}/bin/basename" "$(pwd)")"
+      mkdir "$basedir"
+      cd "$basedir"
+      tar x
+      if [ -n "$diffToHead" ]; then
+        echo "$diffToHead" | "${patch}/bin/patch" -s -p1
+      fi
+      exec "$@"
+    )
+    exit $?
+  else
+    echo "Unable to create temporary directory!" >&2
+  fi
+''
diff --git a/pkgs/aszlig/grandpa/default.nix b/pkgs/aszlig/grandpa/default.nix
new file mode 100644
index 00000000..f37f6b2f
--- /dev/null
+++ b/pkgs/aszlig/grandpa/default.nix
@@ -0,0 +1,18 @@
+{ fetchFromGitHub, pythonPackages, gpm }:
+
+pythonPackages.buildPythonPackage {
+  name = "grandpa-0.5";
+  namePrefix = "";
+
+  src = fetchFromGitHub {
+    owner = "aszlig";
+    repo = "GrandPA";
+    rev = "d8d2571f732a68ed18be7533244db2cfb822b4c1";
+    sha256 = "19zf3pnr1adngncvinvn8yyvc0sj66lp7lwiql6379rf78xxlmhn";
+  };
+
+  doCheck = false;
+
+  buildInputs = [ pythonPackages.cython gpm ];
+  propagatedBuildInputs = [ pythonPackages.pyserial ];
+}
diff --git a/pkgs/aszlig/librxtx-java/default.nix b/pkgs/aszlig/librxtx-java/default.nix
new file mode 100644
index 00000000..1553a146
--- /dev/null
+++ b/pkgs/aszlig/librxtx-java/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchurl, fetchpatch, unzip, jdk, lockdev }:
+
+stdenv.mkDerivation rec {
+  name = "rxtx-${version}";
+  version = "2.2pre2";
+
+  src = fetchurl {
+    urls = [
+      "http://rxtx.qbang.org/pub/rxtx/${name}.zip"
+      "ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${name}.zip"
+    ];
+    sha256 = "00sv9604hkq81mshih0fhqfzn4mf01d6rish6vplsi0gfqz3fc1w";
+  };
+
+  patches = let
+    baseurl = "https://sources.debian.net/data/main/"
+            + "r/rxtx/2.2pre2-13/debian/patches";
+  in [
+    (fetchpatch {
+      url = "${baseurl}/fhs_lock_buffer_overflow_fix.patch";
+      sha256 = "1v31q6ciy5v6bm5z8a1wssqn4nwvbcg4nnplgsvv1h8mzdq2832i";
+    })
+    (fetchpatch {
+      url = "${baseurl}/fix_snprintf.patch";
+      sha256 = "09r9jca0hb13bx85l348jkxnh1p0g5i0d6dnpm142vlwsj0d7afy";
+    })
+    (fetchpatch {
+      url = "${baseurl}/format_security.patch";
+      sha256 = "0adg7y9ak4xvgyswdhx6fsxq8jlb8y55xl3s6l0p8w0mfrhw7ysk";
+    })
+  ];
+
+  buildInputs = [ unzip jdk lockdev ];
+
+  NIX_CFLAGS_COMPILE = "-DUTS_RELEASE=\"3.8.0\"";
+
+  configureFlags = [ "--enable-liblock" ];
+
+  makeFlags = [
+    "JHOME=$(out)/share/java"
+    "RXTX_PATH=$(out)/lib"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib" "$out/share/java"
+  '';
+}
diff --git a/pkgs/aszlig/lockdev/default.nix b/pkgs/aszlig/lockdev/default.nix
new file mode 100644
index 00000000..52e78eb5
--- /dev/null
+++ b/pkgs/aszlig/lockdev/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, perl }:
+
+let
+  baseurl = "ftp://ftp.debian.org/debian/pool/main/l/lockdev/";
+in stdenv.mkDerivation rec {
+  name = "lockdev-${version}";
+  version = "1.0.3";
+
+  buildInputs = [ perl ];
+
+  patches = stdenv.lib.singleton (fetchurl {
+    url = baseurl + "lockdev_1.0.3-1.5.diff.gz";
+    sha256 = "1l3pq1nfb5qx3i91cjaiz3c53368gw6m28a5mv9391n5gmsdmi3r";
+  });
+
+  NIX_CFLAGS_COMPILE = "-fPIC -D_PATH_LOCK=\"/tmp\"";
+  installFlags = [ "basedir=$(out)" ];
+
+  src = fetchurl {
+    url = baseurl + "lockdev_${version}.orig.tar.gz";
+    sha256 = "10lzhq6r2dn8y3ki7wlqsa8s3ndkf842bszcjw4dbzf3g9fn7bnc";
+  };
+}
diff --git a/pkgs/aszlig/nixops/default.nix b/pkgs/aszlig/nixops/default.nix
new file mode 100644
index 00000000..f97e3716
--- /dev/null
+++ b/pkgs/aszlig/nixops/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchFromGitHub, fetchpatch, git }:
+
+let
+  rev = "bbf9a792d06c9a60c74dabe2937a9dfda9bff8f7";
+  sha256 = "0a1mx0ngp0zg65r1rx99rina4wbfjyzrziw2z9788v629j58p4jd";
+
+  master = stdenv.mkDerivation rec {
+    name = "nixops-upstream-patched";
+
+    src = fetchFromGitHub {
+      owner = "NixOS";
+      repo = "nixops";
+      inherit rev sha256;
+    };
+
+    phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+
+    postPatch = ''
+      sed -i -re 's!<nixpkgs([^>]*)>!${import ../../../nixpkgs-path.nix}\1!g' \
+        release.nix doc/manual/default.nix doc/manual/resource.nix
+    '';
+
+    installPhase = ''
+      cp -a . "$out"
+    '';
+  };
+
+  release = import "${master}/release.nix" {
+    nixopsSrc = {
+      outPath = master;
+      inherit rev;
+      revCount = 0;
+      shortRev = builtins.substring 0 7 rev;
+    };
+    officialRelease = false;
+  };
+in stdenv.lib.getAttr stdenv.system release.build
diff --git a/pkgs/aszlig/pvolctrl/default.nix b/pkgs/aszlig/pvolctrl/default.nix
new file mode 100644
index 00000000..5701c19e
--- /dev/null
+++ b/pkgs/aszlig/pvolctrl/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, libpulseaudio }:
+
+stdenv.mkDerivation rec {
+  name = "pvolctrl-0.23";
+
+  unpackPhase = let
+    baseurl = "https://sites.google.com/site/guenterbartsch/blog/"
+            + "volumecontrolutilityforpulseaudio/";
+    makefile = fetchurl {
+      url = baseurl + "Makefile";
+      sha256 = "0l2ffvb617csk6h29y64v6ywhpcp7la6vvcip1w4nq0yry6jhrqz";
+    };
+    source = fetchurl {
+      url = baseurl + "pvolctrl.c";
+      sha256 = "0vcd5dlw9l47jpabwmmzdvlkn67fz55dr3sryyh56sl263mibjda";
+    };
+  in ''
+    mkdir -p "${name}"
+    sed -e 's|/usr/bin/||' "${makefile}" > "${name}/Makefile"
+    sed -e 's/PA_VOLUME_MAX/PA_VOLUME_NORM/
+    /avg_vol += (avg_vol \* vol_mod) \/ 100;/ {
+      s/(avg_vol/((int)PA_VOLUME_NORM/
+    }
+    /if (vol_mod)/i \
+      if (info->name == NULL || strncmp(info->name, "combined", 8) != 0) \
+        return;' "${source}" > "${name}/pvolctrl.c"
+    sourceRoot="${name}"
+  '';
+
+  installPhase = ''
+    install -D -T pvolctrl "$out/bin/pvolctrl"
+  '';
+
+  buildInputs = [ pkgconfig libpulseaudio ];
+}
diff --git a/pkgs/aszlig/santander/default.nix b/pkgs/aszlig/santander/default.nix
new file mode 100644
index 00000000..9f6690b0
--- /dev/null
+++ b/pkgs/aszlig/santander/default.nix
@@ -0,0 +1,155 @@
+{ stdenv, fetchurl, fetchgit, fetchFromBitbucket
+, runCommand, writeScript, writeScriptBin, writeText
+, xvfb_run, xdotool, coreutils, wineMinimal, pipelight, dwb-unwrapped, pcsclite
+}:
+
+let
+  name = "SecurityPluginHBCIChipcard";
+  version = "2.9.8.0";
+  dllName = "NP_${name}.dll";
+
+  pluginInstaller = fetchurl {
+    url = "https://service.santanderbank.de/special/banking/files/"
+        + "SecurityPluginHBCIChipcard-${version}-Installer.exe";
+    sha256 = "0xnfb730mwxdx83dnqyplp4bxwx6g01wc87xa4dl1spxia9kjmmh";
+  };
+
+  patchedWine = let
+    libpcsclite = "${pcsclite}/lib/libpcsclite.so";
+  in (wineMinimal.override {
+    wineBuild = "wine32";
+    wineRelease = "staging";
+  }).overrideDerivation (drv: {
+    scard4wine = fetchgit {
+      url = "git://git.code.sf.net/p/scard4wine/code";
+      rev = "c14c02c80bf1f2bb4cedd1f53a3a2ab9c48bed76";
+      sha256 = "0ffmbl9mdnaih4h3ggpnzqbih3kgbwl3wv6j1ag5s4czn8gcpdq3";
+    };
+
+    prePatch = (drv.prePatch or "") + ''
+      cp -t dlls/winscard "$scard4wine/src/"*
+      sed -i -re 's,"libpcsclite\.so(\.[0-9]+)*","${libpcsclite}",' \
+        dlls/winscard/winscard.c
+    '';
+
+    patches = (drv.patches or []) ++ [ ./winscard.patch ];
+
+    postPatch = (drv.postPatch or "") + ''
+      sed -i -e '/not owned by you/d' libs/wine/config.c
+      # Modified patch from https://bugs.winehq.org/show_bug.cgi?id=22450
+      patch -p1 < "${./wine-no-unixfs.patch}"
+    '';
+  });
+
+  installPath = [ "Program Files" "ppi" "SecurityPluginHBCIChipcard" ];
+
+  scard4wine = stdenv.mkDerivation rec {
+    name = "scard4wine-${version}";
+    version = "1.2.0-2016-06-05";
+
+    src = fetchgit {
+      url = "git://git.code.sf.net/p/scard4wine/code";
+      rev = "c14c02c80bf1f2bb4cedd1f53a3a2ab9c48bed76";
+      sha256 = "0ffmbl9mdnaih4h3ggpnzqbih3kgbwl3wv6j1ag5s4czn8gcpdq3";
+    };
+  };
+
+  winePrefix = runCommand "santander-wineprefix" {
+    installPath = stdenv.lib.concatStringsSep "/" (installPath ++ [ dllName ]);
+  } ''
+    export WINEPREFIX="$out"
+    export WINEDLLOVERRIDES="mscoree,mshtml="
+    mkdir -p "$out"
+    ${patchedWine}/bin/wine wineboot.exe
+    ${xvfb_run}/bin/xvfb-run "${writeScript "install-santander-wine" ''
+      ${patchedWine}/bin/wine "${pluginInstaller}" &
+      while [ "$(jobs -r | wc -l)" -gt 0 ]; do
+        ${xdotool}/bin/xdotool \
+          search --sync --onlyvisible \
+          --name 'Security-Plugin-HBCI-Chipcard ${version}' \
+          key Return &> /dev/null || :
+        sleep 1
+      done
+      wait
+    ''}"
+    if [ ! -e "$out/drive_c/$installPath" ]; then
+      echo "Unable to find plugin in $installPath." >&2
+      exit 1
+    fi
+    ln -sf -T "${builtins.storeDir}" "$WINEPREFIX/dosdevices/z:"
+    echo disable > "$WINEPREFIX/.update-timestamp"
+  '';
+
+  pluginConfig = {
+    winePath = "$share/wine";
+    inherit winePrefix dllName;
+    wineArch = "win32";
+    pluginLoaderPath = "$share/pluginloader.exe";
+    dllPath = "c:\\${stdenv.lib.concatStringsSep "\\" installPath}";
+  };
+
+  pipelightConfigFile = let
+    mkVal = val: if val == true then "true"
+            else if val == false then "false"
+            else toString val;
+    mkCfgLine = key: val: "# ${key} = ${mkVal val}";
+  in with stdenv.lib; writeText "pipelight-santander.config" ''
+    # ---BEGIN CONFIG---
+    ${concatStringsSep "\n" (mapAttrsToList mkCfgLine pluginConfig)}
+    # ---END CONFIG---
+  '';
+
+  finalPlugin = runCommand "santander-plugin" {
+    pipelight = (pipelight.override {
+      wineStaging = patchedWine;
+    }).overrideDerivation (drv: {
+      src = fetchFromBitbucket {
+        repo = "pipelight";
+        owner = "mmueller2012";
+        rev = "181bab804f80b99cb46f63f9ed36e4fdf12ca319";
+        sha256 = "0ydivpxayzs5aklf0x5vl5bl4issz10k7zl3cv76649kxxhxkh1z";
+      };
+
+      patches = [ ./pipelight.patch ];
+
+      postPatch = (drv.postPatch or "") + ''
+        sed -i -e '/static \+bool \+openConfig.*{$/,/}/ {
+          /getConfigNameFromLibrary/a \
+            configFile.open("${pipelightConfigFile}"); \
+            if (configFile.is_open()) return true;
+        }' src/linux/libpipelight/configloader.c
+      '';
+
+      # We don't want or have share/pipelight/install-dependency!
+      preFixup = null;
+    });
+  } ''
+    install -vD "$pipelight/lib/pipelight/libpipelight.so" \
+      "$out/lib/pipelight/libpipelight-santander.so"
+  '';
+
+  # Allow to use dwb for now until we have a better solution.
+  dwb = dwb-unwrapped.override {
+    inherit (import (import ../../../nixpkgs-path.nix) {
+      inherit (stdenv) system;
+      config = {
+        permittedInsecurePackages = [ "webkitgtk-2.4.11" ];
+      };
+    }) webkitgtk2;
+  };
+
+  inherit (stdenv.lib) escapeShellArg;
+
+in writeScriptBin "santander" ''
+  #!${stdenv.shell}
+  if tmpdir="$("${coreutils}/bin/mktemp" -d)"; then
+    trap "rm -rf '$tmpdir'" EXIT
+    export HOME="$tmpdir"
+    export MOZ_PLUGIN_PATH=${escapeShellArg "${finalPlugin}/lib/pipelight"}
+    "${dwb}/bin/dwb" -t https://karte.santanderbank.de/
+    exit $?
+  else
+    echo "Unable to create temporary profile directory." >&2
+    exit 1
+  fi
+''
diff --git a/pkgs/aszlig/santander/pipelight.patch b/pkgs/aszlig/santander/pipelight.patch
new file mode 100644
index 00000000..3a07da72
--- /dev/null
+++ b/pkgs/aszlig/santander/pipelight.patch
@@ -0,0 +1,13 @@
+diff --git a/src/windows/pluginloader/pluginloader.c b/src/windows/pluginloader/pluginloader.c
+index 9e8556f..c50be2a 100644
+--- a/src/windows/pluginloader/pluginloader.c
++++ b/src/windows/pluginloader/pluginloader.c
+@@ -1510,7 +1510,7 @@ void dispatcher(int functionid, Stack &stack){
+ 				NPObject *objectValue;
+ 				NPError result;
+ 
+-				if (variable == NPPVpluginScriptableNPObject)
++				if (variable == NPPVpluginScriptableNPObject && pluginFuncs.getvalue)
+ 					result = pluginFuncs.getvalue(instance, variable, &objectValue);
+ 				else{
+ 					DBG_WARN("FUNCTION_NPP_GETVALUE_OBJECT - variable %d not allowed", variable);
diff --git a/pkgs/aszlig/santander/wine-no-unixfs.patch b/pkgs/aszlig/santander/wine-no-unixfs.patch
new file mode 100644
index 00000000..b0e6a9e9
--- /dev/null
+++ b/pkgs/aszlig/santander/wine-no-unixfs.patch
@@ -0,0 +1,292 @@
+diff -urN wine-1.9.7-orig/dlls/krnl386.exe16/int21.c wine-1.9.7/dlls/krnl386.exe16/int21.c
+--- wine-1.9.7-orig/dlls/krnl386.exe16/int21.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/krnl386.exe16/int21.c	2016-04-10 02:33:20 +0900
+@@ -35,6 +35,7 @@
+ # include <unistd.h>
+ #endif
+ 
++#include "ntstatus.h"
+ #include "windef.h"
+ #include "winbase.h"
+ #include "winreg.h"
+@@ -842,11 +843,13 @@
+  */
+ static HANDLE INT21_CreateMagicDeviceHandle( LPCWSTR name )
+ {
++    HANDLE ret;
++    NTSTATUS status;
++
++#if 0
+     static const WCHAR prefixW[] = {'\\','?','?','\\','u','n','i','x'};
+     const char *dir = wine_get_server_dir();
+     int len;
+-    HANDLE ret;
+-    NTSTATUS status;
+     OBJECT_ATTRIBUTES attr;
+     UNICODE_STRING nameW;
+     IO_STATUS_BLOCK io;
+@@ -875,12 +878,16 @@
+     status = NtCreateFile( &ret, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, &attr, &io, NULL, 0,
+                            FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF,
+                            FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 );
++    RtlFreeUnicodeString( &nameW );
++#else
++    status = STATUS_NOT_IMPLEMENTED;
++#endif
++
+     if (status)
+     {
+         ret = 0;
+         SetLastError( RtlNtStatusToDosError(status) );
+     }
+-    RtlFreeUnicodeString( &nameW );
+     return ret;
+ }
+ 
+diff -urN wine-1.9.7-orig/dlls/krnl386.exe16/vxd.c wine-1.9.7/dlls/krnl386.exe16/vxd.c
+--- wine-1.9.7-orig/dlls/krnl386.exe16/vxd.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/krnl386.exe16/vxd.c	2016-04-10 02:33:20 +0900
+@@ -113,11 +113,13 @@
+ /* create a file handle to represent a VxD, by opening a dummy file in the wineserver directory */
+ static HANDLE open_vxd_handle( LPCWSTR name )
+ {
++    HANDLE ret;
++    NTSTATUS status;
++
++#if 0
+     static const WCHAR prefixW[] = {'\\','?','?','\\','u','n','i','x'};
+     const char *dir = wine_get_server_dir();
+     int len;
+-    HANDLE ret;
+-    NTSTATUS status;
+     OBJECT_ATTRIBUTES attr;
+     UNICODE_STRING nameW;
+     IO_STATUS_BLOCK io;
+@@ -146,12 +148,16 @@
+     status = NtCreateFile( &ret, SYNCHRONIZE, &attr, &io, NULL, 0,
+                            FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF,
+                            FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 );
++    RtlFreeUnicodeString( &nameW );
++#else
++    status = STATUS_NOT_IMPLEMENTED;
++#endif
++
+     if (status)
+     {
+         ret = 0;
+         SetLastError( RtlNtStatusToDosError(status) );
+     }
+-    RtlFreeUnicodeString( &nameW );
+     return ret;
+ }
+ 
+diff -urN wine-1.9.7-orig/dlls/ntdll/directory.c wine-1.9.7/dlls/ntdll/directory.c
+--- wine-1.9.7-orig/dlls/ntdll/directory.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/ntdll/directory.c	2016-04-10 02:33:20 +0900
+@@ -3098,8 +3098,10 @@
+ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
+                                           UINT disposition, BOOLEAN check_case )
+ {
++#if 0
+     static const WCHAR unixW[] = {'u','n','i','x'};
+     static const WCHAR pipeW[] = {'p','i','p','e'};
++#endif
+     static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 };
+ 
+     NTSTATUS status = STATUS_SUCCESS;
+@@ -3143,11 +3145,13 @@
+     name_len -= prefix_len;
+ 
+     /* check for invalid characters (all chars except 0 are valid for unix and pipes) */
++#if 0
+     if (prefix_len == 4)
+     {
+         is_unix = !memcmp( prefix, unixW, sizeof(unixW) );
+         is_pipe = !memcmp( prefix, pipeW, sizeof(pipeW) );
+     }
++#endif
+     if (is_unix || is_pipe)
+     {
+         for (p = name; p < name + name_len; p++)
+diff -urN wine-1.9.7-orig/dlls/ntdll/path.c wine-1.9.7/dlls/ntdll/path.c
+--- wine-1.9.7-orig/dlls/ntdll/path.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/ntdll/path.c	2016-04-10 02:33:20 +0900
+@@ -1025,7 +1025,9 @@
+ NTSTATUS CDECL wine_unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt )
+ {
+     static const WCHAR prefixW[] = {'\\','?','?','\\','A',':','\\'};
++#if 0
+     static const WCHAR unix_prefixW[] = {'\\','?','?','\\','u','n','i','x'};
++#endif
+     unsigned int lenW, lenA = name->Length;
+     const char *path = name->Buffer;
+     char *cwd;
+@@ -1065,6 +1067,7 @@
+ 
+     if (status != STATUS_SUCCESS)
+     {
++#if 0
+         if (status == STATUS_OBJECT_PATH_NOT_FOUND)
+         {
+             lenW = ntdll_umbstowcs( 0, path, lenA, NULL, 0 );
+@@ -1084,6 +1087,7 @@
+             for (p = nt->Buffer + sizeof(unix_prefixW)/sizeof(WCHAR); *p; p++) if (*p == '/') *p = '\\';
+             status = STATUS_SUCCESS;
+         }
++#endif
+         goto done;
+     }
+     while (lenA && path[0] == '/') { lenA--; path++; }
+diff -urN wine-1.9.7-orig/dlls/shell32/folders.c wine-1.9.7/dlls/shell32/folders.c
+--- wine-1.9.7-orig/dlls/shell32/folders.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/folders.c	2016-04-10 02:33:20 +0900
+@@ -236,9 +236,11 @@
+                 *piIndex = -IDI_SHELL_MY_DOCUMENTS;
+             else if(IsEqualGUID(riid, &CLSID_NetworkPlaces))
+                 *piIndex = -IDI_SHELL_MY_NETWORK_PLACES;
++#if 0
+             else if(IsEqualGUID(riid, &CLSID_UnixFolder) ||
+                     IsEqualGUID(riid, &CLSID_UnixDosFolder))
+                 *piIndex = -IDI_SHELL_DRIVE;
++#endif
+             else
+                 *piIndex = -IDI_SHELL_FOLDER;
+ 	  }
+diff -urN wine-1.9.7-orig/dlls/shell32/shellole.c wine-1.9.7/dlls/shell32/shellole.c
+--- wine-1.9.7-orig/dlls/shell32/shellole.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shellole.c	2016-04-10 02:33:20 +0900
+@@ -78,8 +78,10 @@
+ 	{&CLSID_ShellFSFolder,	IFSFolder_Constructor},
+ 	{&CLSID_ShellItem,	IShellItem_Constructor},
+ 	{&CLSID_ShellLink,	IShellLink_Constructor},
++#if 0
+ 	{&CLSID_UnixDosFolder,  UnixDosFolder_Constructor},
+ 	{&CLSID_UnixFolder,     UnixFolder_Constructor},
++#endif
+ 	{&CLSID_ExplorerBrowser,ExplorerBrowser_Constructor},
+ 	{&CLSID_KnownFolderManager, KnownFolderManager_Constructor},
+ 	{&CLSID_Shell,          IShellDispatch_Constructor},
+diff -urN wine-1.9.7-orig/dlls/shell32/shellpath.c wine-1.9.7/dlls/shell32/shellpath.c
+--- wine-1.9.7-orig/dlls/shell32/shellpath.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shellpath.c	2016-04-10 02:33:20 +0900
+@@ -4481,9 +4481,11 @@
+         DWORD call_for_attr;
+     } folders[] =
+     {
++#if 0
+         { &CLSID_UnixFolder, TRUE, FALSE, FALSE },
+         { &CLSID_UnixDosFolder, TRUE, FALSE, FALSE,
+           SFGAO_FILESYSANCESTOR|SFGAO_FOLDER|SFGAO_HASSUBFOLDER, SFGAO_FILESYSTEM },
++#endif
+         { &CLSID_FolderShortcut, FALSE, FALSE, FALSE,
+           SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_LINK,
+           SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR },
+@@ -4613,9 +4615,11 @@
+             *ppidl = _ILCreateDesktop();
+             break;
+ 
++#if 0
+         case CSIDL_PERSONAL:
+             *ppidl = _ILCreateMyDocuments();
+             break;
++#endif
+ 
+         case CSIDL_INTERNET:
+             *ppidl = _ILCreateIExplore();
+diff -urN wine-1.9.7-orig/dlls/shell32/shfldr.h wine-1.9.7/dlls/shell32/shfldr.h
+--- wine-1.9.7-orig/dlls/shell32/shfldr.h	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shfldr.h	2016-04-10 02:33:20 +0900
+@@ -75,5 +75,7 @@
+ void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags) DECLSPEC_HIDDEN;
+ BOOL SHELL_FS_HideExtension(LPCWSTR pwszPath) DECLSPEC_HIDDEN;
+ 
++#if 0
+ DEFINE_GUID( CLSID_UnixFolder, 0xcc702eb2, 0x7dc5, 0x11d9, 0xc6, 0x87, 0x00, 0x04, 0x23, 0x8a, 0x01, 0xcd );
+ DEFINE_GUID( CLSID_UnixDosFolder, 0x9d20aae8, 0x0625, 0x44b0, 0x9c, 0xa7, 0x71, 0x88, 0x9c, 0x22, 0x54, 0xd9 );
++#endif
+diff -urN wine-1.9.7-orig/dlls/shell32/shfldr_desktop.c wine-1.9.7/dlls/shell32/shfldr_desktop.c
+--- wine-1.9.7-orig/dlls/shell32/shfldr_desktop.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shfldr_desktop.c	2016-04-10 02:33:20 +0900
+@@ -186,26 +186,30 @@
+     }
+     else if (PathGetDriveNumberW (lpszDisplayName) >= 0)
+     {
++#if 0
+         /*
+          * UNIXFS can't handle drives without a mount point yet. We fall back
+          * to use the MyComputer interface if we can't get the file attributes
+          * on the device.
+          */
+         char drivePath[] = "A:\\";
+         drivePath[0] = 'A' + PathGetDriveNumberW(lpszDisplayName);
+ 
+         /* it's a filesystem path with a drive. Let MyComputer/UnixDosFolder parse it */
+         if (UNIXFS_is_rooted_at_desktop() &&
+             GetFileAttributesA(drivePath) != INVALID_FILE_ATTRIBUTES)
+         {
+             pidlTemp = _ILCreateGuid(PT_GUID, &CLSID_UnixDosFolder);
+             TRACE("Using unixfs for %s\n", debugstr_w(lpszDisplayName));
+         }
+         else
+         {
++#endif
+             pidlTemp = _ILCreateMyComputer ();
+             TRACE("Using MyComputer for %s\n", debugstr_w(lpszDisplayName));
++#if 0
+         }
++#endif
+         szNext = lpszDisplayName;
+     }
+     else if (PathIsUNCW(lpszDisplayName))
+diff -urN wine-1.9.7-orig/dlls/shell32/shfldr_unixfs.c wine-1.9.7/dlls/shell32/shfldr_unixfs.c
+--- wine-1.9.7-orig/dlls/shell32/shfldr_unixfs.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shfldr_unixfs.c	2016-04-10 02:33:20 +0900
+@@ -167,7 +167,7 @@
+ 
+ WINE_DEFAULT_DEBUG_CHANNEL(shell);
+ 
+-#if !defined(__MINGW32__) && !defined(_MSC_VER)
++#if 0
+ 
+ #define LEN_SHITEMID_FIXED_PART ((USHORT) \
+     ( sizeof(USHORT)      /* SHITEMID's cb field. */ \
+@@ -2569,6 +2569,7 @@
+  *  FALSE, if not.
+  */
+ BOOL UNIXFS_is_rooted_at_desktop(void) {
++#if 0
+     HKEY hKey;
+     WCHAR wszRootedAtDesktop[69 + CHARS_IN_GUID] = {
+         'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+@@ -2582,5 +2583,6 @@
+         RegCloseKey(hKey);
+         return TRUE;
+     }
++#endif
+     return FALSE;
+ }
+diff -urN wine-1.9.7-orig/include/config.h.in wine-1.9.7/include/config.h.in
+--- wine-1.9.7-orig/include/config.h.in	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/include/config.h.in	2016-04-10 02:33:20 +0900
+@@ -7,6 +7,9 @@
+ /* Define to a function attribute for Microsoft hotpatch assembly prefix. */
+ #undef DECLSPEC_HOTPATCH
+ 
++/* Define to enable unixfs */
++#undef ENABLE_UNIXFS
++
+ /* Define to the file extension for executables. */
+ #undef EXEEXT
+ 
+diff -urN wine-1.9.7-orig/programs/wineboot/wineboot.c wine-1.9.7/programs/wineboot/wineboot.c
+--- wine-1.9.7-orig/programs/wineboot/wineboot.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/programs/wineboot/wineboot.c	2016-04-10 02:33:20 +0900
+@@ -946,7 +946,7 @@
+                                      'I','n','s','t','a','l','l','H','i','n','f','S','e','c','t','i','o','n',0};
+     static const WCHAR definstall[] = {' ','D','e','f','a','u','l','t','I','n','s','t','a','l','l',0};
+     static const WCHAR wowinstall[] = {' ','W','o','w','6','4','I','n','s','t','a','l','l',0};
+-    static const WCHAR inf[] = {' ','1','2','8',' ','\\','\\','?','\\','u','n','i','x',0 };
++    static const WCHAR inf[] = {' ','1','2','8',' ','z',':',0 };
+ 
+     WCHAR app[MAX_PATH + sizeof(rundll)/sizeof(WCHAR)];
+     STARTUPINFOW si;
diff --git a/pkgs/aszlig/santander/winscard.patch b/pkgs/aszlig/santander/winscard.patch
new file mode 100644
index 00000000..7dfa04ac
--- /dev/null
+++ b/pkgs/aszlig/santander/winscard.patch
@@ -0,0 +1,11 @@
+--- a/dlls/winscard/winscard.c	1970-01-01 01:00:01.000000000 +0100
++++ b/dlls/winscard/winscard.c	2016-06-06 01:52:53.631444433 +0200
+@@ -1527,7 +1527,7 @@
+ {

+     LONG lRet;

+     TRACE(" 0x%08X %p %p %p %p %p %p\n",(unsigned int) hCard,mszReaderNames,pcchReaderLen,pdwState,pdwProtocol,pbAtr,pcbAtrLen);

+-    if(!pcchReaderLen || !pdwState || !pdwProtocol || !pcbAtrLen)

++    if(!pcchReaderLen || !pcbAtrLen)

+         lRet = SCARD_E_INVALID_PARAMETER;

+     else if(!liteSCardStatus)

+         lRet = SCARD_F_INTERNAL_ERROR;

diff --git a/pkgs/aszlig/tomahawk/default.nix b/pkgs/aszlig/tomahawk/default.nix
new file mode 100644
index 00000000..ee006d46
--- /dev/null
+++ b/pkgs/aszlig/tomahawk/default.nix
@@ -0,0 +1,90 @@
+{ stdenv, fetchFromGitHub, fetchurl, cmake, pkgconfig, boost, gnutls
+, libechonest, liblastfm, lucenepp, kdeFrameworks, qt5, libsForQt5, sparsehash
+, taglib, websocketpp, ffmpeg_2, v4l_utils, libtasn1, libidn, p11_kit
+
+, enableXMPP      ? true,  libjreen     ? null
+, enableKDE       ? false, kdelibs      ? null
+, enableTelepathy ? false, telepathy_qt ? null
+}:
+
+assert enableXMPP      -> libjreen     != null;
+assert enableKDE       -> kdelibs      != null;
+assert enableTelepathy -> telepathy_qt != null;
+
+with stdenv.lib;
+
+let
+  useQT5 = pkg: let
+    qt5variant = pkg.override (attrs: {
+      ${if attrs ? qt4 then "qt4" else "qt"} = qt5.qtbase;
+    });
+  in qt5variant.overrideDerivation (drv: {
+    postInstall = (drv.postInstall or "") + ''
+      for i in "$out"/include/*; do
+        [ -d "$i" ] || continue
+        ! expr "$i" : '.*5$$' > /dev/null || continue
+        ln -sv "$i" "''${i}5"
+      done
+      for l in "$out"/lib*/*.so*; do
+        bn="$(basename "$l")"
+        ! expr "''${bn%.so*}" : '.*5$$' > /dev/null || continue
+        ln -sv "$l" "$(dirname "$l")/''${bn%.so*}5.''${bn#*.}"
+      done
+    '';
+  });
+
+  libechonestQT5 = overrideDerivation ((useQT5 libechonest).override {
+    qjson = null;
+  }) (drv: {
+    cmakeFlags = (drv.cmakeFlags or []) ++ [ "-DBUILD_WITH_QT4=OFF" ];
+  });
+
+  jreenPatched = overrideDerivation (useQT5 libjreen) (drv: {
+    postPatch = (drv.postPatch or "") + ''
+      sed -i -e 's/QMetaTypeId/QMap/g' src/stanzaextension.h
+    '';
+  });
+
+in stdenv.mkDerivation rec {
+  name = "tomahawk-${version}";
+  version = "0.9.0-git";
+
+  src = fetchFromGitHub {
+    owner = "tomahawk-player";
+    repo = "tomahawk";
+    rev = "97a407f83701ee2343e4826043c311c03fe5675b";
+    sha256 = "1palfsn8kz8q0xb19xhiwy3n993q2kifz9dy1ry5cnys7706l9b8";
+  };
+
+  postPatch = ''
+    sed -i -e '/set(QUAZIP_LIB_VERSION_SUFFIX/d' CMakeModules/FindQuaZip.cmake
+    sed -i -e 's,quazip5/,quazip/,' src/libtomahawk/utils/TomahawkUtils.cpp
+  '';
+
+  cmakeFlags = [
+    "-DLUCENEPP_INCLUDE_DIR=${lucenepp}/include"
+    "-DLUCENEPP_LIBRARY_DIR=${lucenepp}/lib"
+  ];
+
+  nativeBuildInputs = [ cmake pkgconfig kdeFrameworks.extra-cmake-modules ];
+
+  buildInputs = [
+    libtasn1 libidn p11_kit
+    libsForQt5.attica libsForQt5.qca-qt5 libsForQt5.qtkeychain libsForQt5.quazip
+    libsForQt5.vlc qt5.qtbase qt5.qtsvg qt5.qttools qt5.qtwebkit qt5.qtx11extras
+  ] ++ map useQT5 [ liblastfm ] ++ [
+    boost gnutls lucenepp sparsehash taglib websocketpp libechonestQT5
+  ] ++ stdenv.lib.optional enableXMPP      jreenPatched
+    ++ stdenv.lib.optional enableKDE       (useQT5 kdelibs)
+    ++ stdenv.lib.optional enableTelepathy (useQT5 telepathy_qt);
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "A multi-source music player";
+    homepage = "http://tomahawk-player.org/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.aszlig ];
+  };
+}