From a4916fdea5680452cb9fc5aac5ec350b52b3797c Mon Sep 17 00:00:00 2001 From: Franz Pletz Date: Sat, 27 Oct 2018 16:01:19 +0200 Subject: [PATCH] pinentry: build with multiple outputs in single drv Co-authored-by: Florian Klink Co-authored-by: worldofpeace --- nixos/modules/config/no-x-libs.nix | 1 - pkgs/tools/security/pinentry/default.nix | 103 +++++++++++++++-------- pkgs/top-level/all-packages.nix | 31 ++----- 3 files changed, 74 insertions(+), 61 deletions(-) diff --git a/nixos/modules/config/no-x-libs.nix b/nixos/modules/config/no-x-libs.nix index 74cf74d74181..873b8073fed9 100644 --- a/nixos/modules/config/no-x-libs.nix +++ b/nixos/modules/config/no-x-libs.nix @@ -34,7 +34,6 @@ with lib; networkmanager-openvpn = super.networkmanager-openvpn.override { withGnome = false; }; networkmanager-vpnc = super.networkmanager-vpnc.override { withGnome = false; }; networkmanager-iodine = super.networkmanager-iodine.override { withGnome = false; }; - pinentry = super.pinentry.override { gtk2 = null; gcr = null; qt4 = null; qt5 = null; }; gobject-introspection = super.gobject-introspection.override { x11Support = false; }; })); }; diff --git a/pkgs/tools/security/pinentry/default.nix b/pkgs/tools/security/pinentry/default.nix index 160816a8cb72..87edc914131d 100644 --- a/pkgs/tools/security/pinentry/default.nix +++ b/pkgs/tools/security/pinentry/default.nix @@ -1,60 +1,93 @@ -{ fetchurl, fetchpatch, stdenv, lib, pkgconfig, autoreconfHook -, libgpgerror, libassuan -, libcap ? null, libsecret ? null, ncurses ? null, gtk2 ? null, gcr ? null -, qt4 ? null, qt5 ? null -, enableEmacs ? false +{ fetchurl, mkDerivation, fetchpatch, stdenv, lib, pkgconfig, autoreconfHook, wrapGAppsHook +, libgpgerror, libassuan, qtbase, wrapQtAppsHook +, ncurses, gtk2, gcr +, libcap ? null, libsecret ? null +, enabledFlavors ? [ "curses" "tty" "gtk2" "qt" "gnome3" "emacs" ] }: -assert qt5 != null -> qt4 == null; -assert qt4 != null -> qt5 == null; +with stdenv.lib; + +assert isList enabledFlavors && enabledFlavors != []; let - mkDerivation = - if qt5 != null - then qt5.mkDerivation + pinentryMkDerivation = + if (builtins.elem "qt" enabledFlavors) + then mkDerivation else stdenv.mkDerivation; + + mkFlag = pfxTrue: pfxFalse: cond: name: + "--${if cond then pfxTrue else pfxFalse}-${name}"; + mkEnable = mkFlag "enable" "disable"; + mkWith = mkFlag "with" "without"; + + mkEnablePinentry = f: + let + info = flavorInfo.${f}; + flag = flavorInfo.${f}.flag or null; + in + optionalString (flag != null) + (mkEnable (elem f enabledFlavors) ("pinentry-" + flag)); + + flavorInfo = { + curses = { bin = "curses"; flag = "curses"; buildInputs = [ ncurses ]; }; + tty = { bin = "tty"; flag = "tty"; }; + gtk2 = { bin = "gtk-2"; flag = "gtk2"; buildInputs = [ gtk2 ]; }; + gnome3 = { bin = "gnome3"; flag = "gnome3"; buildInputs = [ gcr ]; nativeBuildInputs = [ wrapGAppsHook ]; }; + qt = { bin = "qt"; flag = "qt"; buildInputs = [ qtbase ]; nativeBuildInputs = [ wrapQtAppsHook ]; }; + emacs = { bin = "emacs"; flag = "emacs"; buildInputs = []; }; + }; + in -mkDerivation rec { - name = "pinentry-1.1.0"; +pinentryMkDerivation rec { + pname = "pinentry"; + version = "1.1.0"; src = fetchurl { - url = "mirror://gnupg/pinentry/${name}.tar.bz2"; + url = "mirror://gnupg/pinentry/${pname}-${version}.tar.bz2"; sha256 = "0w35ypl960pczg5kp6km3dyr000m1hf0vpwwlh72jjkjza36c1v8"; }; - nativeBuildInputs = [ pkgconfig autoreconfHook ]; - buildInputs = - [ libgpgerror libassuan libcap libsecret gtk2 gcr ncurses qt4 ] - ++ stdenv.lib.optional (qt5 != null) qt5.qtbase; + nativeBuildInputs = [ pkgconfig autoreconfHook ] + ++ concatMap(f: flavorInfo.${f}.nativeBuildInputs or []) enabledFlavors; + buildInputs = [ libgpgerror libassuan libcap libsecret ] + ++ concatMap(f: flavorInfo.${f}.buildInputs or []) enabledFlavors; - prePatch = '' - substituteInPlace pinentry/pinentry-curses.c --replace ncursesw ncurses - ''; + dontWrapGApps = true; + dontWrapQtApps = true; patches = [ ./autoconf-ar.patch - ] ++ lib.optionals (gtk2 != null) [ + ] ++ optionals (elem "gtk2" enabledFlavors) [ (fetchpatch { - url = "https://salsa.debian.org/debian/pinentry/raw/debian/1.1.0-1/debian/patches/" - + "0007-gtk2-When-X11-input-grabbing-fails-try-again-over-0..patch"; + url = "https://salsa.debian.org/debian/pinentry/raw/debian/1.1.0-1/debian/patches/0007-gtk2-When-X11-input-grabbing-fails-try-again-over-0..patch"; sha256 = "15r1axby3fdlzz9wg5zx7miv7gqx2jy4immaw4xmmw5skiifnhfd"; }) ]; configureFlags = [ - (stdenv.lib.withFeature (libcap != null) "libcap") - (stdenv.lib.enableFeature (libsecret != null) "libsecret") - (stdenv.lib.enableFeature (ncurses != null) "pinentry-curses") - (stdenv.lib.enableFeature true "pinentry-tty") - (stdenv.lib.enableFeature enableEmacs "pinentry-emacs") - (stdenv.lib.enableFeature (gtk2 != null) "pinentry-gtk2") - (stdenv.lib.enableFeature (gcr != null) "pinentry-gnome3") - (stdenv.lib.enableFeature (qt4 != null || qt5 != null) "pinentry-qt") + (mkWith (libcap != null) "libcap") + (mkEnable (libsecret != null) "libsecret") + ] ++ (map mkEnablePinentry (attrNames flavorInfo)); - "--with-libassuan-prefix=${libassuan.dev}" - "--with-libgpg-error-prefix=${libgpgerror.dev}" - ]; + postInstall = + concatStrings (flip map enabledFlavors (f: + let + binary = "pinentry-" + flavorInfo.${f}.bin; + in '' + moveToOutput bin/${binary} ${placeholder f} + ln -sf ${placeholder f}/bin/${binary} ${placeholder f}/bin/pinentry + '' + optionalString (f == "gnome3") '' + wrapGApp ${placeholder f}/bin/${binary} + '' + optionalString (f == "qt") '' + wrapQtApp ${placeholder f}/bin/${binary} + '')) + '' + ln -sf ${placeholder (head enabledFlavors)}/bin/pinentry-${flavorInfo.${head enabledFlavors}.bin} $out/bin/pinentry + ''; + + outputs = [ "out" ] ++ enabledFlavors; + + passthru = { flavors = enabledFlavors; }; meta = with stdenv.lib; { homepage = http://gnupg.org/aegypten2/; @@ -65,6 +98,6 @@ mkDerivation rec { Pinentry provides a console and (optional) GTK and Qt GUIs allowing users to enter a passphrase when `gpg' or `gpg2' is run and needs it. ''; - maintainers = [ maintainers.ttuegel ]; + maintainers = with maintainers; [ ttuegel fpletz ]; }; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index eb6854327422..d01c2ac98d0c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5521,34 +5521,15 @@ in phodav = callPackage ../tools/networking/phodav { }; - pinentry = callPackage ../tools/security/pinentry { + pinentry = libsForQt5.callPackage ../tools/security/pinentry { libcap = if stdenv.isDarwin then null else libcap; - gcr = null; - qt4 = null; - qt5 = null; }; - pinentry_ncurses = res.pinentry.override { - gtk2 = null; - }; - - pinentry_emacs = res.pinentry.override { - enableEmacs = true; - }; - - pinentry_gnome = res.pinentry.override { - inherit gcr; - }; - - pinentry_qt4 = res.pinentry.override { - gtk2 = null; - inherit qt4; - }; - - pinentry_qt5 = res.pinentry.override { - gtk2 = null; - inherit qt5; - }; + pinentry_curses = (stdenv.lib.getOutput "curses" pinentry); + pinentry_emacs = (stdenv.lib.getOutput "emacs" pinentry); + pinentry_gtk2 = (stdenv.lib.getOutput "gtk2" pinentry); + pinentry_qt = (stdenv.lib.getOutput "qt" pinentry); + pinentry_gnome = (stdenv.lib.getOutput "gnome" pinentry); pinentry_mac = callPackage ../tools/security/pinentry/mac.nix { inherit (darwin.apple_sdk.frameworks) Cocoa;