From bd06834d5eb9b13b77e065ee5dd1a0dab28f838e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Domen=20Ko=C5=BEar?= Date: Fri, 29 Mar 2019 15:10:42 +0700 Subject: [PATCH 1/2] haskell: allow separate bin output, disable by default --- .../haskell-modules/generic-builder.nix | 20 ++++++++++++++----- pkgs/development/haskell-modules/lib.nix | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/pkgs/development/haskell-modules/generic-builder.nix b/pkgs/development/haskell-modules/generic-builder.nix index a6fd7bb0ba9..083dee9cf94 100644 --- a/pkgs/development/haskell-modules/generic-builder.nix +++ b/pkgs/development/haskell-modules/generic-builder.nix @@ -73,6 +73,7 @@ in , coreSetup ? false # Use only core packages to build Setup.hs. , useCpphs ? false , hardeningDisable ? stdenv.lib.optional (ghc.isHaLVM or false) "all" +, enableSeparateBinOutput ? false , enableSeparateDataOutput ? false , enableSeparateDocOutput ? doHaddock , # Don't fail at configure time if there are multiple versions of the @@ -111,6 +112,8 @@ let # the target dir for haddock documentation docdir = docoutput: docoutput + "/share/doc/" + pname + "-" + version; + binDir = if enableSeparateBinOutput then "$bin/bin" else "$out/bin"; + newCabalFileUrl = "http://hackage.haskell.org/package/${pname}-${version}/revision/${revision}.cabal"; newCabalFile = fetchurl { url = newCabalFileUrl; @@ -143,7 +146,10 @@ let buildFlagsString = optionalString (buildFlags != []) (" " + concatStringsSep " " buildFlags); defaultConfigureFlags = [ - "--verbose" "--prefix=$out" "--libdir=\\$prefix/lib/\\$compiler" "--libsubdir=\\$abi/\\$libname" + "--verbose" + "--prefix=$out" + "--libdir=\\$prefix/lib/\\$compiler" + "--libsubdir=\\$abi/\\$libname" (optionalString enableSeparateDataOutput "--datadir=$data/share/${ghc.name}") (optionalString enableSeparateDocOutput "--docdir=${docdir "$doc"}") "--with-gcc=$CC" # Clang won't work without that extra information. @@ -173,7 +179,8 @@ let "--ghcjs" ] ++ optionals isCross ([ "--configure-option=--host=${stdenv.hostPlatform.config}" - ] ++ crossCabalFlags); + ] ++ crossCabalFlags + ) ++ optionals enableSeparateBinOutput ["--bindir=${binDir}"]; setupCompileFlags = [ (optionalString (!coreSetup) "-${nativePackageDbFlag}=$setupPackageConfDir") @@ -233,7 +240,10 @@ assert allPkgconfigDepends != [] -> pkgconfig != null; stdenv.mkDerivation ({ name = "${pname}-${version}"; - outputs = [ "out" ] ++ (optional enableSeparateDataOutput "data") ++ (optional enableSeparateDocOutput "doc"); + outputs = [ "out" ] + ++ (optional enableSeparateDataOutput "data") + ++ (optional enableSeparateDocOutput "doc") + ++ (optional enableSeparateBinOutput "bin"); setOutputFlags = false; pos = builtins.unsafeGetAttrPos "pname" args; @@ -414,7 +424,7 @@ stdenv.mkDerivation ({ find $packageConfDir -maxdepth 0 -empty -delete; ''} ${optionalString isGhcjs '' - for exeDir in "$out/bin/"*.jsexe; do + for exeDir in "${binDir}/"*.jsexe; do exe="''${exeDir%.jsexe}" printWords '#!${nodejs}/bin/node' > "$exe" echo >> "$exe" @@ -424,7 +434,7 @@ stdenv.mkDerivation ({ ''} ${optionalString doCoverage "mkdir -p $out/share && cp -r dist/hpc $out/share"} ${optionalString (enableSharedExecutables && isExecutable && !isGhcjs && stdenv.isDarwin && stdenv.lib.versionOlder ghc.version "7.10") '' - for exe in "$out/bin/"* ; do + for exe in "${binDir}/"* ; do install_name_tool -add_rpath "$out/lib/ghc-${ghc.version}/${pname}-${version}" "$exe" done ''} diff --git a/pkgs/development/haskell-modules/lib.nix b/pkgs/development/haskell-modules/lib.nix index 9f18db1e6e9..41ce20373d6 100644 --- a/pkgs/development/haskell-modules/lib.nix +++ b/pkgs/development/haskell-modules/lib.nix @@ -181,6 +181,8 @@ rec { enableStaticLibraries = drv: overrideCabal drv (drv: { enableStaticLibraries = true; }); disableStaticLibraries = drv: overrideCabal drv (drv: { enableStaticLibraries = false; }); + enableSeparateBinOutput = drv: overrideCabal drv (drv: { enableSeparateBinOutput = true; }); + appendPatch = drv: x: appendPatches drv [x]; appendPatches = drv: xs: overrideCabal drv (drv: { patches = (drv.patches or []) ++ xs; }); From b06201bf6f427f3316a53518b87606532a888e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Domen=20Ko=C5=BEar?= Date: Fri, 29 Mar 2019 15:10:54 +0700 Subject: [PATCH 2/2] cachix: use separate bin output to prove it's useful Spares compilation time by not compiling the package twice. --- pkgs/development/haskell-modules/configuration-nix.nix | 2 ++ pkgs/development/tools/cachix/default.nix | 2 +- pkgs/top-level/all-packages.nix | 6 +----- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pkgs/development/haskell-modules/configuration-nix.nix b/pkgs/development/haskell-modules/configuration-nix.nix index fac0a419bfd..af5bd2220d4 100644 --- a/pkgs/development/haskell-modules/configuration-nix.nix +++ b/pkgs/development/haskell-modules/configuration-nix.nix @@ -94,6 +94,8 @@ self: super: builtins.intersectAttrs super { # Won't find it's header files without help. sfml-audio = appendConfigureFlag super.sfml-audio "--extra-include-dirs=${pkgs.openal}/include/AL"; + cachix = enableSeparateBinOutput super.cachix; + hzk = overrideCabal super.hzk (drv: { preConfigure = "sed -i -e /include-dirs/d hzk.cabal"; configureFlags = "--extra-include-dirs=${pkgs.zookeeper_mt}/include/zookeeper"; diff --git a/pkgs/development/tools/cachix/default.nix b/pkgs/development/tools/cachix/default.nix index 895d6e4bec6..a127fb137f6 100644 --- a/pkgs/development/tools/cachix/default.nix +++ b/pkgs/development/tools/cachix/default.nix @@ -1,3 +1,3 @@ { haskellPackages, haskell }: -haskell.lib.justStaticExecutables haskellPackages.cachix +(haskell.lib.doDistribute haskellPackages.cachix).bin diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 28665941d61..d8c3459e987 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9601,11 +9601,7 @@ in c-blosc = callPackage ../development/libraries/c-blosc { }; - cachix = (callPackage ../development/tools/cachix { }).overrideAttrs (drv: { - meta = drv.meta // { - hydraPlatforms = stdenv.lib.platforms.unix; - }; - }); + cachix = callPackage ../development/tools/cachix { }; capnproto = callPackage ../development/libraries/capnproto { };