diff --git a/pkgs/development/interpreters/ruby/gem.nix b/pkgs/development/interpreters/ruby/gem.nix index 9a9650f163c..289f840aa04 100644 --- a/pkgs/development/interpreters/ruby/gem.nix +++ b/pkgs/development/interpreters/ruby/gem.nix @@ -1,4 +1,4 @@ -{stdenv, fetchurl, ruby, rubygems, makeWrapper, patches, overwrites}: +{stdenv, fetchurl, ruby, rubygems, makeWrapper, patches, overrides}: let gemDefaults = { name, basename, requiredGems, sha256, meta }: @@ -42,10 +42,11 @@ let ''; }; mb = stdenv.lib.maybeAttr; + patchedGem = a: stdenv.mkDerivation (removeAttrs (stdenv.lib.mergeAttrsByFuncDefaults + ([ (gemDefaults a) ] + ++ (stdenv.lib.concatMap (p: [(mb a.basename {} p) (mb a.name {} p)] ) + patches))) + [ "mergeAttrBy" ]); in aName: a@{ name, basename, requiredGems, sha256, meta }: - mb name (mb basename ( - stdenv.mkDerivation (removeAttrs (stdenv.lib.mergeAttrsByFuncDefaults - [ (gemDefaults a) (mb name {} patches) (mb basename {} patches) ] - ) ["mergeAttrBy"]) - ) overwrites) overwrites + stdenv.lib.foldl (d: o: mb name (mb basename d o) o) (patchedGem a) overrides diff --git a/pkgs/development/interpreters/ruby/libs.nix b/pkgs/development/interpreters/ruby/libs.nix index 57daafaef40..d0b6401abc2 100644 --- a/pkgs/development/interpreters/ruby/libs.nix +++ b/pkgs/development/interpreters/ruby/libs.nix @@ -1,12 +1,33 @@ -{stdenv, config, fetchurl, callPackage}: +{stdenv, getConfig, fetchurl, callPackage}: let - generated = stdenv.lib.attrByPath [ "gems" "generated" ] (import ./generated.nix) config; - auto = generated merged; - patches = callPackage ./patches.nix { } gems; - overwrites = callPackage ./overwrites.nix { } gems; - merged = stdenv.lib.mapAttrs gem auto.gems; - gem = callPackage ./gem.nix { inherit patches overwrites; }; - gems = merged // auto.aliases; + inherit (stdenv.lib) fold optional; + gemsMergeableFun = { generatedFuns ? [], patchFuns ? [], overrideFuns ? [] }: + let + generatedAttrs = map (f: f customGems) generatedFuns; + generatedGems = map (a: a.gems) generatedAttrs; + gem = callPackage ./gem.nix { + patches = map (f: callPackage f { inherit gems; }) patchFuns; + overrides = map (f: callPackage f { }) overrideFuns; + }; + customGems = stdenv.lib.mapAttrs gem (fold (x: y: x // y) { } generatedGems); + gems = fold (x: y: x // y) customGems (map (a: a.aliases) generatedAttrs); + in + gems // { + merge = { generated ? null, patches ? null, overrides ? null }: + gemsMergeableFun { + generatedFuns = generatedFuns ++ optional (generated != null) generated; + patchFuns = patchFuns ++ optional (patches != null) patches; + overrideFuns = overrideFuns ++ optional (overrides != null) overrides; + }; + }; in -gems +((gemsMergeableFun { }).merge { + generated = import ./generated.nix; + patches = import ./patches.nix; + overrides = import ./overrides.nix; +}).merge { + generated = getConfig [ "gems" "generated" ] null; + patches = getConfig [ "gems" "patches" ] null; + overrides = getConfig [ "gems" "overrides" ] null; +} diff --git a/pkgs/development/interpreters/ruby/overwrites.nix b/pkgs/development/interpreters/ruby/overrides.nix similarity index 94% rename from pkgs/development/interpreters/ruby/overwrites.nix rename to pkgs/development/interpreters/ruby/overrides.nix index 9c3ebf75c31..01d73a19d64 100644 --- a/pkgs/development/interpreters/ruby/overwrites.nix +++ b/pkgs/development/interpreters/ruby/overrides.nix @@ -1,5 +1,4 @@ { xapianBindings }: -gems: { xapian_full = xapianBindings.merge { cfg = { rubySupport = true; }; }; diff --git a/pkgs/development/interpreters/ruby/patches.nix b/pkgs/development/interpreters/ruby/patches.nix index 923217cc1f9..abcb1d0dfe4 100644 --- a/pkgs/development/interpreters/ruby/patches.nix +++ b/pkgs/development/interpreters/ruby/patches.nix @@ -1,6 +1,5 @@ {fetchurl, writeScript, ruby, ncurses, sqlite, libxml2, libxslt, libffi, zlib, - libuuid}: -gems: + libuuid, gems}: let patchUsrBinEnv = writeScript "path-usr-bin-env" ''