summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/package-notes.xml30
-rw-r--r--pkgs/applications/networking/irc/weechat/default.nix172
2 files changed, 140 insertions, 62 deletions
diff --git a/doc/package-notes.xml b/doc/package-notes.xml
index 4d87a3a67fe9..184bee089ae3 100644
--- a/doc/package-notes.xml
+++ b/doc/package-notes.xml
@@ -664,4 +664,34 @@ cp ${myEmacsConfig} $out/share/emacs/site-lisp/default.el
 
 </section>
 
+<section xml:id="sec-weechat">
+<title>Weechat</title>
+<para>
+Weechat can currently be configured to include your choice of plugins.
+To make use of this functionality, install an expression that overrides its configuration such as
+<programlisting>weechat.override {configure = {availablePlugins, ...}: {
+        plugins = with availablePlugins; [ python perl ];
+    }
+}</programlisting>
+</para>
+<para>
+The plugins currently available are <literal>python</literal>,
+<literal>perl</literal>, <literal>ruby</literal>, <literal>guile</literal>,
+<literal>tcl</literal> and <literal>lua</literal>.
+</para>
+<para>
+The python plugin allows the addition of extra libraries. For instance,
+the <literal>inotify.py</literal> script in weechat-scripts requires
+D-Bus or libnotify, and the <literal>fish.py</literal> script requires
+pycrypto. To use these scripts, use the <literal>python</literal>
+plugin's <literal>withPackages</literal> attribute:
+<programlisting>weechat.override {configure = {availablePlugins, ...}: {
+    plugins = with availablePlugins; [
+            (python.withPackages (ps: with ps; [ pycrypto python-dbus ]))
+        ];
+    }
+}
+</programlisting>
+</para>
+</section>
 </chapter>
diff --git a/pkgs/applications/networking/irc/weechat/default.nix b/pkgs/applications/networking/irc/weechat/default.nix
index 49cbe29eaf22..1b730af54fea 100644
--- a/pkgs/applications/networking/irc/weechat/default.nix
+++ b/pkgs/applications/networking/irc/weechat/default.nix
@@ -1,81 +1,129 @@
-{ stdenv, fetchurl, ncurses, openssl, aspell, gnutls
-, zlib, curl , pkgconfig, libgcrypt
+{ stdenv, fetchurl, fetchpatch, lib
+, ncurses, openssl, aspell, gnutls
+, zlib, curl, pkgconfig, libgcrypt
 , cmake, makeWrapper, libobjc, libresolv, libiconv
+, writeScriptBin, symlinkJoin # for withPlugins
 , asciidoctor # manpages
 , guileSupport ? true, guile
 , luaSupport ? true, lua5
 , perlSupport ? true, perl
-, pythonPackages
+, pythonSupport ? true, pythonPackages
 , rubySupport ? true, ruby
 , tclSupport ? true, tcl
-, extraBuildInputs ? [] }:
-
-assert guileSupport -> guile != null;
-assert luaSupport -> lua5 != null;
-assert perlSupport -> perl != null;
-assert rubySupport -> ruby != null;
-assert tclSupport -> tcl != null;
+, extraBuildInputs ? []
+, configure ? null
+, runCommand }:
 
 let
   inherit (pythonPackages) python pycrypto pync;
-in
+  plugins = [
+    { name = "perl"; enabled = perlSupport; cmakeFlag = "ENABLE_PERL"; buildInputs = [ perl ]; }
+    { name = "tcl"; enabled = tclSupport; cmakeFlag = "ENABLE_TCL"; buildInputs = [ tcl ]; }
+    { name = "ruby"; enabled = rubySupport; cmakeFlag = "ENABLE_RUBY"; buildInputs = [ ruby ]; }
+    { name = "guile"; enabled = guileSupport; cmakeFlag = "ENABLE_GUILE"; buildInputs = [ guile ]; }
+    { name = "lua"; enabled = luaSupport; cmakeFlag = "ENABLE_LUA"; buildInputs = [ lua5 ]; }
+    { name = "python"; enabled = pythonSupport; cmakeFlag = "ENABLE_PYTHON"; buildInputs = [ python ]; }
+  ];
+  enabledPlugins = builtins.filter (p: p.enabled) plugins;
 
