Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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.
- Loading branch information
1 parent
4b15ca2
commit 05f96bf
Showing
2 changed files
with
140 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 "$@" | ||
'' |