mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-11 08:13:04 +00:00
0198f43efb
As of late, `final: prev: …` for overlays has become more prevalent in newer code. This is also exhibited in some code (presumably added recently) in stdenv. This change is not about any merits or demerits of any naming convention, but rather aims to make the nomenclature in stdenv bootstrapping consistent to lessen confusion. I've chosen to stick to `self: super: …` convention because: 1. It is more common in the code as it stands. 2. Using `final: prev: …` makes the code more confusing, als it causes `prev` to be in scope alongside `prevStage`. `prevStage` actually bears no relation to `prev` even though their naming suggests it, making it easy to confuse them (the former is the (final) package set of the previous stage while the latter is just the `prev`/`super` of the overlay “chaining” on a completely fresh package set, i.e. `prev` doesn't even relate to the previous stage's `overrides` argument). This change also corrects a naming error in stdenv/native which had no effect, as the variables were unused.
174 lines
4.4 KiB
Nix
174 lines
4.4 KiB
Nix
{ lib
|
||
, localSystem, crossSystem, config, overlays, crossOverlays ? []
|
||
}:
|
||
|
||
assert crossSystem == localSystem;
|
||
|
||
let
|
||
inherit (localSystem) system;
|
||
|
||
shell =
|
||
if system == "i686-freebsd" || system == "x86_64-freebsd" then "/usr/local/bin/bash"
|
||
else "/bin/bash";
|
||
|
||
path =
|
||
(lib.optionals (system == "i686-solaris") [ "/usr/gnu" ]) ++
|
||
(lib.optionals (system == "i686-netbsd") [ "/usr/pkg" ]) ++
|
||
(lib.optionals (system == "x86_64-solaris") [ "/opt/local/gnu" ]) ++
|
||
["/" "/usr" "/usr/local"];
|
||
|
||
prehookBase = ''
|
||
# Disable purity tests; it's allowed (even needed) to link to
|
||
# libraries outside the Nix store (like the C library).
|
||
export NIX_ENFORCE_PURITY=
|
||
export NIX_ENFORCE_NO_NATIVE="''${NIX_ENFORCE_NO_NATIVE-1}"
|
||
'';
|
||
|
||
prehookFreeBSD = ''
|
||
${prehookBase}
|
||
|
||
alias make=gmake
|
||
alias tar=gtar
|
||
alias sed=gsed
|
||
export MAKE=gmake
|
||
shopt -s expand_aliases
|
||
'';
|
||
|
||
prehookOpenBSD = ''
|
||
${prehookBase}
|
||
|
||
alias make=gmake
|
||
alias grep=ggrep
|
||
alias mv=gmv
|
||
alias ln=gln
|
||
alias sed=gsed
|
||
alias tar=gtar
|
||
|
||
export MAKE=gmake
|
||
shopt -s expand_aliases
|
||
'';
|
||
|
||
prehookNetBSD = ''
|
||
${prehookBase}
|
||
|
||
alias make=gmake
|
||
alias sed=gsed
|
||
alias tar=gtar
|
||
export MAKE=gmake
|
||
shopt -s expand_aliases
|
||
'';
|
||
|
||
# prevent libtool from failing to find dynamic libraries
|
||
prehookCygwin = ''
|
||
${prehookBase}
|
||
|
||
shopt -s expand_aliases
|
||
export lt_cv_deplibs_check_method=pass_all
|
||
'';
|
||
|
||
extraNativeBuildInputsCygwin = [
|
||
../cygwin/all-buildinputs-as-runtimedep.sh
|
||
../cygwin/wrap-exes-to-find-dlls.sh
|
||
] ++ (if system == "i686-cygwin" then [
|
||
../cygwin/rebase-i686.sh
|
||
] else if system == "x86_64-cygwin" then [
|
||
../cygwin/rebase-x86_64.sh
|
||
] else []);
|
||
|
||
# A function that builds a "native" stdenv (one that uses tools in
|
||
# /usr etc.).
|
||
makeStdenv =
|
||
{ cc, fetchurl, extraPath ? [], overrides ? (self: super: { }), extraNativeBuildInputs ? [] }:
|
||
|
||
import ../generic {
|
||
buildPlatform = localSystem;
|
||
hostPlatform = localSystem;
|
||
targetPlatform = localSystem;
|
||
|
||
preHook =
|
||
if system == "i686-freebsd" then prehookFreeBSD else
|
||
if system == "x86_64-freebsd" then prehookFreeBSD else
|
||
if system == "i686-openbsd" then prehookOpenBSD else
|
||
if system == "i686-netbsd" then prehookNetBSD else
|
||
if system == "i686-cygwin" then prehookCygwin else
|
||
if system == "x86_64-cygwin" then prehookCygwin else
|
||
prehookBase;
|
||
|
||
extraNativeBuildInputs = extraNativeBuildInputs ++
|
||
(if system == "i686-cygwin" then extraNativeBuildInputsCygwin else
|
||
if system == "x86_64-cygwin" then extraNativeBuildInputsCygwin else
|
||
[]);
|
||
|
||
initialPath = extraPath ++ path;
|
||
|
||
fetchurlBoot = fetchurl;
|
||
|
||
inherit shell cc overrides config;
|
||
};
|
||
|
||
in
|
||
|
||
[
|
||
|
||
({}: rec {
|
||
__raw = true;
|
||
|
||
stdenv = makeStdenv {
|
||
cc = null;
|
||
fetchurl = null;
|
||
};
|
||
stdenvNoCC = stdenv;
|
||
|
||
cc = let
|
||
nativePrefix = { # switch
|
||
i686-solaris = "/usr/gnu";
|
||
x86_64-solaris = "/opt/local/gcc47";
|
||
}.${system} or "/usr";
|
||
in
|
||
import ../../build-support/cc-wrapper {
|
||
name = "cc-native";
|
||
nativeTools = true;
|
||
nativeLibc = true;
|
||
inherit lib nativePrefix;
|
||
bintools = import ../../build-support/bintools-wrapper {
|
||
name = "bintools";
|
||
inherit lib stdenvNoCC nativePrefix;
|
||
nativeTools = true;
|
||
nativeLibc = true;
|
||
};
|
||
inherit stdenvNoCC;
|
||
};
|
||
|
||
fetchurl = import ../../build-support/fetchurl {
|
||
inherit lib stdenvNoCC;
|
||
# Curl should be in /usr/bin or so.
|
||
curl = null;
|
||
};
|
||
|
||
})
|
||
|
||
# First build a stdenv based only on tools outside the store.
|
||
(prevStage: {
|
||
inherit config overlays;
|
||
stdenv = makeStdenv {
|
||
inherit (prevStage) cc fetchurl;
|
||
overrides = self: super: { inherit (prevStage) fetchurl; };
|
||
} // {
|
||
inherit (prevStage) fetchurl;
|
||
};
|
||
})
|
||
|
||
# Using that, build a stdenv that adds the ‘xz’ command (which most systems
|
||
# don't have, so we mustn't rely on the native environment providing it).
|
||
(prevStage: {
|
||
inherit config overlays;
|
||
stdenv = makeStdenv {
|
||
inherit (prevStage.stdenv) cc fetchurl;
|
||
extraPath = [ prevStage.xz ];
|
||
overrides = self: super: { inherit (prevStage) fetchurl xz; };
|
||
extraNativeBuildInputs = if localSystem.isLinux then [ prevStage.patchelf ] else [];
|
||
};
|
||
})
|
||
|
||
]
|