-stdenv.mkDerivation rec {
-  version = "1.9.1";
-  name = "weechat-${version}";
+  weechat =
+    assert lib.all (p: p.enabled -> ! (builtins.elem null p.buildInputs)) plugins;
+    stdenv.mkDerivation rec {
+      version = "1.9.1";
+      name = "weechat-${version}";
 
-  src = fetchurl {
-    url = "http://weechat.org/files/src/weechat-${version}.tar.bz2";
-    sha256 = "1kgi079bq4n0wb7hc7mz8p7ay1b2m0a4wpvb92sfsxrnh10qr5m1";
-  };
+      src = fetchurl {
+        url = "http://weechat.org/files/src/weechat-${version}.tar.bz2";
+        sha256 = "1kgi079bq4n0wb7hc7mz8p7ay1b2m0a4wpvb92sfsxrnh10qr5m1";
+      };
 
-  outputs = [ "out" "man" ];
+      patches = [
+        # TODO: Remove this patch when weechat is updated to a release that
+        # incorporates weechat/weechat#971
+        (fetchpatch {
+          url = https://github.com/lheckemann/weechat/commit/45a4f0565cc745b9c6e943f20199015185696df0.patch;
+          sha256 = "0x7vv7g0k3b2hj444x2cinyv1mq5bkr6m18grfnyy6swbymzc9bj";
+        })
+      ];
 
-  enableParallelBuilding = true;
-  cmakeFlags = with stdenv.lib; [
-    "-DENABLE_MAN=ON"
-    "-DENABLE_DOC=ON"
-  ]
-    ++ optionals stdenv.isDarwin ["-DICONV_LIBRARY=${libiconv}/lib/libiconv.dylib" "-DCMAKE_FIND_FRAMEWORK=LAST"]
-    ++ optional (!guileSupport) "-DENABLE_GUILE=OFF"
-    ++ optional (!luaSupport)   "-DENABLE_LUA=OFF"
-    ++ optional (!perlSupport)  "-DENABLE_PERL=OFF"
-    ++ optional (!rubySupport)  "-DENABLE_RUBY=OFF"
-    ++ optional (!tclSupport)   "-DENABLE_TCL=OFF"
-    ;
+      outputs = [ "out" "man" ] ++ map (p: p.name) enabledPlugins;
 
-  buildInputs = with stdenv.lib; [
-      ncurses python openssl aspell gnutls zlib curl pkgconfig
-      libgcrypt pycrypto makeWrapper
-      cmake
-      asciidoctor
+      enableParallelBuilding = true;
+      cmakeFlags = with stdenv.lib; [
+        "-DENABLE_MAN=ON"
+        "-DENABLE_DOC=ON"
       ]
-    ++ optionals stdenv.isDarwin [ pync libobjc libresolv ]
-    ++ optional  guileSupport    guile
-    ++ optional  luaSupport      lua5
-    ++ optional  perlSupport     perl
-    ++ optional  rubySupport     ruby
-    ++ optional  tclSupport      tcl
-    ++ extraBuildInputs;
+        ++ optionals stdenv.isDarwin ["-DICONV_LIBRARY=${libiconv}/lib/libiconv.dylib" "-DCMAKE_FIND_FRAMEWORK=LAST"]
+        ++ map (p: "-D${p.cmakeFlag}=" + (if p.enabled then "ON" else "OFF")) plugins
+        ;
+
+      buildInputs = with stdenv.lib; [
+          ncurses openssl aspell gnutls zlib curl pkgconfig
+          libgcrypt makeWrapper cmake asciidoctor
+          ]
+        ++ optionals stdenv.isDarwin [ libobjc libresolv ]
+        ++ concatMap (p: p.buildInputs) enabledPlugins
+        ++ extraBuildInputs;
+
+      NIX_CFLAGS_COMPILE = "-I${python}/include/${python.libPrefix}"
+        # Fix '_res_9_init: undefined symbol' error
+        + (stdenv.lib.optionalString stdenv.isDarwin "-DBIND_8_COMPAT=1 -lresolv");
+
+      postInstall = with stdenv.lib; ''
+        for p in ${concatMapStringsSep " " (p: p.name) enabledPlugins}; do
+          from=$out/lib/weechat/plugins/$p.so
+          to=''${!p}/lib/weechat/plugins/$p.so
+          mkdir -p $(dirname $to)
+          mv $from $to
+        done
+      '';
 
-  NIX_CFLAGS_COMPILE = "-I${python}/include/${python.libPrefix}"
-    # Fix '_res_9_init: undefined symbol' error
-    + (stdenv.lib.optionalString stdenv.isDarwin "-DBIND_8_COMPAT=1 -lresolv");
+      meta = {
+        homepage = http://www.weechat.org/;
+        description = "A fast, light and extensible chat client";
+        license = stdenv.lib.licenses.gpl3;
+        maintainers = with stdenv.lib.maintainers; [ lovek323 garbas the-kenny lheckemann ];
+        platforms = stdenv.lib.platforms.unix;
+      };
+    };
+in if configure == null then weechat else
+  let
+    perlInterpreter = perl;
+    config = configure {
+      availablePlugins = let
+          simplePlugin = name: {pluginFile = "${weechat.${name}}/lib/weechat/plugins/${name}.so";};
+        in rec {
+          python = {
+            pluginFile = "${weechat.python}/lib/weechat/plugins/python.so";
+            withPackages = pkgsFun: (python // {
+              extraEnv = ''
+                export PYTHONHOME="${pythonPackages.python.withPackages pkgsFun}"
+              '';
+            });
+          };
+          perl = (simplePlugin "perl") // {
+            extraEnv = ''
+              export PATH="${perlInterpreter}/bin:$PATH"
+            '';
+          };
+          tcl = simplePlugin "tcl";
+          ruby = simplePlugin "ruby";
+          guile = simplePlugin "guile";
+          lua = simplePlugin "lua";
+        };
+      };
 
