summary refs log tree commit diff
path: root/pkgs/applications/networking/irc/weechat/wrapper.nix
blob: bd05b63c68bb6227fba9cbae039d4cc7673d9ee2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
{ stdenv, lib, runCommand, writeScriptBin, buildEnv
, pythonPackages, perlPackages, runtimeShell
}:

weechat:

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

  let
    perlInterpreter = perlPackages.perl;
    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"
          '';
          withPackages = pkgsFun: (perl // {
            extraEnv = ''
              ${perl.extraEnv}
              export PERL5LIB=${perlPackages.makeFullPerlPath (pkgsFun perlPackages)}
            '';
          });
        };
        tcl = simplePlugin "tcl";
        ruby = simplePlugin "ruby";
        guile = simplePlugin "guile";
        lua = simplePlugin "lua";
      };

    config = configure { inherit availablePlugins; };

    plugins = config.plugins or (builtins.attrValues availablePlugins);

    pluginsDir = runCommand "weechat-plugins" {} ''
      mkdir -p $out/plugins
      for plugin in ${lib.concatMapStringsSep " " (p: p.pluginFile) plugins} ; do
        ln -s $plugin $out/plugins
      done
    '';

    init = let
      init = builtins.replaceStrings [ "\n" ] [ ";" ] (config.init or "");

      mkScript = drv: lib.flip map drv.scripts (script: "/script load ${drv}/share/${script}");

      scripts = builtins.concatStringsSep ";" (lib.foldl (scripts: drv: scripts ++ mkScript drv)
        [ ] (config.scripts or []));
    in "${scripts};${init}";

    mkWeechat = bin: (writeScriptBin bin ''
      #!${runtimeShell}
      export WEECHAT_EXTRA_LIBDIR=${pluginsDir}
      ${lib.concatMapStringsSep "\n" (p: lib.optionalString (p ? extraEnv) p.extraEnv) plugins}
      exec ${weechat}/bin/${bin} "$@" --run-command ${lib.escapeShellArg init}
    '') // {
      inherit (weechat) name man;
      unwrapped = weechat;
      outputs = [ "out" "man" ];
    };
  in buildEnv {
    name = "weechat-bin-env-${weechat.version}";
    extraOutputsToInstall = lib.optionals installManPages [ "man" ];
    paths = [
      (mkWeechat "weechat")
      (mkWeechat "weechat-headless")
      (runCommand "weechat-out-except-bin" { } ''
        mkdir $out
        ln -sf ${weechat}/include $out/include
        ln -sf ${weechat}/lib $out/lib
        ln -sf ${weechat}/share $out/share
      '')
    ];
    meta = builtins.removeAttrs weechat.meta [ "outputsToInstall" ];
  };

in lib.makeOverridable wrapper