{ pkgs, stdenv }: rec { /* Similar to callPackageWith/callPackage, but without makeOverridable */ callPackageWith = autoArgs: fn: args: let f = if builtins.isFunction fn then fn else import fn; auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs; in f (auto // args); callPackage = callPackageWith pkgs; /* Erlang/OTP-specific version retrieval, returns 19 for OTP R19 */ getVersion = x: let parse = drv: (builtins.parseDrvName drv).version; in builtins.replaceStrings ["B" "-"] ["." "."] ( if builtins.isString x then parse x else x.version or (parse x.name)); /* Uses generic-builder to evaluate provided drv containing OTP-version specific data. drv: package containing version-specific args; builder: generic builder for all Erlang versions; args: arguments merged into version-specific args, used mostly to customize dependencies; Arguments passed to the generic-builder are overridable, used to enable/disable high-level OTP features, like ODBC or WX support; Please note that "mkDerivation" defined here is the one called from R16.nix and similar files. */ callErlang = drv: args: let builder = callPackage ../../development/interpreters/erlang/generic-builder.nix args; in callPackage drv { mkDerivation = pkgs.makeOverridable builder; }; /* Uses generic-builder to evaluate provided drv containing Elixir version specific data. drv: package containing version-specific args; vsn: minimum OTP version that Elixir will build on; builder: generic builder for all Erlang versions; args: arguments merged into version-specific args, used mostly to customize dependencies; Arguments passed to the generic-builder are overridable. Please note that "mkDerivation" defined here is the one called from 1.4.nix and similar files. */ callElixir = drv: vsn: args: let inherit (stdenv.lib) versionAtLeast; builder = callPackage ../interpreters/elixir/generic-builder.nix args; in if versionAtLeast (getVersion args.erlang) vsn then callPackage drv { mkDerivation = pkgs.makeOverridable builder; } else throw "Elixir requires at least Erlang/OTP R${vsn}."; }