-  postInstall = with stdenv.lib; ''
-    NIX_PYTHONPATH="$out/lib/${python.libPrefix}/site-packages"
-    wrapProgram "$out/bin/weechat" \
-      ${optionalString perlSupport "--prefix PATH : ${perl}/bin"} \
-      --prefix PATH : ${pythonPackages.python}/bin \
-      --prefix PYTHONPATH : "$PYTHONPATH" \
-      --prefix PYTHONPATH : "$NIX_PYTHONPATH"
-  '';
+    inherit (config) plugins;
 
-  meta = {
-    homepage = http://www.weechat.org/;
-    description = "A fast, light and extensible chat client";
-    license = stdenv.lib.licenses.gpl3;
-    maintainers = with stdenv.lib.maintainers; [ lovek323 garbas the-kenny ];
-    platforms = stdenv.lib.platforms.unix;
-  };
-}
+    pluginsDir = runCommand "weechat-plugins" {} ''
+      mkdir -p $out/plugins
+      for plugin in ${lib.concatMapStringsSep " " (p: p.pluginFile) plugins} ; do
+        ln -s $plugin $out/plugins
+      done
+    '';
+  in writeScriptBin "weechat" ''
+    #!${stdenv.shell}
+    export WEECHAT_EXTRA_LIBDIR=${pluginsDir}
+    ${lib.concatMapStringsSep "\n" (p: lib.optionalString (p ? extraEnv) p.extraEnv) plugins}
+    exec ${weechat}/bin/weechat "$@"
+  ''