From c3d84d15ce29b3be3f55e3c5fded66998202595c Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 4 Feb 2014 17:18:38 +0100 Subject: [PATCH] Apply makeOverridable to stdenv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This removes the need for hacks like stdenv.regenerate. It also ensures that overrideGCC is now stackable (so ‘stdenv = useGoldLinker clangStdenv’ works). --- pkgs/development/compilers/dev86/default.nix | 4 +- pkgs/stdenv/adapters.nix | 14 +- pkgs/stdenv/generic/default.nix | 276 +++++++++---------- pkgs/top-level/all-packages.nix | 7 +- 4 files changed, 141 insertions(+), 160 deletions(-) diff --git a/pkgs/development/compilers/dev86/default.nix b/pkgs/development/compilers/dev86/default.nix index 539588ac3ad..f37dae80830 100644 --- a/pkgs/development/compilers/dev86/default.nix +++ b/pkgs/development/compilers/dev86/default.nix @@ -2,7 +2,7 @@ stdenv.mkDerivation { name = "dev86-0.16.19"; - + src = fetchurl { url = http://www.debath.co.uk/dev86/Dev86src-0.16.19.tar.gz; sha256 = "33398b87ca85e2b69e4062cf59f2f7354af46da5edcba036c6f97bae17b8d00e"; @@ -17,7 +17,7 @@ stdenv.mkDerivation { '' substituteInPlace makefile.in --replace "-O2" "" --replace "-O" "" ''; - + meta = { description = "Linux 8086 development environment"; homepage = http://www.debath.co.uk/; diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix index 85063621815..da4e0691e43 100644 --- a/pkgs/stdenv/adapters.nix +++ b/pkgs/stdenv/adapters.nix @@ -8,20 +8,14 @@ rec { # Override the compiler in stdenv for specific packages. - overrideGCC = stdenv: gcc: stdenv // - { mkDerivation = args: stdenv.mkDerivation (args // { NIX_GCC = gcc; }); - inherit gcc; - }; + overrideGCC = stdenv: gcc: stdenv.override { inherit gcc; }; # Add some arbitrary packages to buildInputs for specific packages. # Used to override packages in stdenv like Make. Should not be used # for other dependencies. - overrideInStdenv = stdenv: pkgs: stdenv // - { mkDerivation = args: stdenv.mkDerivation (args // - { buildInputs = args.buildInputs or [] ++ pkgs; } - ); - }; + overrideInStdenv = stdenv: pkgs: + stdenv.override (prev: { extraBuildInputs = prev.extraBuildInputs or [] ++ pkgs; }); # Override the setup script of stdenv. Useful for testing new @@ -32,7 +26,7 @@ rec { # randomPkg = import ../bla { ... # stdenv = overrideSetup stdenv ../stdenv/generic/setup-latest.sh; # }; - overrideSetup = stdenv: setup: stdenv.regenerate setup; + overrideSetup = stdenv: setupScript: stdenv.override { inherit setupScript; }; # Return a modified stdenv that uses dietlibc to create small diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix index 4a36327810b..f872d5b1b75 100644 --- a/pkgs/stdenv/generic/default.nix +++ b/pkgs/stdenv/generic/default.nix @@ -1,9 +1,15 @@ +let lib = import ../../../lib; in lib.makeOverridable ( + { system, name ? "stdenv", preHook ? "", initialPath, gcc, shell , extraAttrs ? {}, overrides ? (pkgs: {}), config , # The `fetchurl' to use for downloading curl and its dependencies # (see all-packages.nix). fetchurlBoot + +, setupScript ? ./setup.sh + +, extraBuildInputs ? [] }: if ! builtins ? langVersion then @@ -14,169 +20,155 @@ else let - lib = import ../../../lib; - allowUnfree = config.allowUnfree or true && builtins.getEnv "HYDRA_DISALLOW_UNFREE" != "1"; allowBroken = builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1"; unsafeGetAttrPos = builtins.unsafeGetAttrPos or (n: as: null); - stdenvGenerator = setupScript: rec { + # The stdenv that we are producing. + result = - # The stdenv that we are producing. - result = + derivation { + inherit system name; - derivation { - inherit system name; + builder = shell; - builder = shell; + args = ["-e" ./builder.sh]; - args = ["-e" ./builder.sh]; + setup = setupScript; - setup = setupScript; + inherit preHook initialPath gcc shell; - inherit preHook initialPath gcc shell; + propagatedUserEnvPkgs = [gcc] ++ + lib.filter lib.isDerivation initialPath; - propagatedUserEnvPkgs = [gcc] ++ - lib.filter lib.isDerivation initialPath; + __ignoreNulls = true; + } - __ignoreNulls = true; - } + // rec { - // rec { + meta = { + description = "The default build environment for Unix packages in Nixpkgs"; + }; - meta = { - description = "The default build environment for Unix packages in Nixpkgs"; - }; - - # Add a utility function to produce derivations that use this - # stdenv and its shell. - mkDerivation = attrs: - let - pos = - if attrs.meta.description or null != null then - unsafeGetAttrPos "description" attrs.meta - else - unsafeGetAttrPos "name" attrs; - pos' = if pos != null then "‘" + pos.file + ":" + toString pos.line + "’" else "«unknown-file»"; - in - if !allowUnfree && (let l = lib.lists.toList attrs.meta.license or []; in lib.lists.elem "unfree" l || lib.lists.elem "unfree-redistributable" l) then - throw "package ‘${attrs.name}’ in ${pos'} has an unfree license, refusing to evaluate" - else if !allowBroken && attrs.meta.broken or false then - throw "you can't use package ‘${attrs.name}’ in ${pos'} because it has been marked as broken" - else if !allowBroken && attrs.meta.platforms or null != null && !lib.lists.elem result.system attrs.meta.platforms then - throw "the package ‘${attrs.name}’ in ${pos'} is not supported on ‘${result.system}’" - else - lib.addPassthru (derivation ( - (removeAttrs attrs ["meta" "passthru" "crossAttrs"]) - // (let - buildInputs = attrs.buildInputs or []; - nativeBuildInputs = attrs.nativeBuildInputs or []; - propagatedBuildInputs = attrs.propagatedBuildInputs or []; - propagatedNativeBuildInputs = attrs.propagatedNativeBuildInputs or []; - crossConfig = attrs.crossConfig or null; - in - { - builder = attrs.realBuilder or shell; - args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)]; - stdenv = result; - system = result.system; - userHook = config.stdenv.userHook or null; - - # Inputs built by the cross compiler. - buildInputs = lib.optionals (crossConfig != null) buildInputs; - propagatedBuildInputs = lib.optionals (crossConfig != null) - propagatedBuildInputs; - # Inputs built by the usual native compiler. - nativeBuildInputs = nativeBuildInputs ++ lib.optionals - (crossConfig == null) buildInputs; - propagatedNativeBuildInputs = propagatedNativeBuildInputs ++ - lib.optionals (crossConfig == null) propagatedBuildInputs; - }))) ( + # Add a utility function to produce derivations that use this + # stdenv and its shell. + mkDerivation = attrs: + let + pos = + if attrs.meta.description or null != null then + unsafeGetAttrPos "description" attrs.meta + else + unsafeGetAttrPos "name" attrs; + pos' = if pos != null then "‘" + pos.file + ":" + toString pos.line + "’" else "«unknown-file»"; + in + if !allowUnfree && (let l = lib.lists.toList attrs.meta.license or []; in lib.lists.elem "unfree" l || lib.lists.elem "unfree-redistributable" l) then + throw "package ‘${attrs.name}’ in ${pos'} has an unfree license, refusing to evaluate" + else if !allowBroken && attrs.meta.broken or false then + throw "you can't use package ‘${attrs.name}’ in ${pos'} because it has been marked as broken" + else if !allowBroken && attrs.meta.platforms or null != null && !lib.lists.elem result.system attrs.meta.platforms then + throw "the package ‘${attrs.name}’ in ${pos'} is not supported on ‘${result.system}’" + else + lib.addPassthru (derivation ( + (removeAttrs attrs ["meta" "passthru" "crossAttrs"]) + // (let + buildInputs = attrs.buildInputs or []; + nativeBuildInputs = attrs.nativeBuildInputs or []; + propagatedBuildInputs = attrs.propagatedBuildInputs or []; + propagatedNativeBuildInputs = attrs.propagatedNativeBuildInputs or []; + crossConfig = attrs.crossConfig or null; + in { - # The meta attribute is passed in the resulting attribute set, - # but it's not part of the actual derivation, i.e., it's not - # passed to the builder and is not a dependency. But since we - # include it in the result, it *is* available to nix-env for - # queries. We also a meta.position attribute here to - # identify the source location of the package. - meta = attrs.meta or {} // (if pos != null then { - position = pos.file + ":" + (toString pos.line); - } else {}); - passthru = attrs.passthru or {}; - } // - # Pass through extra attributes that are not inputs, but - # should be made available to Nix expressions using the - # derivation (e.g., in assertions). - (attrs.passthru or {})); + builder = attrs.realBuilder or shell; + args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)]; + stdenv = result; + system = result.system; + userHook = config.stdenv.userHook or null; - # Utility flags to test the type of platform. - isDarwin = result.system == "x86_64-darwin"; - isLinux = result.system == "i686-linux" - || result.system == "x86_64-linux" - || result.system == "powerpc-linux" - || result.system == "armv5tel-linux" - || result.system == "armv6l-linux" - || result.system == "armv7l-linux" - || result.system == "mips64el-linux"; - isGNU = result.system == "i686-gnu"; # GNU/Hurd - isGlibc = isGNU # useful for `stdenvNative' - || isLinux - || result.system == "x86_64-kfreebsd-gnu"; - isSunOS = result.system == "i686-solaris" - || result.system == "x86_64-solaris"; - isCygwin = result.system == "i686-cygwin"; - isFreeBSD = result.system == "i686-freebsd" - || result.system == "x86_64-freebsd"; - isOpenBSD = result.system == "i686-openbsd" - || result.system == "x86_64-openbsd"; - isBSD = result.system == "i686-freebsd" - || result.system == "x86_64-freebsd" - || result.system == "i686-openbsd" - || result.system == "x86_64-openbsd"; - isi686 = result.system == "i686-linux" - || result.system == "i686-gnu" - || result.system == "i686-freebsd" - || result.system == "i686-openbsd" - || result.system == "i386-sunos"; - isx86_64 = result.system == "x86_64-linux" - || result.system == "x86_64-darwin" - || result.system == "x86_64-freebsd" - || result.system == "x86_64-openbsd" - || result.system == "x86_64-solaris"; - is64bit = result.system == "x86_64-linux" - || result.system == "x86_64-darwin" - || result.system == "x86_64-freebsd" - || result.system == "x86_64-openbsd" - || result.system == "x86_64-solaris"; - isMips = result.system == "mips-linux" - || result.system == "mips64el-linux"; - isArm = result.system == "armv5tel-linux" + # Inputs built by the cross compiler. + buildInputs = lib.optionals (crossConfig != null) buildInputs ++ extraBuildInputs; + propagatedBuildInputs = lib.optionals (crossConfig != null) propagatedBuildInputs; + # Inputs built by the usual native compiler. + nativeBuildInputs = nativeBuildInputs ++ lib.optionals (crossConfig == null) buildInputs; + propagatedNativeBuildInputs = propagatedNativeBuildInputs ++ + lib.optionals (crossConfig == null) propagatedBuildInputs; + }))) ( + { + # The meta attribute is passed in the resulting attribute set, + # but it's not part of the actual derivation, i.e., it's not + # passed to the builder and is not a dependency. But since we + # include it in the result, it *is* available to nix-env for + # queries. We also a meta.position attribute here to + # identify the source location of the package. + meta = attrs.meta or {} // (if pos != null then { + position = pos.file + ":" + (toString pos.line); + } else {}); + passthru = attrs.passthru or {}; + } // + # Pass through extra attributes that are not inputs, but + # should be made available to Nix expressions using the + # derivation (e.g., in assertions). + (attrs.passthru or {})); + + # Utility flags to test the type of platform. + isDarwin = result.system == "x86_64-darwin"; + isLinux = result.system == "i686-linux" + || result.system == "x86_64-linux" + || result.system == "powerpc-linux" + || result.system == "armv5tel-linux" || result.system == "armv6l-linux" - || result.system == "armv7l-linux"; + || result.system == "armv7l-linux" + || result.system == "mips64el-linux"; + isGNU = result.system == "i686-gnu"; # GNU/Hurd + isGlibc = isGNU # useful for `stdenvNative' + || isLinux + || result.system == "x86_64-kfreebsd-gnu"; + isSunOS = result.system == "i686-solaris" + || result.system == "x86_64-solaris"; + isCygwin = result.system == "i686-cygwin"; + isFreeBSD = result.system == "i686-freebsd" + || result.system == "x86_64-freebsd"; + isOpenBSD = result.system == "i686-openbsd" + || result.system == "x86_64-openbsd"; + isBSD = result.system == "i686-freebsd" + || result.system == "x86_64-freebsd" + || result.system == "i686-openbsd" + || result.system == "x86_64-openbsd"; + isi686 = result.system == "i686-linux" + || result.system == "i686-gnu" + || result.system == "i686-freebsd" + || result.system == "i686-openbsd" + || result.system == "i386-sunos"; + isx86_64 = result.system == "x86_64-linux" + || result.system == "x86_64-darwin" + || result.system == "x86_64-freebsd" + || result.system == "x86_64-openbsd" + || result.system == "x86_64-solaris"; + is64bit = result.system == "x86_64-linux" + || result.system == "x86_64-darwin" + || result.system == "x86_64-freebsd" + || result.system == "x86_64-openbsd" + || result.system == "x86_64-solaris"; + isMips = result.system == "mips-linux" + || result.system == "mips64el-linux"; + isArm = result.system == "armv5tel-linux" + || result.system == "armv6l-linux" + || result.system == "armv7l-linux"; - # Utility function: allow stdenv to be easily regenerated with - # a different setup script. (See all-packages.nix for an - # example.) - regenerate = stdenvGenerator; + # For convenience, bring in the library functions in lib/ so + # packages don't have to do that themselves. + inherit lib; - # For convenience, bring in the library functions in lib/ so - # packages don't have to do that themselves. - inherit lib; + inherit fetchurlBoot; - inherit fetchurlBoot; + inherit overrides; + } - inherit overrides; - } + # Propagate any extra attributes. For instance, we use this to + # "lift" packages like curl from the final stdenv for Linux to + # all-packages.nix for that platform (meaning that it has a line + # like curl = if stdenv ? curl then stdenv.curl else ...). + // extraAttrs; - # Propagate any extra attributes. For instance, we use this to - # "lift" packages like curl from the final stdenv for Linux to - # all-packages.nix for that platform (meaning that it has a line - # like curl = if stdenv ? curl then stdenv.curl else ...). - // extraAttrs; - - }.result; - - -in stdenvGenerator ./setup.sh +in result) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 785e22f95e9..1495372f6da 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -782,12 +782,7 @@ let despotify = callPackage ../development/libraries/despotify { }; - dev86 = callPackage ../development/compilers/dev86 { - /* Using GNU Make 3.82 leads to this: - make[4]: *** No rule to make target `__ldivmod.o)' - So use 3.81. */ - stdenv = overrideInStdenv stdenv [gnumake381]; - }; + dev86 = callPackage ../development/compilers/dev86 { }; dnsmasq = callPackage ../tools/networking/dnsmasq { };