From 05f96bf376bc04bb7cc447150b8cb182af84b35b Mon Sep 17 00:00:00 2001 From: Linus Heckemann Date: Fri, 3 Nov 2017 10:25:22 +0000 Subject: [PATCH] weechat: split plugins into separate outputs Also add a wrapper generator that allows adding the plugins back conveniently and corresponding documentation in the package notes section of the nixpkgs manual. --- doc/package-notes.xml | 30 +++ .../networking/irc/weechat/default.nix | 172 +++++++++++------- 2 files changed, 140 insertions(+), 62 deletions(-) diff --git a/doc/package-notes.xml b/doc/package-notes.xml index 4d87a3a67fe..184bee089ae 100644 --- a/doc/package-notes.xml +++ b/doc/package-notes.xml @@ -664,4 +664,34 @@ cp ${myEmacsConfig} $out/share/emacs/site-lisp/default.el +
+Weechat + +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 +weechat.override {configure = {availablePlugins, ...}: { + plugins = with availablePlugins; [ python perl ]; + } +} + + +The plugins currently available are python, +perl, ruby, guile, +tcl and lua. + + +The python plugin allows the addition of extra libraries. For instance, +the inotify.py script in weechat-scripts requires +D-Bus or libnotify, and the fish.py script requires +pycrypto. To use these scripts, use the python +plugin's withPackages attribute: +weechat.override {configure = {availablePlugins, ...}: { + plugins = with availablePlugins; [ + (python.withPackages (ps: with ps; [ pycrypto python-dbus ])) + ]; + } +} + + +
diff --git a/pkgs/applications/networking/irc/weechat/default.nix b/pkgs/applications/networking/irc/weechat/default.nix index 49cbe29eaf2..1b730af54fe 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 + ; - 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"); + 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; - 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" - ''; + 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 ]; - platforms = stdenv.lib.platforms.unix; - }; -} + 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 + ''; + + 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"; + }; + }; + + inherit (config) plugins; + + 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 "$@" + ''