summary refs log tree commit diff
diff options
context:
space:
mode:
authorFranz Pletz <fpletz@fnordicwalking.de>2018-10-27 16:01:19 +0200
committerworldofpeace <worldofpeace@protonmail.ch>2019-10-16 20:30:52 -0400
commitcb0adc11ffb0926adae7aa2ed22835c4f9ea971c (patch)
treea1a48aeb32a153bf00311dadd18f7ca9963cf795
parent12441bdf9f09a4d355f927f9b2957a90d5c98822 (diff)
downloadnixpkgs-cb0adc11ffb0926adae7aa2ed22835c4f9ea971c.tar
nixpkgs-cb0adc11ffb0926adae7aa2ed22835c4f9ea971c.tar.gz
nixpkgs-cb0adc11ffb0926adae7aa2ed22835c4f9ea971c.tar.bz2
nixpkgs-cb0adc11ffb0926adae7aa2ed22835c4f9ea971c.tar.lz
nixpkgs-cb0adc11ffb0926adae7aa2ed22835c4f9ea971c.tar.xz
nixpkgs-cb0adc11ffb0926adae7aa2ed22835c4f9ea971c.tar.zst
nixpkgs-cb0adc11ffb0926adae7aa2ed22835c4f9ea971c.zip
pinentry: build with multiple outputs in single drv
Co-authored-by: Florian Klink <flokli@flokli.de>
Co-authored-by: worldofpeace <worldofpeace@protonmail.ch>
-rw-r--r--nixos/modules/config/no-x-libs.nix1
-rw-r--r--pkgs/tools/security/pinentry/default.nix105
-rw-r--r--pkgs/top-level/all-packages.nix31
3 files changed, 75 insertions, 62 deletions
diff --git a/nixos/modules/config/no-x-libs.nix b/nixos/modules/config/no-x-libs.nix
index 74cf74d7418..873b8073fed 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 160816a8cb7..87edc914131 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")
-
-    "--with-libassuan-prefix=${libassuan.dev}"
-    "--with-libgpg-error-prefix=${libgpgerror.dev}"
-  ];
+    (mkWith   (libcap != null)    "libcap")
+    (mkEnable (libsecret != null) "libsecret")
+  ] ++ (map mkEnablePinentry (attrNames flavorInfo));
+
+  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 64f625f7725..29353545530 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;