Skip to content

Commit

Permalink
weechat: seperate weechat-unwrapped from wrapper
Browse files Browse the repository at this point in the history
If I have a patch I want to apply to weechat, I can't do that with
overrideAttrs like I can with almost every other package, because that
only applies to the wrapper derivation. For other wrapped packages, one
can usually call the wrapper with any version of the derivation, but the
weechat derivation didn't expose a wrapper creation function.

Taking inspiration from other packages, particularly Firefox, I
extracted the wrapper into its own function, made the default weechat
derivation use that, and added weechat-unwrapped.

Now I can add my custom patch like this:

    (wrapWeechat
      (weechat-unwrapped.overrideAttrs (oldAttrs: {
        patches = [
          (fetchpatch {
            url = "https://github.com/weechat/weechat/commit/55767f5f116db3cb56cf85f52aa80feff45b6abf.patch?full_index=1";
            sha256 = "1pkcdsby57diqds1y5hhl0fr4i8j0zax32jb0gqd36siki3lza3d";
          })
        ];
      }))
      { configure =
        { availablePlugins, ... }:
        {
          plugins = with availablePlugins; [
            (python.withPackages (packages: with packages; [ potr websocket_client ]))
          ];
        };
      })

There is a small backward incompatibility here: previously, it was
possible to get an unwrapped weechat like this:

    weechat.override { configure = null; }

This didn't seem too important to keep around since it was also possible
to get an unwrapped weechat in a much more obvious way:

    weechat.unwrapped

I could probably make it so that the first way still worked, if that
behavior turns out to really have been important.
  • Loading branch information
alyssais committed Jul 25, 2018
1 parent a0383ff commit 8887e1f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 52 deletions.
54 changes: 3 additions & 51 deletions pkgs/applications/networking/irc/weechat/default.nix
Expand Up @@ -2,17 +2,14 @@
, ncurses, openssl, aspell, gnutls
, zlib, curl, pkgconfig, libgcrypt
, cmake, makeWrapper, libobjc, libresolv, libiconv
, writeScriptBin # for withPlugins
, asciidoctor # manpages
, guileSupport ? true, guile
, luaSupport ? true, lua5
, perlSupport ? true, perl
, pythonSupport ? true, pythonPackages
, rubySupport ? true, ruby
, tclSupport ? true, tcl
, extraBuildInputs ? []
, configure ? { availablePlugins, ... }: { plugins = builtins.attrValues availablePlugins; }
, runCommand }:
, extraBuildInputs ? [] }:

let
inherit (pythonPackages) python;
Expand All @@ -26,7 +23,7 @@ let
];
enabledPlugins = builtins.filter (p: p.enabled) plugins;

weechat =
in
assert lib.all (p: p.enabled -> ! (builtins.elem null p.buildInputs)) plugins;
stdenv.mkDerivation rec {
version = "2.1";
Expand Down Expand Up @@ -81,49 +78,4 @@ let
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 "$@"
'') // {
name = weechat.name;
unwrapped = weechat;
meta = weechat.meta;
}
}
57 changes: 57 additions & 0 deletions pkgs/applications/networking/irc/weechat/wrapper.nix
@@ -0,0 +1,57 @@
{ pythonPackages, perl, runCommand, lib, writeScriptBin, stdenv
}:

weechat:

let
wrapper = {
configure ? { availablePlugins, ... }: { plugins = builtins.attrValues availablePlugins; }
}:

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 "$@"
'') // {
name = weechat.name;
unwrapped = weechat;
meta = weechat.meta;
};

in lib.makeOverridable wrapper
6 changes: 5 additions & 1 deletion pkgs/top-level/all-packages.nix
Expand Up @@ -18895,12 +18895,16 @@ with pkgs;

webtorrent_desktop = callPackage ../applications/video/webtorrent_desktop {};

weechat = callPackage ../applications/networking/irc/weechat {
wrapWeechat = callPackage ../applications/networking/irc/weechat/wrapper.nix { };

weechat-unwrapped = callPackage ../applications/networking/irc/weechat {
inherit (darwin) libobjc;
inherit (darwin) libresolv;
guile = guile_2_0;
};

weechat = wrapWeechat weechat-unwrapped { };

weechat-matrix-bridge = callPackage ../applications/networking/instant-messengers/weechat-matrix-bridge {
inherit (luaPackages) cjson;
};
Expand Down

0 comments on commit 8887e1f

Please sign in to comment.