uboot: (firmwareOdroidC2/C4) don't invoke patch tool, use patches = [] instead
https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh#L948 this can do it nicely. Signed-off-by: Anton Arapov <anton@deadbeef.mx>
This commit is contained in:
commit
56de2bcd43
30691 changed files with 3076956 additions and 0 deletions
23
pkgs/stdenv/generic/builder.sh
Normal file
23
pkgs/stdenv/generic/builder.sh
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
export PATH=
|
||||
for i in $initialPath; do
|
||||
if [ "$i" = / ]; then i=; fi
|
||||
PATH=$PATH${PATH:+:}$i/bin
|
||||
done
|
||||
|
||||
mkdir $out
|
||||
|
||||
{
|
||||
echo "export SHELL=$shell"
|
||||
echo "initialPath=\"$initialPath\""
|
||||
echo "defaultNativeBuildInputs=\"$defaultNativeBuildInputs\""
|
||||
echo "defaultBuildInputs=\"$defaultBuildInputs\""
|
||||
echo "$preHook"
|
||||
cat "$setup"
|
||||
} > "$out/setup"
|
||||
|
||||
# Allow the user to install stdenv using nix-env and get the packages
|
||||
# in stdenv.
|
||||
mkdir $out/nix-support
|
||||
if [ "$propagatedUserEnvPkgs" ]; then
|
||||
printf '%s ' $propagatedUserEnvPkgs > $out/nix-support/propagated-user-env-packages
|
||||
fi
|
||||
365
pkgs/stdenv/generic/check-meta.nix
Normal file
365
pkgs/stdenv/generic/check-meta.nix
Normal file
|
|
@ -0,0 +1,365 @@
|
|||
# Checks derivation meta and attrs for problems (like brokenness,
|
||||
# licenses, etc).
|
||||
|
||||
{ lib, config, hostPlatform }:
|
||||
|
||||
let
|
||||
# If we're in hydra, we can dispense with the more verbose error
|
||||
# messages and make problems easier to spot.
|
||||
inHydra = config.inHydra or false;
|
||||
# Allow the user to opt-into additional warnings, e.g.
|
||||
# import <nixpkgs> { config = { showDerivationWarnings = [ "maintainerless" ]; }; }
|
||||
showWarnings = config.showDerivationWarnings;
|
||||
|
||||
getName = attrs: attrs.name or ("${attrs.pname or "«name-missing»"}-${attrs.version or "«version-missing»"}");
|
||||
|
||||
# See discussion at https://github.com/NixOS/nixpkgs/pull/25304#issuecomment-298385426
|
||||
# for why this defaults to false, but I (@copumpkin) want to default it to true soon.
|
||||
shouldCheckMeta = config.checkMeta or false;
|
||||
|
||||
allowUnfree = config.allowUnfree
|
||||
|| builtins.getEnv "NIXPKGS_ALLOW_UNFREE" == "1";
|
||||
|
||||
allowNonSource = config.allowNonSource or true
|
||||
|| builtins.getEnv "NIXPKGS_ALLOW_NONSOURCE" == "1";
|
||||
|
||||
allowlist = config.allowlistedLicenses or config.whitelistedLicenses or [];
|
||||
blocklist = config.blocklistedLicenses or config.blacklistedLicenses or [];
|
||||
|
||||
areLicenseListsValid =
|
||||
if lib.mutuallyExclusive allowlist blocklist then
|
||||
true
|
||||
else
|
||||
throw "allowlistedLicenses and blocklistedLicenses are not mutually exclusive.";
|
||||
|
||||
hasLicense = attrs:
|
||||
attrs ? meta.license;
|
||||
|
||||
hasAllowlistedLicense = assert areLicenseListsValid; attrs:
|
||||
hasLicense attrs && lib.lists.any (l: builtins.elem l allowlist) (lib.lists.toList attrs.meta.license);
|
||||
|
||||
hasBlocklistedLicense = assert areLicenseListsValid; attrs:
|
||||
hasLicense attrs && lib.lists.any (l: builtins.elem l blocklist) (lib.lists.toList attrs.meta.license);
|
||||
|
||||
allowBroken = config.allowBroken
|
||||
|| builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1";
|
||||
|
||||
allowUnsupportedSystem = config.allowUnsupportedSystem
|
||||
|| builtins.getEnv "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM" == "1";
|
||||
|
||||
isUnfree = licenses: lib.lists.any (l: !l.free or true) licenses;
|
||||
|
||||
hasUnfreeLicense = attrs:
|
||||
hasLicense attrs &&
|
||||
isUnfree (lib.lists.toList attrs.meta.license);
|
||||
|
||||
hasNoMaintainers = attrs:
|
||||
attrs ? meta.maintainers && (lib.length attrs.meta.maintainers) == 0;
|
||||
|
||||
isMarkedBroken = attrs: attrs.meta.broken or false;
|
||||
|
||||
hasUnsupportedPlatform = attrs:
|
||||
(!lib.lists.elem hostPlatform.system (attrs.meta.platforms or lib.platforms.all) ||
|
||||
lib.lists.elem hostPlatform.system (attrs.meta.badPlatforms or []));
|
||||
|
||||
isMarkedInsecure = attrs: (attrs.meta.knownVulnerabilities or []) != [];
|
||||
|
||||
# Alow granular checks to allow only some unfree packages
|
||||
# Example:
|
||||
# {pkgs, ...}:
|
||||
# {
|
||||
# allowUnfree = false;
|
||||
# allowUnfreePredicate = (x: pkgs.lib.hasPrefix "vscode" x.name);
|
||||
# }
|
||||
allowUnfreePredicate = config.allowUnfreePredicate or (x: false);
|
||||
|
||||
# Check whether unfree packages are allowed and if not, whether the
|
||||
# package has an unfree license and is not explicitely allowed by the
|
||||
# `allowUnfreePredicate` function.
|
||||
hasDeniedUnfreeLicense = attrs:
|
||||
hasUnfreeLicense attrs &&
|
||||
!allowUnfree &&
|
||||
!allowUnfreePredicate attrs;
|
||||
|
||||
allowInsecureDefaultPredicate = x: builtins.elem (getName x) (config.permittedInsecurePackages or []);
|
||||
allowInsecurePredicate = x: (config.allowInsecurePredicate or allowInsecureDefaultPredicate) x;
|
||||
|
||||
hasAllowedInsecure = attrs:
|
||||
!(isMarkedInsecure attrs) ||
|
||||
allowInsecurePredicate attrs ||
|
||||
builtins.getEnv "NIXPKGS_ALLOW_INSECURE" == "1";
|
||||
|
||||
|
||||
isNonSource = sourceTypes: lib.lists.any (t: !t.isSource) sourceTypes;
|
||||
|
||||
hasNonSourceProvenance = attrs:
|
||||
(attrs ? meta.sourceProvenance) &&
|
||||
isNonSource (lib.lists.toList attrs.meta.sourceProvenance);
|
||||
|
||||
# Allow granular checks to allow only some non-source-built packages
|
||||
# Example:
|
||||
# { pkgs, ... }:
|
||||
# {
|
||||
# allowNonSource = false;
|
||||
# allowNonSourcePredicate = with pkgs.lib.lists; pkg: !(any (p: !p.isSource && p != lib.sourceTypes.binaryFirmware) (toList pkg.meta.sourceProvenance));
|
||||
# }
|
||||
allowNonSourcePredicate = config.allowNonSourcePredicate or (x: false);
|
||||
|
||||
# Check whether non-source packages are allowed and if not, whether the
|
||||
# package has non-source provenance and is not explicitly allowed by the
|
||||
# `allowNonSourcePredicate` function.
|
||||
hasDeniedNonSourceProvenance = attrs:
|
||||
hasNonSourceProvenance attrs &&
|
||||
!allowNonSource &&
|
||||
!allowNonSourcePredicate attrs;
|
||||
|
||||
showLicenseOrSourceType = value: toString (map (v: v.shortName or "unknown") (lib.lists.toList value));
|
||||
showLicense = showLicenseOrSourceType;
|
||||
showSourceType = showLicenseOrSourceType;
|
||||
|
||||
pos_str = meta: meta.position or "«unknown-file»";
|
||||
|
||||
remediation = {
|
||||
unfree = remediate_allowlist "Unfree" (remediate_predicate "allowUnfreePredicate");
|
||||
non-source = remediate_allowlist "NonSource" (remediate_predicate "allowNonSourcePredicate");
|
||||
broken = remediate_allowlist "Broken" (x: "");
|
||||
unsupported = remediate_allowlist "UnsupportedSystem" (x: "");
|
||||
blocklisted = x: "";
|
||||
insecure = remediate_insecure;
|
||||
broken-outputs = remediateOutputsToInstall;
|
||||
unknown-meta = x: "";
|
||||
maintainerless = x: "";
|
||||
};
|
||||
remediation_env_var = allow_attr: {
|
||||
Unfree = "NIXPKGS_ALLOW_UNFREE";
|
||||
Broken = "NIXPKGS_ALLOW_BROKEN";
|
||||
UnsupportedSystem = "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM";
|
||||
NonSource = "NIXPKGS_ALLOW_NONSOURCE";
|
||||
}.${allow_attr};
|
||||
remediation_phrase = allow_attr: {
|
||||
Unfree = "unfree packages";
|
||||
Broken = "broken packages";
|
||||
UnsupportedSystem = "packages that are unsupported for this system";
|
||||
NonSource = "packages not built from source";
|
||||
}.${allow_attr};
|
||||
remediate_predicate = predicateConfigAttr: attrs:
|
||||
''
|
||||
|
||||
Alternatively you can configure a predicate to allow specific packages:
|
||||
{ nixpkgs.config.${predicateConfigAttr} = pkg: builtins.elem (lib.getName pkg) [
|
||||
"${lib.getName attrs}"
|
||||
];
|
||||
}
|
||||
'';
|
||||
|
||||
# flakeNote will be printed in the remediation messages below.
|
||||
flakeNote = "
|
||||
Note: For `nix shell`, `nix build`, `nix develop` or any other Nix 2.4+
|
||||
(Flake) command, `--impure` must be passed in order to read this
|
||||
environment variable.
|
||||
";
|
||||
|
||||
remediate_allowlist = allow_attr: rebuild_amendment: attrs:
|
||||
''
|
||||
a) To temporarily allow ${remediation_phrase allow_attr}, you can use an environment variable
|
||||
for a single invocation of the nix tools.
|
||||
|
||||
$ export ${remediation_env_var allow_attr}=1
|
||||
${flakeNote}
|
||||
b) For `nixos-rebuild` you can set
|
||||
{ nixpkgs.config.allow${allow_attr} = true; }
|
||||
in configuration.nix to override this.
|
||||
${rebuild_amendment attrs}
|
||||
c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
|
||||
{ allow${allow_attr} = true; }
|
||||
to ~/.config/nixpkgs/config.nix.
|
||||
'';
|
||||
|
||||
remediate_insecure = attrs:
|
||||
''
|
||||
|
||||
Known issues:
|
||||
'' + (lib.concatStrings (map (issue: " - ${issue}\n") attrs.meta.knownVulnerabilities)) + ''
|
||||
|
||||
You can install it anyway by allowing this package, using the
|
||||
following methods:
|
||||
|
||||
a) To temporarily allow all insecure packages, you can use an environment
|
||||
variable for a single invocation of the nix tools:
|
||||
|
||||
$ export NIXPKGS_ALLOW_INSECURE=1
|
||||
${flakeNote}
|
||||
b) for `nixos-rebuild` you can add ‘${getName attrs}’ to
|
||||
`nixpkgs.config.permittedInsecurePackages` in the configuration.nix,
|
||||
like so:
|
||||
|
||||
{
|
||||
nixpkgs.config.permittedInsecurePackages = [
|
||||
"${getName attrs}"
|
||||
];
|
||||
}
|
||||
|
||||
c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
|
||||
‘${getName attrs}’ to `permittedInsecurePackages` in
|
||||
~/.config/nixpkgs/config.nix, like so:
|
||||
|
||||
{
|
||||
permittedInsecurePackages = [
|
||||
"${getName attrs}"
|
||||
];
|
||||
}
|
||||
|
||||
'';
|
||||
|
||||
remediateOutputsToInstall = attrs: let
|
||||
expectedOutputs = attrs.meta.outputsToInstall or [];
|
||||
actualOutputs = attrs.outputs or [ "out" ];
|
||||
missingOutputs = builtins.filter (output: ! builtins.elem output actualOutputs) expectedOutputs;
|
||||
in ''
|
||||
The package ${getName attrs} has set meta.outputsToInstall to: ${builtins.concatStringsSep ", " expectedOutputs}
|
||||
|
||||
however ${getName attrs} only has the outputs: ${builtins.concatStringsSep ", " actualOutputs}
|
||||
|
||||
and is missing the following ouputs:
|
||||
|
||||
${lib.concatStrings (builtins.map (output: " - ${output}\n") missingOutputs)}
|
||||
'';
|
||||
|
||||
handleEvalIssue = { meta, attrs }: { reason , errormsg ? "" }:
|
||||
let
|
||||
msg = if inHydra
|
||||
then "Failed to evaluate ${getName attrs}: «${reason}»: ${errormsg}"
|
||||
else ''
|
||||
Package ‘${getName attrs}’ in ${pos_str meta} ${errormsg}, refusing to evaluate.
|
||||
|
||||
'' + (builtins.getAttr reason remediation) attrs;
|
||||
|
||||
handler = if config ? handleEvalIssue
|
||||
then config.handleEvalIssue reason
|
||||
else throw;
|
||||
in handler msg;
|
||||
|
||||
handleEvalWarning = { meta, attrs }: { reason , errormsg ? "" }:
|
||||
let
|
||||
remediationMsg = (builtins.getAttr reason remediation) attrs;
|
||||
msg = if inHydra then "Warning while evaluating ${getName attrs}: «${reason}»: ${errormsg}"
|
||||
else "Package ${getName attrs} in ${pos_str meta} ${errormsg}, continuing anyway."
|
||||
+ (if remediationMsg != "" then "\n${remediationMsg}" else "");
|
||||
isEnabled = lib.findFirst (x: x == reason) null showWarnings;
|
||||
in if isEnabled != null then builtins.trace msg true else true;
|
||||
|
||||
metaTypes = with lib.types; rec {
|
||||
# These keys are documented
|
||||
description = str;
|
||||
mainProgram = str;
|
||||
longDescription = str;
|
||||
branch = str;
|
||||
homepage = either (listOf str) str;
|
||||
downloadPage = str;
|
||||
changelog = either (listOf str) str;
|
||||
license = either (listOf lib.types.attrs) (either lib.types.attrs str);
|
||||
sourceProvenance = either (listOf lib.types.attrs) lib.types.attrs;
|
||||
maintainers = listOf (attrsOf str);
|
||||
priority = int;
|
||||
platforms = listOf str;
|
||||
hydraPlatforms = listOf str;
|
||||
broken = bool;
|
||||
unfree = bool;
|
||||
unsupported = bool;
|
||||
insecure = bool;
|
||||
# TODO: refactor once something like Profpatsch's types-simple will land
|
||||
# This is currently dead code due to https://github.com/NixOS/nix/issues/2532
|
||||
tests = attrsOf (mkOptionType {
|
||||
name = "test";
|
||||
check = x: x == {} || ( # Accept {} for tests that are unsupported
|
||||
isDerivation x &&
|
||||
x ? meta.timeout
|
||||
);
|
||||
merge = lib.options.mergeOneOption;
|
||||
});
|
||||
timeout = int;
|
||||
|
||||
# Weirder stuff that doesn't appear in the documentation?
|
||||
maxSilent = int;
|
||||
knownVulnerabilities = listOf str;
|
||||
name = str;
|
||||
version = str;
|
||||
tag = str;
|
||||
executables = listOf str;
|
||||
outputsToInstall = listOf str;
|
||||
position = str;
|
||||
available = bool;
|
||||
isBuildPythonPackage = platforms;
|
||||
schedulingPriority = int;
|
||||
isFcitxEngine = bool;
|
||||
isIbusEngine = bool;
|
||||
isGutenprint = bool;
|
||||
badPlatforms = platforms;
|
||||
};
|
||||
|
||||
checkMetaAttr = k: v:
|
||||
if metaTypes?${k} then
|
||||
if metaTypes.${k}.check v then null else "key '${k}' has a value ${toString v} of an invalid type ${builtins.typeOf v}; expected ${metaTypes.${k}.description}"
|
||||
else "key '${k}' is unrecognized; expected one of: \n\t [${lib.concatMapStringsSep ", " (x: "'${x}'") (lib.attrNames metaTypes)}]";
|
||||
checkMeta = meta: if shouldCheckMeta then lib.remove null (lib.mapAttrsToList checkMetaAttr meta) else [];
|
||||
|
||||
checkOutputsToInstall = attrs: let
|
||||
expectedOutputs = attrs.meta.outputsToInstall or [];
|
||||
actualOutputs = attrs.outputs or [ "out" ];
|
||||
missingOutputs = builtins.filter (output: ! builtins.elem output actualOutputs) expectedOutputs;
|
||||
in if shouldCheckMeta
|
||||
then builtins.length missingOutputs > 0
|
||||
else false;
|
||||
|
||||
# Check if a derivation is valid, that is whether it passes checks for
|
||||
# e.g brokenness or license.
|
||||
#
|
||||
# Return { valid: Bool } and additionally
|
||||
# { reason: String; errormsg: String } if it is not valid, where
|
||||
# reason is one of "unfree", "blocklisted", "broken", "insecure", ...
|
||||
# Along with a boolean flag for each reason
|
||||
checkValidity = attrs:
|
||||
{
|
||||
unfree = hasUnfreeLicense attrs;
|
||||
nonSource = hasNonSourceProvenance attrs;
|
||||
broken = isMarkedBroken attrs;
|
||||
unsupported = hasUnsupportedPlatform attrs;
|
||||
insecure = isMarkedInsecure attrs;
|
||||
}
|
||||
// (if hasDeniedUnfreeLicense attrs && !(hasAllowlistedLicense attrs) then
|
||||
{ valid = "no"; reason = "unfree"; errormsg = "has an unfree license (‘${showLicense attrs.meta.license}’)"; }
|
||||
else if hasBlocklistedLicense attrs then
|
||||
{ valid = "no"; reason = "blocklisted"; errormsg = "has a blocklisted license (‘${showLicense attrs.meta.license}’)"; }
|
||||
else if hasDeniedNonSourceProvenance attrs then
|
||||
{ valid = "no"; reason = "non-source"; errormsg = "contains elements not built from source (‘${showSourceType attrs.meta.sourceProvenance}’)"; }
|
||||
else if !allowBroken && attrs.meta.broken or false then
|
||||
{ valid = "no"; reason = "broken"; errormsg = "is marked as broken"; }
|
||||
else if !allowUnsupportedSystem && hasUnsupportedPlatform attrs then
|
||||
{ valid = "no"; reason = "unsupported"; errormsg = "is not supported on ‘${hostPlatform.system}’"; }
|
||||
else if !(hasAllowedInsecure attrs) then
|
||||
{ valid = "no"; reason = "insecure"; errormsg = "is marked as insecure"; }
|
||||
else if checkOutputsToInstall attrs then
|
||||
{ valid = "no"; reason = "broken-outputs"; errormsg = "has invalid meta.outputsToInstall"; }
|
||||
else let res = checkMeta (attrs.meta or {}); in if res != [] then
|
||||
{ valid = "no"; reason = "unknown-meta"; errormsg = "has an invalid meta attrset:${lib.concatMapStrings (x: "\n\t - " + x) res}"; }
|
||||
# --- warnings ---
|
||||
# Please also update the type in /pkgs/top-level/config.nix alongside this.
|
||||
else if hasNoMaintainers attrs then
|
||||
{ valid = "warn"; reason = "maintainerless"; errormsg = "has no maintainers"; }
|
||||
# -----
|
||||
else { valid = "yes"; });
|
||||
|
||||
assertValidity = { meta, attrs }: let
|
||||
validity = checkValidity attrs;
|
||||
in validity // {
|
||||
# Throw an error if trying to evaluate a non-valid derivation
|
||||
# or, alternatively, just output a warning message.
|
||||
handled =
|
||||
{
|
||||
no = handleEvalIssue { inherit meta attrs; } { inherit (validity) reason errormsg; };
|
||||
warn = handleEvalWarning { inherit meta attrs; } { inherit (validity) reason errormsg; };
|
||||
yes = true;
|
||||
}.${validity.valid};
|
||||
};
|
||||
|
||||
in assertValidity
|
||||
2
pkgs/stdenv/generic/default-builder.sh
Normal file
2
pkgs/stdenv/generic/default-builder.sh
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
source $stdenv/setup
|
||||
genericBuild
|
||||
183
pkgs/stdenv/generic/default.nix
Normal file
183
pkgs/stdenv/generic/default.nix
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
let lib = import ../../../lib; stdenv-overridable = lib.makeOverridable (
|
||||
|
||||
argsStdenv@{ name ? "stdenv", preHook ? "", initialPath
|
||||
|
||||
, # If we don't have a C compiler, we might either have `cc = null` or `cc =
|
||||
# throw ...`, but if we do have a C compiler we should definiely have `cc !=
|
||||
# null`.
|
||||
#
|
||||
# TODO(@Ericson2314): Add assert without creating infinite recursion
|
||||
hasCC ? cc != null, cc
|
||||
|
||||
, shell
|
||||
, allowedRequisites ? null, extraAttrs ? {}, overrides ? (self: super: {}), config
|
||||
|
||||
, # The `fetchurl' to use for downloading curl and its dependencies
|
||||
# (see all-packages.nix).
|
||||
fetchurlBoot
|
||||
|
||||
, setupScript ? ./setup.sh
|
||||
|
||||
, extraNativeBuildInputs ? []
|
||||
, extraBuildInputs ? []
|
||||
, __stdenvImpureHostDeps ? []
|
||||
, __extraImpureHostDeps ? []
|
||||
, stdenvSandboxProfile ? ""
|
||||
, extraSandboxProfile ? ""
|
||||
|
||||
## Platform parameters
|
||||
##
|
||||
## The "build" "host" "target" terminology below comes from GNU Autotools. See
|
||||
## its documentation for more information on what those words mean. Note that
|
||||
## each should always be defined, even when not cross compiling.
|
||||
##
|
||||
## For purposes of bootstrapping, think of each stage as a "sliding window"
|
||||
## over a list of platforms. Specifically, the host platform of the previous
|
||||
## stage becomes the build platform of the current one, and likewise the
|
||||
## target platform of the previous stage becomes the host platform of the
|
||||
## current one.
|
||||
##
|
||||
|
||||
, # The platform on which packages are built. Consists of `system`, a
|
||||
# string (e.g.,`i686-linux') identifying the most import attributes of the
|
||||
# build platform, and `platform` a set of other details.
|
||||
buildPlatform
|
||||
|
||||
, # The platform on which packages run.
|
||||
hostPlatform
|
||||
|
||||
, # The platform which build tools (especially compilers) build for in this stage,
|
||||
targetPlatform
|
||||
|
||||
, # The implementation of `mkDerivation`, parameterized with the final stdenv so we can tie the knot.
|
||||
# This is convient to have as a parameter so the stdenv "adapters" work better
|
||||
mkDerivationFromStdenv ? import ./make-derivation.nix { inherit lib config; }
|
||||
}:
|
||||
|
||||
let
|
||||
defaultNativeBuildInputs = extraNativeBuildInputs ++
|
||||
[ ../../build-support/setup-hooks/move-docs.sh
|
||||
../../build-support/setup-hooks/make-symlinks-relative.sh
|
||||
../../build-support/setup-hooks/compress-man-pages.sh
|
||||
../../build-support/setup-hooks/strip.sh
|
||||
../../build-support/setup-hooks/patch-shebangs.sh
|
||||
../../build-support/setup-hooks/prune-libtool-files.sh
|
||||
]
|
||||
# FIXME this on Darwin; see
|
||||
# https://github.com/NixOS/nixpkgs/commit/94d164dd7#commitcomment-22030369
|
||||
++ lib.optionals hostPlatform.isLinux [
|
||||
../../build-support/setup-hooks/audit-tmpdir.sh
|
||||
../../build-support/setup-hooks/move-systemd-user-units.sh
|
||||
]
|
||||
++ [
|
||||
../../build-support/setup-hooks/multiple-outputs.sh
|
||||
../../build-support/setup-hooks/move-sbin.sh
|
||||
../../build-support/setup-hooks/move-lib64.sh
|
||||
../../build-support/setup-hooks/set-source-date-epoch-to-latest.sh
|
||||
../../build-support/setup-hooks/reproducible-builds.sh
|
||||
# TODO use lib.optional instead
|
||||
(if hasCC then cc else null)
|
||||
];
|
||||
|
||||
defaultBuildInputs = extraBuildInputs;
|
||||
|
||||
stdenv = (stdenv-overridable argsStdenv);
|
||||
|
||||
# The stdenv that we are producing.
|
||||
in
|
||||
derivation (
|
||||
lib.optionalAttrs (allowedRequisites != null) {
|
||||
allowedRequisites = allowedRequisites
|
||||
++ defaultNativeBuildInputs ++ defaultBuildInputs;
|
||||
}
|
||||
// lib.optionalAttrs config.contentAddressedByDefault {
|
||||
__contentAddressed = true;
|
||||
outputHashAlgo = "sha256";
|
||||
outputHashMode = "recursive";
|
||||
}
|
||||
// {
|
||||
inherit name;
|
||||
|
||||
# Nix itself uses the `system` field of a derivation to decide where to
|
||||
# build it. This is a bit confusing for cross compilation.
|
||||
inherit (buildPlatform) system;
|
||||
|
||||
builder = shell;
|
||||
|
||||
args = ["-e" ./builder.sh];
|
||||
|
||||
setup = setupScript;
|
||||
|
||||
# We pretty much never need rpaths on Darwin, since all library path references
|
||||
# are absolute unless we go out of our way to make them relative (like with CF)
|
||||
# TODO: This really wants to be in stdenv/darwin but we don't have hostPlatform
|
||||
# there (yet?) so it goes here until then.
|
||||
preHook = preHook + lib.optionalString buildPlatform.isDarwin ''
|
||||
export NIX_DONT_SET_RPATH_FOR_BUILD=1
|
||||
'' + lib.optionalString (hostPlatform.isDarwin || (hostPlatform.parsed.kernel.execFormat != lib.systems.parse.execFormats.elf && hostPlatform.parsed.kernel.execFormat != lib.systems.parse.execFormats.macho)) ''
|
||||
export NIX_DONT_SET_RPATH=1
|
||||
export NIX_NO_SELF_RPATH=1
|
||||
'' + lib.optionalString (hostPlatform.isDarwin && hostPlatform.isMacOS) ''
|
||||
export MACOSX_DEPLOYMENT_TARGET=${hostPlatform.darwinMinVersion}
|
||||
''
|
||||
# TODO this should be uncommented, but it causes stupid mass rebuilds. I
|
||||
# think the best solution would just be to fixup linux RPATHs so we don't
|
||||
# need to set `-rpath` anywhere.
|
||||
# + lib.optionalString targetPlatform.isDarwin ''
|
||||
# export NIX_DONT_SET_RPATH_FOR_TARGET=1
|
||||
# ''
|
||||
;
|
||||
|
||||
inherit initialPath shell
|
||||
defaultNativeBuildInputs defaultBuildInputs;
|
||||
}
|
||||
// lib.optionalAttrs buildPlatform.isDarwin {
|
||||
__sandboxProfile = stdenvSandboxProfile;
|
||||
__impureHostDeps = __stdenvImpureHostDeps;
|
||||
})
|
||||
|
||||
// {
|
||||
|
||||
meta = {
|
||||
description = "The default build environment for Unix packages in Nixpkgs";
|
||||
platforms = lib.platforms.all;
|
||||
};
|
||||
|
||||
inherit buildPlatform hostPlatform targetPlatform;
|
||||
|
||||
inherit extraNativeBuildInputs extraBuildInputs
|
||||
__extraImpureHostDeps extraSandboxProfile;
|
||||
|
||||
# Utility flags to test the type of platform.
|
||||
inherit (hostPlatform)
|
||||
isDarwin isLinux isSunOS isCygwin isBSD isFreeBSD isOpenBSD
|
||||
isi686 isx86_32 isx86_64
|
||||
is32bit is64bit
|
||||
isAarch32 isAarch64 isMips isBigEndian;
|
||||
|
||||
# Override `system` so that packages can get the system of the host
|
||||
# platform through `stdenv.system`. `system` is originally set to the
|
||||
# build platform within the derivation above so that Nix directs the build
|
||||
# to correct type of machine.
|
||||
inherit (hostPlatform) system;
|
||||
|
||||
mkDerivation = mkDerivationFromStdenv stdenv;
|
||||
|
||||
inherit fetchurlBoot;
|
||||
|
||||
inherit overrides;
|
||||
|
||||
inherit cc hasCC;
|
||||
|
||||
# Convenience for doing some very basic shell syntax checking by parsing a script
|
||||
# without running any commands. Because this will also skip `shopt -s extglob`
|
||||
# commands and extglob affects the Bash parser, we enable extglob always.
|
||||
shellDryRun = "${stdenv.shell} -n -O extglob";
|
||||
}
|
||||
|
||||
# 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
|
||||
); in stdenv-overridable
|
||||
486
pkgs/stdenv/generic/make-derivation.nix
Normal file
486
pkgs/stdenv/generic/make-derivation.nix
Normal file
|
|
@ -0,0 +1,486 @@
|
|||
{ lib, config }:
|
||||
|
||||
stdenv:
|
||||
|
||||
let
|
||||
checkMeta = import ./check-meta.nix {
|
||||
inherit lib config;
|
||||
# Nix itself uses the `system` field of a derivation to decide where
|
||||
# to build it. This is a bit confusing for cross compilation.
|
||||
inherit (stdenv) hostPlatform;
|
||||
};
|
||||
|
||||
# Based off lib.makeExtensible, with modifications:
|
||||
makeDerivationExtensible = rattrs:
|
||||
let
|
||||
# NOTE: The following is a hint that will be printed by the Nix cli when
|
||||
# encountering an infinite recursion. It must not be formatted into
|
||||
# separate lines, because Nix would only show the last line of the comment.
|
||||
|
||||
# An infinite recursion here can be caused by having the attribute names of expression `e` in `.overrideAttrs(finalAttrs: previousAttrs: e)` depend on `finalAttrs`. Only the attribute values of `e` can depend on `finalAttrs`.
|
||||
args = rattrs (args // { inherit finalPackage; });
|
||||
# ^^^^
|
||||
|
||||
finalPackage =
|
||||
mkDerivationSimple
|
||||
(f0:
|
||||
let
|
||||
f = self: super:
|
||||
# Convert f0 to an overlay. Legacy is:
|
||||
# overrideAttrs (super: {})
|
||||
# We want to introduce self. We follow the convention of overlays:
|
||||
# overrideAttrs (self: super: {})
|
||||
# Which means the first parameter can be either self or super.
|
||||
# This is surprising, but far better than the confusion that would
|
||||
# arise from flipping an overlay's parameters in some cases.
|
||||
let x = f0 super;
|
||||
in
|
||||
if builtins.isFunction x
|
||||
then
|
||||
# Can't reuse `x`, because `self` comes first.
|
||||
# Looks inefficient, but `f0 super` was a cheap thunk.
|
||||
f0 self super
|
||||
else x;
|
||||
in
|
||||
makeDerivationExtensible
|
||||
(self: let super = rattrs self; in super // f self super))
|
||||
args;
|
||||
in finalPackage;
|
||||
|
||||
# makeDerivationExtensibleConst == makeDerivationExtensible (_: attrs),
|
||||
# but pre-evaluated for a slight improvement in performance.
|
||||
makeDerivationExtensibleConst = attrs:
|
||||
mkDerivationSimple
|
||||
(f0:
|
||||
let
|
||||
f = self: super:
|
||||
let x = f0 super;
|
||||
in
|
||||
if builtins.isFunction x
|
||||
then
|
||||
f0 self super
|
||||
else x;
|
||||
in
|
||||
makeDerivationExtensible (self: attrs // f self attrs))
|
||||
attrs;
|
||||
|
||||
mkDerivationSimple = overrideAttrs:
|
||||
|
||||
|
||||
# `mkDerivation` wraps the builtin `derivation` function to
|
||||
# produce derivations that use this stdenv and its shell.
|
||||
#
|
||||
# See also:
|
||||
#
|
||||
# * https://nixos.org/nixpkgs/manual/#sec-using-stdenv
|
||||
# Details on how to use this mkDerivation function
|
||||
#
|
||||
# * https://nixos.org/manual/nix/stable/expressions/derivations.html#derivations
|
||||
# Explanation about derivations in general
|
||||
{
|
||||
|
||||
# These types of dependencies are all exhaustively documented in
|
||||
# the "Specifying Dependencies" section of the "Standard
|
||||
# Environment" chapter of the Nixpkgs manual.
|
||||
|
||||
# TODO(@Ericson2314): Stop using legacy dep attribute names
|
||||
|
||||
# host offset -> target offset
|
||||
depsBuildBuild ? [] # -1 -> -1
|
||||
, depsBuildBuildPropagated ? [] # -1 -> -1
|
||||
, nativeBuildInputs ? [] # -1 -> 0 N.B. Legacy name
|
||||
, propagatedNativeBuildInputs ? [] # -1 -> 0 N.B. Legacy name
|
||||
, depsBuildTarget ? [] # -1 -> 1
|
||||
, depsBuildTargetPropagated ? [] # -1 -> 1
|
||||
|
||||
, depsHostHost ? [] # 0 -> 0
|
||||
, depsHostHostPropagated ? [] # 0 -> 0
|
||||
, buildInputs ? [] # 0 -> 1 N.B. Legacy name
|
||||
, propagatedBuildInputs ? [] # 0 -> 1 N.B. Legacy name
|
||||
|
||||
, depsTargetTarget ? [] # 1 -> 1
|
||||
, depsTargetTargetPropagated ? [] # 1 -> 1
|
||||
|
||||
, checkInputs ? []
|
||||
, installCheckInputs ? []
|
||||
|
||||
# Configure Phase
|
||||
, configureFlags ? []
|
||||
, cmakeFlags ? []
|
||||
, mesonFlags ? []
|
||||
, # Target is not included by default because most programs don't care.
|
||||
# Including it then would cause needless mass rebuilds.
|
||||
#
|
||||
# TODO(@Ericson2314): Make [ "build" "host" ] always the default.
|
||||
configurePlatforms ? lib.optionals
|
||||
(stdenv.hostPlatform != stdenv.buildPlatform)
|
||||
[ "build" "host" ]
|
||||
|
||||
# TODO(@Ericson2314): Make unconditional / resolve #33599
|
||||
# Check phase
|
||||
, doCheck ? config.doCheckByDefault or false
|
||||
|
||||
# TODO(@Ericson2314): Make unconditional / resolve #33599
|
||||
# InstallCheck phase
|
||||
, doInstallCheck ? config.doCheckByDefault or false
|
||||
|
||||
, # TODO(@Ericson2314): Make always true and remove
|
||||
strictDeps ? if config.strictDepsByDefault then true else stdenv.hostPlatform != stdenv.buildPlatform
|
||||
|
||||
, enableParallelBuilding ? config.enableParallelBuildingByDefault
|
||||
|
||||
, meta ? {}
|
||||
, passthru ? {}
|
||||
, pos ? # position used in error messages and for meta.position
|
||||
(if attrs.meta.description or null != null
|
||||
then builtins.unsafeGetAttrPos "description" attrs.meta
|
||||
else if attrs.version or null != null
|
||||
then builtins.unsafeGetAttrPos "version" attrs
|
||||
else builtins.unsafeGetAttrPos "name" attrs)
|
||||
, separateDebugInfo ? false
|
||||
, outputs ? [ "out" ]
|
||||
, __darwinAllowLocalNetworking ? false
|
||||
, __impureHostDeps ? []
|
||||
, __propagatedImpureHostDeps ? []
|
||||
, sandboxProfile ? ""
|
||||
, propagatedSandboxProfile ? ""
|
||||
|
||||
, hardeningEnable ? []
|
||||
, hardeningDisable ? []
|
||||
|
||||
, patches ? []
|
||||
|
||||
, __contentAddressed ?
|
||||
(! attrs ? outputHash) # Fixed-output drvs can't be content addressed too
|
||||
&& config.contentAddressedByDefault
|
||||
|
||||
, ... } @ attrs:
|
||||
|
||||
let
|
||||
# TODO(@oxij, @Ericson2314): This is here to keep the old semantics, remove when
|
||||
# no package has `doCheck = true`.
|
||||
doCheck' = doCheck && stdenv.buildPlatform.canExecute stdenv.hostPlatform;
|
||||
doInstallCheck' = doInstallCheck && stdenv.buildPlatform.canExecute stdenv.hostPlatform;
|
||||
|
||||
separateDebugInfo' = separateDebugInfo && stdenv.hostPlatform.isLinux && !(stdenv.hostPlatform.useLLVM or false);
|
||||
outputs' = outputs ++ lib.optional separateDebugInfo' "debug";
|
||||
|
||||
noNonNativeDeps = builtins.length (depsBuildTarget ++ depsBuildTargetPropagated
|
||||
++ depsHostHost ++ depsHostHostPropagated
|
||||
++ buildInputs ++ propagatedBuildInputs
|
||||
++ depsTargetTarget ++ depsTargetTargetPropagated) == 0;
|
||||
dontAddHostSuffix = attrs ? outputHash && !noNonNativeDeps || !stdenv.hasCC;
|
||||
supportedHardeningFlags = [ "fortify" "stackprotector" "pie" "pic" "strictoverflow" "format" "relro" "bindnow" ];
|
||||
# Musl-based platforms will keep "pie", other platforms will not.
|
||||
# If you change this, make sure to update section `{#sec-hardening-in-nixpkgs}`
|
||||
# in the nixpkgs manual to inform users about the defaults.
|
||||
defaultHardeningFlags = if stdenv.hostPlatform.isMusl &&
|
||||
# Except when:
|
||||
# - static aarch64, where compilation works, but produces segfaulting dynamically linked binaries.
|
||||
# - static armv7l, where compilation fails.
|
||||
!((stdenv.hostPlatform.isAarch64 || stdenv.hostPlatform.isAarch32) && stdenv.hostPlatform.isStatic)
|
||||
then supportedHardeningFlags
|
||||
else lib.remove "pie" supportedHardeningFlags;
|
||||
enabledHardeningOptions =
|
||||
if builtins.elem "all" hardeningDisable
|
||||
then []
|
||||
else lib.subtractLists hardeningDisable (defaultHardeningFlags ++ hardeningEnable);
|
||||
# hardeningDisable additionally supports "all".
|
||||
erroneousHardeningFlags = lib.subtractLists supportedHardeningFlags (hardeningEnable ++ lib.remove "all" hardeningDisable);
|
||||
|
||||
checkDependencyList = checkDependencyList' [];
|
||||
checkDependencyList' = positions: name: deps: lib.flip lib.imap1 deps (index: dep:
|
||||
if lib.isDerivation dep || isNull dep || builtins.typeOf dep == "string" || builtins.typeOf dep == "path" then dep
|
||||
else if lib.isList dep then checkDependencyList' ([index] ++ positions) name dep
|
||||
else throw "Dependency is not of a valid type: ${lib.concatMapStrings (ix: "element ${toString ix} of ") ([index] ++ positions)}${name} for ${attrs.name or attrs.pname}");
|
||||
in if builtins.length erroneousHardeningFlags != 0
|
||||
then abort ("mkDerivation was called with unsupported hardening flags: " + lib.generators.toPretty {} {
|
||||
inherit erroneousHardeningFlags hardeningDisable hardeningEnable supportedHardeningFlags;
|
||||
})
|
||||
else let
|
||||
doCheck = doCheck';
|
||||
doInstallCheck = doInstallCheck';
|
||||
|
||||
outputs = outputs';
|
||||
|
||||
references = nativeBuildInputs ++ buildInputs
|
||||
++ propagatedNativeBuildInputs ++ propagatedBuildInputs;
|
||||
|
||||
dependencies = map (map lib.chooseDevOutputs) [
|
||||
[
|
||||
(map (drv: drv.__spliced.buildBuild or drv) (checkDependencyList "depsBuildBuild" depsBuildBuild))
|
||||
(map (drv: drv.nativeDrv or drv) (checkDependencyList "nativeBuildInputs" nativeBuildInputs
|
||||
++ lib.optional separateDebugInfo' ../../build-support/setup-hooks/separate-debug-info.sh
|
||||
++ lib.optional stdenv.hostPlatform.isWindows ../../build-support/setup-hooks/win-dll-link.sh
|
||||
++ lib.optionals doCheck checkInputs
|
||||
++ lib.optionals doInstallCheck' installCheckInputs))
|
||||
(map (drv: drv.__spliced.buildTarget or drv) (checkDependencyList "depsBuildTarget" depsBuildTarget))
|
||||
]
|
||||
[
|
||||
(map (drv: drv.__spliced.hostHost or drv) (checkDependencyList "depsHostHost" depsHostHost))
|
||||
(map (drv: drv.crossDrv or drv) (checkDependencyList "buildInputs" buildInputs))
|
||||
]
|
||||
[
|
||||
(map (drv: drv.__spliced.targetTarget or drv) (checkDependencyList "depsTargetTarget" depsTargetTarget))
|
||||
]
|
||||
];
|
||||
propagatedDependencies = map (map lib.chooseDevOutputs) [
|
||||
[
|
||||
(map (drv: drv.__spliced.buildBuild or drv) (checkDependencyList "depsBuildBuildPropagated" depsBuildBuildPropagated))
|
||||
(map (drv: drv.nativeDrv or drv) (checkDependencyList "propagatedNativeBuildInputs" propagatedNativeBuildInputs))
|
||||
(map (drv: drv.__spliced.buildTarget or drv) (checkDependencyList "depsBuildTargetPropagated" depsBuildTargetPropagated))
|
||||
]
|
||||
[
|
||||
(map (drv: drv.__spliced.hostHost or drv) (checkDependencyList "depsHostHostPropagated" depsHostHostPropagated))
|
||||
(map (drv: drv.crossDrv or drv) (checkDependencyList "propagatedBuildInputs" propagatedBuildInputs))
|
||||
]
|
||||
[
|
||||
(map (drv: drv.__spliced.targetTarget or drv) (checkDependencyList "depsTargetTargetPropagated" depsTargetTargetPropagated))
|
||||
]
|
||||
];
|
||||
|
||||
computedSandboxProfile =
|
||||
lib.concatMap (input: input.__propagatedSandboxProfile or [])
|
||||
(stdenv.extraNativeBuildInputs
|
||||
++ stdenv.extraBuildInputs
|
||||
++ lib.concatLists dependencies);
|
||||
|
||||
computedPropagatedSandboxProfile =
|
||||
lib.concatMap (input: input.__propagatedSandboxProfile or [])
|
||||
(lib.concatLists propagatedDependencies);
|
||||
|
||||
computedImpureHostDeps =
|
||||
lib.unique (lib.concatMap (input: input.__propagatedImpureHostDeps or [])
|
||||
(stdenv.extraNativeBuildInputs
|
||||
++ stdenv.extraBuildInputs
|
||||
++ lib.concatLists dependencies));
|
||||
|
||||
computedPropagatedImpureHostDeps =
|
||||
lib.unique (lib.concatMap (input: input.__propagatedImpureHostDeps or [])
|
||||
(lib.concatLists propagatedDependencies));
|
||||
|
||||
derivationArg =
|
||||
(removeAttrs attrs
|
||||
["meta" "passthru" "pos"
|
||||
"checkInputs" "installCheckInputs"
|
||||
"__darwinAllowLocalNetworking"
|
||||
"__impureHostDeps" "__propagatedImpureHostDeps"
|
||||
"sandboxProfile" "propagatedSandboxProfile"])
|
||||
// (lib.optionalAttrs (attrs ? name || (attrs ? pname && attrs ? version)) {
|
||||
name =
|
||||
let
|
||||
# Indicate the host platform of the derivation if cross compiling.
|
||||
# Fixed-output derivations like source tarballs shouldn't get a host
|
||||
# suffix. But we have some weird ones with run-time deps that are
|
||||
# just used for their side-affects. Those might as well since the
|
||||
# hash can't be the same. See #32986.
|
||||
hostSuffix = lib.optionalString
|
||||
(stdenv.hostPlatform != stdenv.buildPlatform && !dontAddHostSuffix)
|
||||
"-${stdenv.hostPlatform.config}";
|
||||
# Disambiguate statically built packages. This was originally
|
||||
# introduce as a means to prevent nix-env to get confused between
|
||||
# nix and nixStatic. This should be also achieved by moving the
|
||||
# hostSuffix before the version, so we could contemplate removing
|
||||
# it again.
|
||||
staticMarker = lib.optionalString stdenv.hostPlatform.isStatic "-static";
|
||||
in
|
||||
lib.strings.sanitizeDerivationName (
|
||||
if attrs ? name
|
||||
then attrs.name + hostSuffix
|
||||
else "${attrs.pname}${staticMarker}${hostSuffix}-${attrs.version}"
|
||||
);
|
||||
}) // {
|
||||
builder = attrs.realBuilder or stdenv.shell;
|
||||
args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)];
|
||||
inherit stdenv;
|
||||
|
||||
# The `system` attribute of a derivation has special meaning to Nix.
|
||||
# Derivations set it to choose what sort of machine could be used to
|
||||
# execute the build, The build platform entirely determines this,
|
||||
# indeed more finely than Nix knows or cares about. The `system`
|
||||
# attribute of `buildPlatfom` matches Nix's degree of specificity.
|
||||
# exactly.
|
||||
inherit (stdenv.buildPlatform) system;
|
||||
|
||||
userHook = config.stdenv.userHook or null;
|
||||
__ignoreNulls = true;
|
||||
|
||||
inherit strictDeps;
|
||||
|
||||
depsBuildBuild = lib.elemAt (lib.elemAt dependencies 0) 0;
|
||||
nativeBuildInputs = lib.elemAt (lib.elemAt dependencies 0) 1;
|
||||
depsBuildTarget = lib.elemAt (lib.elemAt dependencies 0) 2;
|
||||
depsHostHost = lib.elemAt (lib.elemAt dependencies 1) 0;
|
||||
buildInputs = lib.elemAt (lib.elemAt dependencies 1) 1;
|
||||
depsTargetTarget = lib.elemAt (lib.elemAt dependencies 2) 0;
|
||||
|
||||
depsBuildBuildPropagated = lib.elemAt (lib.elemAt propagatedDependencies 0) 0;
|
||||
propagatedNativeBuildInputs = lib.elemAt (lib.elemAt propagatedDependencies 0) 1;
|
||||
depsBuildTargetPropagated = lib.elemAt (lib.elemAt propagatedDependencies 0) 2;
|
||||
depsHostHostPropagated = lib.elemAt (lib.elemAt propagatedDependencies 1) 0;
|
||||
propagatedBuildInputs = lib.elemAt (lib.elemAt propagatedDependencies 1) 1;
|
||||
depsTargetTargetPropagated = lib.elemAt (lib.elemAt propagatedDependencies 2) 0;
|
||||
|
||||
# This parameter is sometimes a string, sometimes null, and sometimes a list, yuck
|
||||
configureFlags = let inherit (lib) optional elem; in
|
||||
(/**/ if lib.isString configureFlags then lib.warn "String 'configureFlags' is deprecated and will be removed in release 23.05. Please use a list of strings. Derivation name: ${derivationArg.name}, file: ${pos.file or "unknown file"}" [configureFlags]
|
||||
else if configureFlags == null then lib.warn "Null 'configureFlags' is deprecated and will be removed in release 23.05. Please use a empty list instead '[]'. Derivation name: ${derivationArg.name}, file: ${pos.file or "unknown file"}" []
|
||||
else configureFlags)
|
||||
++ optional (elem "build" configurePlatforms) "--build=${stdenv.buildPlatform.config}"
|
||||
++ optional (elem "host" configurePlatforms) "--host=${stdenv.hostPlatform.config}"
|
||||
++ optional (elem "target" configurePlatforms) "--target=${stdenv.targetPlatform.config}";
|
||||
|
||||
inherit patches;
|
||||
|
||||
inherit doCheck doInstallCheck;
|
||||
|
||||
inherit outputs;
|
||||
} // lib.optionalAttrs (__contentAddressed) {
|
||||
inherit __contentAddressed;
|
||||
# Provide default values for outputHashMode and outputHashAlgo because
|
||||
# most people won't care about these anyways
|
||||
outputHashAlgo = attrs.outputHashAlgo or "sha256";
|
||||
outputHashMode = attrs.outputHashMode or "recursive";
|
||||
} // lib.optionalAttrs (stdenv.hostPlatform != stdenv.buildPlatform) {
|
||||
cmakeFlags =
|
||||
(/**/ if lib.isString cmakeFlags then [cmakeFlags]
|
||||
else if cmakeFlags == null then []
|
||||
else cmakeFlags)
|
||||
++ [ "-DCMAKE_SYSTEM_NAME=${lib.findFirst lib.isString "Generic" (
|
||||
lib.optional (!stdenv.hostPlatform.isRedox) stdenv.hostPlatform.uname.system)}"]
|
||||
++ lib.optional (stdenv.hostPlatform.uname.processor != null) "-DCMAKE_SYSTEM_PROCESSOR=${stdenv.hostPlatform.uname.processor}"
|
||||
++ lib.optional (stdenv.hostPlatform.uname.release != null) "-DCMAKE_SYSTEM_VERSION=${stdenv.hostPlatform.uname.release}"
|
||||
++ lib.optional (stdenv.hostPlatform.isDarwin) "-DCMAKE_OSX_ARCHITECTURES=${stdenv.hostPlatform.darwinArch}"
|
||||
++ lib.optional (stdenv.buildPlatform.uname.system != null) "-DCMAKE_HOST_SYSTEM_NAME=${stdenv.buildPlatform.uname.system}"
|
||||
++ lib.optional (stdenv.buildPlatform.uname.processor != null) "-DCMAKE_HOST_SYSTEM_PROCESSOR=${stdenv.buildPlatform.uname.processor}"
|
||||
++ lib.optional (stdenv.buildPlatform.uname.release != null) "-DCMAKE_HOST_SYSTEM_VERSION=${stdenv.buildPlatform.uname.release}";
|
||||
|
||||
mesonFlags = if mesonFlags == null then null else let
|
||||
# See https://mesonbuild.com/Reference-tables.html#cpu-families
|
||||
cpuFamily = platform: with platform;
|
||||
/**/ if isAarch32 then "arm"
|
||||
else if isAarch64 then "aarch64"
|
||||
else if isx86_32 then "x86"
|
||||
else if isx86_64 then "x86_64"
|
||||
else platform.parsed.cpu.family + builtins.toString platform.parsed.cpu.bits;
|
||||
crossFile = builtins.toFile "cross-file.conf" ''
|
||||
[properties]
|
||||
needs_exe_wrapper = true
|
||||
|
||||
[host_machine]
|
||||
system = '${stdenv.targetPlatform.parsed.kernel.name}'
|
||||
cpu_family = '${cpuFamily stdenv.targetPlatform}'
|
||||
cpu = '${stdenv.targetPlatform.parsed.cpu.name}'
|
||||
endian = ${if stdenv.targetPlatform.isLittleEndian then "'little'" else "'big'"}
|
||||
|
||||
[binaries]
|
||||
llvm-config = 'llvm-config-native'
|
||||
'';
|
||||
in [ "--cross-file=${crossFile}" ] ++ mesonFlags;
|
||||
} // lib.optionalAttrs (enableParallelBuilding) {
|
||||
enableParallelChecking = attrs.enableParallelChecking or true;
|
||||
} // lib.optionalAttrs (hardeningDisable != [] || hardeningEnable != [] || stdenv.hostPlatform.isMusl) {
|
||||
NIX_HARDENING_ENABLE = enabledHardeningOptions;
|
||||
} // lib.optionalAttrs (stdenv.hostPlatform.isx86_64 && stdenv.hostPlatform ? gcc.arch) {
|
||||
requiredSystemFeatures = attrs.requiredSystemFeatures or [] ++ [ "gccarch-${stdenv.hostPlatform.gcc.arch}" ];
|
||||
} // lib.optionalAttrs (stdenv.buildPlatform.isDarwin) {
|
||||
inherit __darwinAllowLocalNetworking;
|
||||
# TODO: remove lib.unique once nix has a list canonicalization primitive
|
||||
__sandboxProfile =
|
||||
let profiles = [ stdenv.extraSandboxProfile ] ++ computedSandboxProfile ++ computedPropagatedSandboxProfile ++ [ propagatedSandboxProfile sandboxProfile ];
|
||||
final = lib.concatStringsSep "\n" (lib.filter (x: x != "") (lib.unique profiles));
|
||||
in final;
|
||||
__propagatedSandboxProfile = lib.unique (computedPropagatedSandboxProfile ++ [ propagatedSandboxProfile ]);
|
||||
__impureHostDeps = computedImpureHostDeps ++ computedPropagatedImpureHostDeps ++ __propagatedImpureHostDeps ++ __impureHostDeps ++ stdenv.__extraImpureHostDeps ++ [
|
||||
"/dev/zero"
|
||||
"/dev/random"
|
||||
"/dev/urandom"
|
||||
"/bin/sh"
|
||||
];
|
||||
__propagatedImpureHostDeps = computedPropagatedImpureHostDeps ++ __propagatedImpureHostDeps;
|
||||
};
|
||||
|
||||
validity = checkMeta { inherit meta attrs; };
|
||||
|
||||
# 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.
|
||||
meta = {
|
||||
# `name` above includes cross-compilation cruft,
|
||||
# is under assert, and is sanitized.
|
||||
# Let's have a clean always accessible version here.
|
||||
name = attrs.name or "${attrs.pname}-${attrs.version}";
|
||||
|
||||
# If the packager hasn't specified `outputsToInstall`, choose a default,
|
||||
# which is the name of `p.bin or p.out or p` along with `p.man` when
|
||||
# present.
|
||||
#
|
||||
# If the packager has specified it, it will be overridden below in
|
||||
# `// meta`.
|
||||
#
|
||||
# Note: This default probably shouldn't be globally configurable.
|
||||
# Services and users should specify outputs explicitly,
|
||||
# unless they are comfortable with this default.
|
||||
outputsToInstall =
|
||||
let
|
||||
hasOutput = out: builtins.elem out outputs;
|
||||
in [( lib.findFirst hasOutput null (["bin" "out"] ++ outputs) )]
|
||||
++ lib.optional (hasOutput "man") "man";
|
||||
}
|
||||
// attrs.meta or {}
|
||||
# Fill `meta.position` to identify the source location of the package.
|
||||
// lib.optionalAttrs (pos != null) {
|
||||
position = pos.file + ":" + toString pos.line;
|
||||
} // {
|
||||
# Expose the result of the checks for everyone to see.
|
||||
inherit (validity) unfree broken unsupported insecure;
|
||||
available = validity.valid != "no"
|
||||
&& (if config.checkMetaRecursively or false
|
||||
then lib.all (d: d.meta.available or true) references
|
||||
else true);
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
lib.extendDerivation
|
||||
validity.handled
|
||||
({
|
||||
# A derivation that always builds successfully and whose runtime
|
||||
# dependencies are the original derivations build time dependencies
|
||||
# This allows easy building and distributing of all derivations
|
||||
# needed to enter a nix-shell with
|
||||
# nix-build shell.nix -A inputDerivation
|
||||
inputDerivation = derivation (derivationArg // {
|
||||
# Add a name in case the original drv didn't have one
|
||||
name = derivationArg.name or "inputDerivation";
|
||||
# This always only has one output
|
||||
outputs = [ "out" ];
|
||||
|
||||
# Propagate the original builder and arguments, since we override
|
||||
# them and they might contain references to build inputs
|
||||
_derivation_original_builder = derivationArg.builder;
|
||||
_derivation_original_args = derivationArg.args;
|
||||
|
||||
builder = stdenv.shell;
|
||||
# The bash builtin `export` dumps all current environment variables,
|
||||
# which is where all build input references end up (e.g. $PATH for
|
||||
# binaries). By writing this to $out, Nix can find and register
|
||||
# them as runtime dependencies (since Nix greps for store paths
|
||||
# through $out to find them)
|
||||
args = [ "-c" "export > $out" ];
|
||||
});
|
||||
|
||||
inherit meta passthru overrideAttrs;
|
||||
} //
|
||||
# Pass through extra attributes that are not inputs, but
|
||||
# should be made available to Nix expressions using the
|
||||
# derivation (e.g., in assertions).
|
||||
passthru)
|
||||
(derivation derivationArg);
|
||||
|
||||
in
|
||||
fnOrAttrs:
|
||||
if builtins.isFunction fnOrAttrs
|
||||
then makeDerivationExtensible fnOrAttrs
|
||||
else makeDerivationExtensibleConst fnOrAttrs
|
||||
1395
pkgs/stdenv/generic/setup.sh
Normal file
1395
pkgs/stdenv/generic/setup.sh
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue