2022-01-23 02:50:23 +00:00
|
|
|
|
# shellcheck shell=bash
|
2023-01-16 21:33:55 +00:00
|
|
|
|
# shellcheck disable=1090,2154,2123,2034,2178,2048,2068,1091
|
2022-01-23 02:50:09 +00:00
|
|
|
|
__nixpkgs_setup_set_original=$-
|
2017-08-09 05:20:56 +00:00
|
|
|
|
set -eu
|
2014-10-10 09:50:25 +00:00
|
|
|
|
set -o pipefail
|
2014-07-01 14:17:23 +00:00
|
|
|
|
|
2021-08-19 14:23:58 +00:00
|
|
|
|
if [[ -n "${BASH_VERSINFO-}" && "${BASH_VERSINFO-}" -lt 4 ]]; then
|
2021-01-01 06:22:23 +00:00
|
|
|
|
echo "Detected Bash version that isn't supported by Nixpkgs (${BASH_VERSION})"
|
|
|
|
|
echo "Please install Bash 4 or greater to continue."
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2022-08-17 20:00:00 +00:00
|
|
|
|
shopt -s inherit_errexit
|
|
|
|
|
|
2017-09-19 23:11:29 +00:00
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 6 )); then
|
|
|
|
|
set -x
|
|
|
|
|
fi
|
|
|
|
|
|
stdenv: refactor `.attrs.sh` detection
Relying on `.attrs.sh` to exist in `$NIX_BUILD_TOP` is problematic
because that's not compatible with how `nix-shell(1)` behaves. It places
`.attrs.{json,sh}` into a temporary directory and makes them accessible via
`$NIX_ATTRS_{SH,JSON}_FILE` in the environment[1]. The sole reason that
`nix-shell(1)` still works with structured-attrs enabled derivations
is that the contents of `.attrs.sh` are sourced into the
shell before sourcing `$stdenv/setup` (if `$stdenv` exists) by `nix-shell`.
However, the assumption that two files called `.attrs.sh` and
`.attrs.json` exist in `$NIX_BUILD_TOP` is wrong in an interactive shell
session and thus an inconsistency between shell debug session and actual
builds which can lead to unexpected problems.
To be precise, we currently have the following problem: an expression
like
with import ./. {};
runCommand "foo" { __structuredAttrs = true; foo.bar = [ 1 2 3 ]; }
''
echo "''${__structuredAttrs@Q}"
touch $out
''
prints `1` in its build-log. However when building interactively in a
`nix-shell`, it doesn't.
Because of that, I'm considering to propose a full deprecation of
`$NIX_BUILD_TOP/.attrs.{json,sh}`. A first step is to only mention the
environment variables, but not the actual paths anymore in Nix's
manual[2]. The second step - this patch - is to fix nixpkgs' stdenv
accordingly.
Please note that we cannot check for `-e "$NIX_ATTRS_JSON_FILE"` because
certain outdated Nix minors (that are still in the range of supported
Nix versions in `nixpkgs`) have a bug where `NIX_ATTRS_JSON_FILE` points
to the wrong file while building[3].
Also, for compatibility with Nix 2.3 which doesn't provide these
environment variables at all we still need to check for the existence of
.attrs.json/.attrs.sh here. As soon as we bump nixpkgs' minver to 2.4,
this can be dropped.
Finally, dropped the check for ATTRS_SH_FILE because that was never
relevant. In nix#4770 the ATTRS_SH_FILE variable was introduced[4] and
in a review iteration prefixed with NIX_[5]. In other words, these
variables were never part of a release and you'd only have this problem
if you'd use a Nix from a git revision of my branch from back then. In
other words, that's dead code.
[1] https://github.com/nixos/nix/pull/4770#issuecomment-834718851
[2] https://github.com/NixOS/nix/pull/9032
[3] https://github.com/NixOS/nix/issues/6736
[4] https://github.com/NixOS/nix/pull/4770/commits/3944a120ec6986c723bf36bfade9b331dd4af68a
[5] https://github.com/NixOS/nix/pull/4770/commits/27ce722638eeabb987bc9b4a1234c2818c5bf401
2023-09-28 09:05:52 +00:00
|
|
|
|
if [ -f .attrs.sh ] || [[ -n "${NIX_ATTRS_JSON_FILE:-}" ]]; then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
__structuredAttrs=1
|
|
|
|
|
echo "structuredAttrs is enabled"
|
|
|
|
|
|
|
|
|
|
for outputName in "${!outputs[@]}"; do
|
|
|
|
|
# ex: out=/nix/store/...
|
|
|
|
|
export "$outputName=${outputs[$outputName]}"
|
|
|
|
|
done
|
2023-02-06 13:06:38 +00:00
|
|
|
|
|
|
|
|
|
# $NIX_ATTRS_JSON_FILE pointed to the wrong location in sandbox
|
|
|
|
|
# https://github.com/NixOS/nix/issues/6736; please keep around until the
|
|
|
|
|
# fix reaches *every patch version* that's >= lib/minver.nix
|
2023-05-29 21:07:38 +00:00
|
|
|
|
if ! [[ -e "${NIX_ATTRS_JSON_FILE:-}" ]]; then
|
2023-02-06 13:06:38 +00:00
|
|
|
|
export NIX_ATTRS_JSON_FILE="$NIX_BUILD_TOP/.attrs.json"
|
|
|
|
|
fi
|
2023-05-29 21:07:38 +00:00
|
|
|
|
if ! [[ -e "${NIX_ATTRS_SH_FILE:-}" ]]; then
|
2023-02-06 13:06:38 +00:00
|
|
|
|
export NIX_ATTRS_SH_FILE="$NIX_BUILD_TOP/.attrs.sh"
|
|
|
|
|
fi
|
2022-05-31 21:34:59 +00:00
|
|
|
|
else
|
stdenv: refactor `.attrs.sh` detection
Relying on `.attrs.sh` to exist in `$NIX_BUILD_TOP` is problematic
because that's not compatible with how `nix-shell(1)` behaves. It places
`.attrs.{json,sh}` into a temporary directory and makes them accessible via
`$NIX_ATTRS_{SH,JSON}_FILE` in the environment[1]. The sole reason that
`nix-shell(1)` still works with structured-attrs enabled derivations
is that the contents of `.attrs.sh` are sourced into the
shell before sourcing `$stdenv/setup` (if `$stdenv` exists) by `nix-shell`.
However, the assumption that two files called `.attrs.sh` and
`.attrs.json` exist in `$NIX_BUILD_TOP` is wrong in an interactive shell
session and thus an inconsistency between shell debug session and actual
builds which can lead to unexpected problems.
To be precise, we currently have the following problem: an expression
like
with import ./. {};
runCommand "foo" { __structuredAttrs = true; foo.bar = [ 1 2 3 ]; }
''
echo "''${__structuredAttrs@Q}"
touch $out
''
prints `1` in its build-log. However when building interactively in a
`nix-shell`, it doesn't.
Because of that, I'm considering to propose a full deprecation of
`$NIX_BUILD_TOP/.attrs.{json,sh}`. A first step is to only mention the
environment variables, but not the actual paths anymore in Nix's
manual[2]. The second step - this patch - is to fix nixpkgs' stdenv
accordingly.
Please note that we cannot check for `-e "$NIX_ATTRS_JSON_FILE"` because
certain outdated Nix minors (that are still in the range of supported
Nix versions in `nixpkgs`) have a bug where `NIX_ATTRS_JSON_FILE` points
to the wrong file while building[3].
Also, for compatibility with Nix 2.3 which doesn't provide these
environment variables at all we still need to check for the existence of
.attrs.json/.attrs.sh here. As soon as we bump nixpkgs' minver to 2.4,
this can be dropped.
Finally, dropped the check for ATTRS_SH_FILE because that was never
relevant. In nix#4770 the ATTRS_SH_FILE variable was introduced[4] and
in a review iteration prefixed with NIX_[5]. In other words, these
variables were never part of a release and you'd only have this problem
if you'd use a Nix from a git revision of my branch from back then. In
other words, that's dead code.
[1] https://github.com/nixos/nix/pull/4770#issuecomment-834718851
[2] https://github.com/NixOS/nix/pull/9032
[3] https://github.com/NixOS/nix/issues/6736
[4] https://github.com/NixOS/nix/pull/4770/commits/3944a120ec6986c723bf36bfade9b331dd4af68a
[5] https://github.com/NixOS/nix/pull/4770/commits/27ce722638eeabb987bc9b4a1234c2818c5bf401
2023-09-28 09:05:52 +00:00
|
|
|
|
__structuredAttrs=
|
2023-01-15 22:36:31 +00:00
|
|
|
|
: "${outputs:=out}"
|
2022-05-31 21:34:59 +00:00
|
|
|
|
fi
|
2014-06-25 14:47:58 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
getAllOutputNames() {
|
|
|
|
|
if [ -n "$__structuredAttrs" ]; then
|
|
|
|
|
echo "${!outputs[*]}"
|
|
|
|
|
else
|
|
|
|
|
echo "$outputs"
|
|
|
|
|
fi
|
|
|
|
|
}
|
2014-06-25 14:47:58 +00:00
|
|
|
|
|
2024-05-22 22:28:31 +00:00
|
|
|
|
if [[ -n "${NIX_LOG_FD:-}" ]]; then
|
|
|
|
|
# Logs arguments to $NIX_LOG_FD, if it exists, no-op if it does not.
|
|
|
|
|
nixLog() {
|
|
|
|
|
echo "$@" >&"$NIX_LOG_FD"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Log a hook, to be run before the hook is actually called.
|
|
|
|
|
# logging for "implicit" hooks -- the ones specified directly
|
|
|
|
|
# in derivation's arguments -- is done in _callImplicitHook instead.
|
|
|
|
|
_logHook() {
|
|
|
|
|
local hookKind="$1"
|
|
|
|
|
local hookExpr="$2"
|
|
|
|
|
shift 2
|
|
|
|
|
|
|
|
|
|
if declare -F "$hookExpr" > /dev/null 2>&1; then
|
|
|
|
|
nixLog "calling '$hookKind' function hook '$hookExpr'" "$@"
|
|
|
|
|
elif type -p "$hookExpr" > /dev/null; then
|
|
|
|
|
nixLog "sourcing '$hookKind' script hook '$hookExpr'"
|
|
|
|
|
elif [[ "$hookExpr" != "_callImplicitHook"* ]]; then
|
|
|
|
|
# Here we have a string hook to eval.
|
|
|
|
|
# Join lines onto one with literal \n characters unless NIX_DEBUG >= 2.
|
|
|
|
|
local exprToOutput
|
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 2 )); then
|
|
|
|
|
exprToOutput="$hookExpr"
|
|
|
|
|
else
|
|
|
|
|
# We have `r'\n'.join([line.lstrip() for lines in text.split('\n')])` at home.
|
|
|
|
|
local hookExprLine
|
|
|
|
|
while IFS= read -r hookExprLine; do
|
|
|
|
|
# These lines often have indentation,
|
|
|
|
|
# so let's remove leading whitespace.
|
|
|
|
|
hookExprLine="${hookExprLine#"${hookExprLine%%[![:space:]]*}"}"
|
|
|
|
|
# If this line wasn't entirely whitespace,
|
|
|
|
|
# then add it to our output
|
|
|
|
|
if [[ -n "$hookExprLine" ]]; then
|
|
|
|
|
exprToOutput+="$hookExprLine\\n "
|
|
|
|
|
fi
|
|
|
|
|
done <<< "$hookExpr"
|
|
|
|
|
|
|
|
|
|
# And then remove the final, unnecessary, \n
|
|
|
|
|
exprToOutput="${exprToOutput%%\\n }"
|
|
|
|
|
fi
|
|
|
|
|
nixLog "evaling '$hookKind' string hook '$exprToOutput'"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
nixLog() {
|
|
|
|
|
# Stub.
|
|
|
|
|
# Note: because bash syntax, this colon is load bearing. Removing it
|
|
|
|
|
# will turn this function into a syntax error.
|
|
|
|
|
:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_logHook() {
|
|
|
|
|
# Load-bearing colon; same as above.
|
|
|
|
|
:
|
|
|
|
|
}
|
|
|
|
|
fi
|
|
|
|
|
|
2014-06-25 13:38:37 +00:00
|
|
|
|
######################################################################
|
|
|
|
|
# Hook handling.
|
|
|
|
|
|
|
|
|
|
# Run all hooks with the specified name in the order in which they
|
|
|
|
|
# were added, stopping if any fails (returns a non-zero exit
|
2014-07-08 11:47:09 +00:00
|
|
|
|
# code). The hooks for <hookName> are the shell function or variable
|
|
|
|
|
# <hookName>, and the values of the shell array ‘<hookName>Hooks’.
|
2014-06-25 13:38:37 +00:00
|
|
|
|
runHook() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local hookName="$1"
|
2014-07-08 12:14:28 +00:00
|
|
|
|
shift
|
2017-08-09 05:20:56 +00:00
|
|
|
|
local hooksSlice="${hookName%Hook}Hooks[@]"
|
2017-07-25 21:48:50 +00:00
|
|
|
|
|
2017-07-06 23:29:48 +00:00
|
|
|
|
local hook
|
2017-08-09 05:20:56 +00:00
|
|
|
|
# Hack around old bash being bad and thinking empty arrays are
|
|
|
|
|
# undefined.
|
|
|
|
|
for hook in "_callImplicitHook 0 $hookName" ${!hooksSlice+"${!hooksSlice}"}; do
|
2024-05-22 22:28:31 +00:00
|
|
|
|
_logHook "$hookName" "$hook" "$@"
|
2015-05-12 16:41:02 +00:00
|
|
|
|
_eval "$hook" "$@"
|
2014-06-25 13:38:37 +00:00
|
|
|
|
done
|
2017-08-09 05:20:56 +00:00
|
|
|
|
|
2014-06-25 13:38:37 +00:00
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-06-30 11:48:29 +00:00
|
|
|
|
# Run all hooks with the specified name, until one succeeds (returns a
|
|
|
|
|
# zero exit code). If none succeed, return a non-zero exit code.
|
|
|
|
|
runOneHook() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local hookName="$1"
|
2014-07-08 12:14:28 +00:00
|
|
|
|
shift
|
2017-08-09 05:20:56 +00:00
|
|
|
|
local hooksSlice="${hookName%Hook}Hooks[@]"
|
2017-07-25 21:48:50 +00:00
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
local hook ret=1
|
|
|
|
|
# Hack around old bash like above
|
|
|
|
|
for hook in "_callImplicitHook 1 $hookName" ${!hooksSlice+"${!hooksSlice}"}; do
|
2024-05-22 22:28:31 +00:00
|
|
|
|
_logHook "$hookName" "$hook" "$@"
|
2014-07-08 12:14:28 +00:00
|
|
|
|
if _eval "$hook" "$@"; then
|
2017-08-09 05:20:56 +00:00
|
|
|
|
ret=0
|
|
|
|
|
break
|
2014-06-30 11:48:29 +00:00
|
|
|
|
fi
|
|
|
|
|
done
|
2017-08-09 05:20:56 +00:00
|
|
|
|
|
|
|
|
|
return "$ret"
|
2014-06-30 11:48:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
# Run the named hook, either by calling the function with that name or
|
2014-06-25 13:38:37 +00:00
|
|
|
|
# by evaluating the variable with that name. This allows convenient
|
2009-02-01 21:28:02 +00:00
|
|
|
|
# setting of hooks both from Nix expressions (as attributes /
|
2014-06-25 13:38:37 +00:00
|
|
|
|
# environment variables) and from shell scripts (as functions). If you
|
|
|
|
|
# want to allow multiple hooks, use runHook instead.
|
2014-06-30 11:48:29 +00:00
|
|
|
|
_callImplicitHook() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local def="$1"
|
|
|
|
|
local hookName="$2"
|
2019-09-19 15:06:48 +00:00
|
|
|
|
if declare -F "$hookName" > /dev/null; then
|
2024-05-22 22:28:31 +00:00
|
|
|
|
nixLog "calling implicit '$hookName' function hook"
|
2019-09-19 15:06:48 +00:00
|
|
|
|
"$hookName"
|
|
|
|
|
elif type -p "$hookName" > /dev/null; then
|
2024-05-22 22:28:31 +00:00
|
|
|
|
nixLog "sourcing implicit '$hookName' script hook"
|
2019-09-19 15:06:48 +00:00
|
|
|
|
source "$hookName"
|
|
|
|
|
elif [ -n "${!hookName:-}" ]; then
|
2024-05-22 22:28:31 +00:00
|
|
|
|
nixLog "evaling implicit '$hookName' string hook"
|
2019-09-19 15:06:48 +00:00
|
|
|
|
eval "${!hookName}"
|
|
|
|
|
else
|
|
|
|
|
return "$def"
|
|
|
|
|
fi
|
2017-08-09 05:20:56 +00:00
|
|
|
|
# `_eval` expects hook to need nounset disable and leave it
|
|
|
|
|
# disabled anyways, so Ok to to delegate. The alternative of a
|
|
|
|
|
# return trap is no good because it would affect nested returns.
|
2009-02-01 21:28:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-06-25 13:38:37 +00:00
|
|
|
|
# A function wrapper around ‘eval’ that ensures that ‘return’ inside
|
2017-08-09 05:20:56 +00:00
|
|
|
|
# hooks exits the hook, not the caller. Also will only pass args if
|
|
|
|
|
# command can take them
|
2014-06-25 13:38:37 +00:00
|
|
|
|
_eval() {
|
2019-09-19 09:43:34 +00:00
|
|
|
|
if declare -F "$1" > /dev/null 2>&1; then
|
2017-08-09 05:20:56 +00:00
|
|
|
|
"$@" # including args
|
2014-07-08 12:14:28 +00:00
|
|
|
|
else
|
2017-08-09 05:20:56 +00:00
|
|
|
|
eval "$1"
|
2014-07-08 12:14:28 +00:00
|
|
|
|
fi
|
2014-06-25 13:38:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2015-06-15 09:24:11 +00:00
|
|
|
|
######################################################################
|
|
|
|
|
# Logging.
|
|
|
|
|
|
2017-07-13 20:31:39 +00:00
|
|
|
|
# Prints a command such that all word splits are unambiguous. We need
|
|
|
|
|
# to split the command in three parts because the middle format string
|
|
|
|
|
# will be, and must be, repeated for each argument. The first argument
|
|
|
|
|
# goes before the ':' and is just for convenience.
|
|
|
|
|
echoCmd() {
|
|
|
|
|
printf "%s:" "$1"
|
|
|
|
|
shift
|
|
|
|
|
printf ' %q' "$@"
|
|
|
|
|
echo
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-15 09:24:11 +00:00
|
|
|
|
|
2014-06-25 13:38:37 +00:00
|
|
|
|
######################################################################
|
|
|
|
|
# Error handling.
|
|
|
|
|
|
2008-04-23 07:19:48 +00:00
|
|
|
|
exitHandler() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
exitCode="$?"
|
2008-04-23 07:19:48 +00:00
|
|
|
|
set +e
|
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -n "${showBuildStats:-}" ]; then
|
2021-09-06 03:05:15 +00:00
|
|
|
|
read -r -d '' -a buildTimes < <(times)
|
|
|
|
|
echo "build times:"
|
|
|
|
|
echo "user time for the shell ${buildTimes[0]}"
|
|
|
|
|
echo "system time for the shell ${buildTimes[1]}"
|
|
|
|
|
echo "user time for all child processes ${buildTimes[2]}"
|
|
|
|
|
echo "system time for all child processes ${buildTimes[3]}"
|
2008-04-23 07:19:48 +00:00
|
|
|
|
fi
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if (( "$exitCode" != 0 )); then
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook failureHook
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2008-04-23 07:19:48 +00:00
|
|
|
|
# If the builder had a non-zero exit code and
|
|
|
|
|
# $succeedOnFailure is set, create the file
|
2015-08-03 18:03:11 +00:00
|
|
|
|
# ‘$out/nix-support/failed’ to signal failure, and exit
|
2008-04-23 07:19:48 +00:00
|
|
|
|
# normally. Otherwise, return the original exit code.
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -n "${succeedOnFailure:-}" ]; then
|
2008-04-23 07:19:48 +00:00
|
|
|
|
echo "build failed with exit code $exitCode (ignored)"
|
2012-01-18 20:16:00 +00:00
|
|
|
|
mkdir -p "$out/nix-support"
|
2017-07-16 16:10:52 +00:00
|
|
|
|
printf "%s" "$exitCode" > "$out/nix-support/failed"
|
2022-11-12 18:25:14 +00:00
|
|
|
|
exit 0
|
2008-04-23 07:19:48 +00:00
|
|
|
|
fi
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2008-04-23 07:19:48 +00:00
|
|
|
|
else
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook exitHook
|
2008-04-23 07:19:48 +00:00
|
|
|
|
fi
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2022-02-20 15:27:24 +00:00
|
|
|
|
return "$exitCode"
|
2008-04-23 07:19:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trap "exitHandler" EXIT
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
######################################################################
|
2014-07-01 14:17:23 +00:00
|
|
|
|
# Helper functions.
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2007-11-17 14:34:27 +00:00
|
|
|
|
|
|
|
|
|
addToSearchPathWithCustomDelimiter() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local delimiter="$1"
|
|
|
|
|
local varName="$2"
|
|
|
|
|
local dir="$3"
|
2021-03-13 18:58:21 +00:00
|
|
|
|
if [[ -d "$dir" && "${!varName:+${delimiter}${!varName}${delimiter}}" \
|
|
|
|
|
!= *"${delimiter}${dir}${delimiter}"* ]]; then
|
2017-08-09 05:20:56 +00:00
|
|
|
|
export "${varName}=${!varName:+${!varName}${delimiter}}${dir}"
|
2007-11-17 14:34:49 +00:00
|
|
|
|
fi
|
2007-11-17 14:34:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
2008-04-23 07:19:48 +00:00
|
|
|
|
addToSearchPath() {
|
2019-03-03 01:02:45 +00:00
|
|
|
|
addToSearchPathWithCustomDelimiter ":" "$@"
|
2007-11-17 14:34:27 +00:00
|
|
|
|
}
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
# Prepend elements to variable "$1", which may come from an attr.
|
|
|
|
|
#
|
|
|
|
|
# This is useful in generic setup code, which must (for now) support
|
|
|
|
|
# both derivations with and without __structuredAttrs true, so the
|
|
|
|
|
# variable may be an array or a space-separated string.
|
|
|
|
|
#
|
|
|
|
|
# Expressions for individual packages should simply switch to array
|
|
|
|
|
# syntax when they switch to setting __structuredAttrs = true.
|
|
|
|
|
prependToVar() {
|
2022-12-09 23:09:40 +00:00
|
|
|
|
local -n nameref="$1"
|
2023-01-18 02:55:26 +00:00
|
|
|
|
local useArray type
|
2022-12-09 23:09:40 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
if [ -n "$__structuredAttrs" ]; then
|
2022-12-09 23:09:40 +00:00
|
|
|
|
useArray=true
|
|
|
|
|
else
|
|
|
|
|
useArray=false
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# check if variable already exist and if it does then do extra checks
|
2024-06-09 12:05:47 +00:00
|
|
|
|
if type=$(declare -p "$1" 2> /dev/null); then
|
|
|
|
|
case "${type#* }" in
|
|
|
|
|
-A*)
|
|
|
|
|
echo "prependToVar(): ERROR: trying to use prependToVar on an associative array." >&2
|
|
|
|
|
return 1 ;;
|
|
|
|
|
-a*)
|
|
|
|
|
useArray=true ;;
|
|
|
|
|
*)
|
|
|
|
|
useArray=false ;;
|
|
|
|
|
esac
|
2022-12-09 23:09:40 +00:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
if $useArray; then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
nameref=( "$@" ${nameref+"${nameref[@]}"} )
|
|
|
|
|
else
|
|
|
|
|
nameref="$* ${nameref-}"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Same as above
|
|
|
|
|
appendToVar() {
|
2022-12-09 23:09:40 +00:00
|
|
|
|
local -n nameref="$1"
|
2023-01-18 02:55:26 +00:00
|
|
|
|
local useArray type
|
2022-12-09 23:09:40 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
if [ -n "$__structuredAttrs" ]; then
|
2022-12-09 23:09:40 +00:00
|
|
|
|
useArray=true
|
|
|
|
|
else
|
|
|
|
|
useArray=false
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# check if variable already exist and if it does then do extra checks
|
2024-06-09 12:05:47 +00:00
|
|
|
|
if type=$(declare -p "$1" 2> /dev/null); then
|
|
|
|
|
case "${type#* }" in
|
|
|
|
|
-A*)
|
|
|
|
|
echo "appendToVar(): ERROR: trying to use appendToVar on an associative array, use variable+=([\"X\"]=\"Y\") instead." >&2
|
|
|
|
|
return 1 ;;
|
|
|
|
|
-a*)
|
|
|
|
|
useArray=true ;;
|
|
|
|
|
*)
|
|
|
|
|
useArray=false ;;
|
|
|
|
|
esac
|
2022-12-09 23:09:40 +00:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
if $useArray; then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
nameref=( ${nameref+"${nameref[@]}"} "$@" )
|
|
|
|
|
else
|
|
|
|
|
nameref="${nameref-} $*"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-09 10:24:21 +00:00
|
|
|
|
# Accumulate flags from the named variables $2+ into the indexed array $1.
|
2022-05-31 21:34:59 +00:00
|
|
|
|
#
|
2024-06-09 12:06:28 +00:00
|
|
|
|
# Arrays are simply concatenated, strings are split on whitespace.
|
2024-06-09 10:24:21 +00:00
|
|
|
|
concatTo() {
|
|
|
|
|
local -n targetref="$1"; shift
|
2024-06-09 12:06:28 +00:00
|
|
|
|
local name type
|
|
|
|
|
for name in "$@"; do
|
|
|
|
|
if type=$(declare -p "$name" 2> /dev/null); then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
local -n nameref="$name"
|
2024-06-09 12:06:28 +00:00
|
|
|
|
case "${type#* }" in
|
|
|
|
|
-A*)
|
2024-06-09 10:24:21 +00:00
|
|
|
|
echo "concatTo(): ERROR: trying to use concatTo on an associative array." >&2
|
2024-06-09 12:06:28 +00:00
|
|
|
|
return 1 ;;
|
|
|
|
|
-a*)
|
2024-06-09 10:24:21 +00:00
|
|
|
|
targetref+=( "${nameref[@]}" ) ;;
|
2022-05-31 21:34:59 +00:00
|
|
|
|
*)
|
2024-07-14 16:17:55 +00:00
|
|
|
|
# shellcheck disable=SC2206
|
2024-06-09 10:24:21 +00:00
|
|
|
|
targetref+=( ${nameref-} ) ;;
|
2022-05-31 21:34:59 +00:00
|
|
|
|
esac
|
2024-06-09 12:06:28 +00:00
|
|
|
|
fi
|
|
|
|
|
done
|
2022-05-31 21:34:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-25 13:30:46 +00:00
|
|
|
|
# Add $1/lib* into rpaths.
|
|
|
|
|
# The function is used in multiple-outputs.sh hook,
|
|
|
|
|
# so it is defined here but tried after the hook.
|
|
|
|
|
_addRpathPrefix() {
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ "${NIX_NO_SELF_RPATH:-0}" != 1 ]; then
|
2019-10-29 23:43:34 +00:00
|
|
|
|
export NIX_LDFLAGS="-rpath $1/lib ${NIX_LDFLAGS-}"
|
2014-08-25 13:30:46 +00:00
|
|
|
|
fi
|
|
|
|
|
}
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2016-02-18 21:52:44 +00:00
|
|
|
|
# Return success if the specified file is an ELF object.
|
|
|
|
|
isELF() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local fn="$1"
|
2017-06-30 00:28:27 +00:00
|
|
|
|
local fd
|
2016-02-18 21:52:44 +00:00
|
|
|
|
local magic
|
|
|
|
|
exec {fd}< "$fn"
|
2017-07-16 16:10:52 +00:00
|
|
|
|
read -r -n 4 -u "$fd" magic
|
2016-02-18 21:52:44 +00:00
|
|
|
|
exec {fd}<&-
|
2018-09-23 18:32:19 +00:00
|
|
|
|
if [ "$magic" = $'\177ELF' ]; then return 0; else return 1; fi
|
2016-02-18 21:52:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-09-18 03:09:06 +00:00
|
|
|
|
# Return success if the specified file is a Mach-O object.
|
|
|
|
|
isMachO() {
|
|
|
|
|
local fn="$1"
|
|
|
|
|
local fd
|
|
|
|
|
local magic
|
|
|
|
|
exec {fd}< "$fn"
|
|
|
|
|
read -r -n 4 -u "$fd" magic
|
|
|
|
|
exec {fd}<&-
|
|
|
|
|
|
|
|
|
|
# nix uses 'declare -F' in get-env.sh to retrieve the loaded functions.
|
|
|
|
|
# If we use the $'string' syntax instead of 'echo -ne' then 'declare' will print the raw characters and break nix.
|
|
|
|
|
# See https://github.com/NixOS/nixpkgs/pull/138334 and https://github.com/NixOS/nix/issues/5262.
|
|
|
|
|
|
|
|
|
|
# https://opensource.apple.com/source/lldb/lldb-310.2.36/examples/python/mach_o.py.auto.html
|
|
|
|
|
if [[ "$magic" = $(echo -ne "\xfe\xed\xfa\xcf") || "$magic" = $(echo -ne "\xcf\xfa\xed\xfe") ]]; then
|
|
|
|
|
# MH_MAGIC_64 || MH_CIGAM_64
|
|
|
|
|
return 0;
|
|
|
|
|
elif [[ "$magic" = $(echo -ne "\xfe\xed\xfa\xce") || "$magic" = $(echo -ne "\xce\xfa\xed\xfe") ]]; then
|
|
|
|
|
# MH_MAGIC || MH_CIGAM
|
|
|
|
|
return 0;
|
|
|
|
|
elif [[ "$magic" = $(echo -ne "\xca\xfe\xba\xbe") || "$magic" = $(echo -ne "\xbe\xba\xfe\xca") ]]; then
|
|
|
|
|
# FAT_MAGIC || FAT_CIGAM
|
|
|
|
|
return 0;
|
|
|
|
|
else
|
|
|
|
|
return 1;
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-04 18:06:40 +00:00
|
|
|
|
# Return success if the specified file is a script (i.e. starts with
|
|
|
|
|
# "#!").
|
|
|
|
|
isScript() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local fn="$1"
|
2017-06-30 00:28:27 +00:00
|
|
|
|
local fd
|
2017-05-04 18:06:40 +00:00
|
|
|
|
local magic
|
|
|
|
|
exec {fd}< "$fn"
|
2017-07-16 16:10:52 +00:00
|
|
|
|
read -r -n 2 -u "$fd" magic
|
2017-05-04 18:06:40 +00:00
|
|
|
|
exec {fd}<&-
|
2017-07-16 16:10:52 +00:00
|
|
|
|
if [[ "$magic" =~ \#! ]]; then return 0; else return 1; fi
|
2017-05-04 18:06:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-07-10 15:59:14 +00:00
|
|
|
|
# printf unfortunately will print a trailing newline regardless
|
|
|
|
|
printLines() {
|
2017-11-17 18:26:21 +00:00
|
|
|
|
(( "$#" > 0 )) || return 0
|
2017-07-10 15:59:14 +00:00
|
|
|
|
printf '%s\n' "$@"
|
|
|
|
|
}
|
2016-02-18 21:52:44 +00:00
|
|
|
|
|
2017-07-25 22:48:47 +00:00
|
|
|
|
printWords() {
|
2017-11-17 18:26:21 +00:00
|
|
|
|
(( "$#" > 0 )) || return 0
|
2017-07-25 22:48:47 +00:00
|
|
|
|
printf '%s ' "$@"
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-01 14:17:23 +00:00
|
|
|
|
######################################################################
|
|
|
|
|
# Initialisation.
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2022-12-13 17:12:04 +00:00
|
|
|
|
# If using structured attributes, export variables from `env` to the environment.
|
|
|
|
|
# When not using structured attributes, those variables are already exported.
|
|
|
|
|
if [[ -n $__structuredAttrs ]]; then
|
|
|
|
|
for envVar in "${!env[@]}"; do
|
|
|
|
|
declare -x "${envVar}=${env[${envVar}]}"
|
|
|
|
|
done
|
|
|
|
|
fi
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2020-06-08 10:52:58 +00:00
|
|
|
|
# Set a fallback default value for SOURCE_DATE_EPOCH, used by some build tools
|
|
|
|
|
# to provide a deterministic substitute for the "current" time. Note that
|
|
|
|
|
# 315532800 = 1980-01-01 12:00:00. We use this date because python's wheel
|
|
|
|
|
# implementation uses zip archive and zip does not support dates going back to
|
|
|
|
|
# 1970.
|
2015-12-03 10:49:32 +00:00
|
|
|
|
export SOURCE_DATE_EPOCH
|
2023-01-15 22:36:31 +00:00
|
|
|
|
: "${SOURCE_DATE_EPOCH:=315532800}"
|
2015-12-03 10:49:32 +00:00
|
|
|
|
|
|
|
|
|
|
2009-04-18 22:22:51 +00:00
|
|
|
|
# Wildcard expansions that don't match should expand to an empty list.
|
|
|
|
|
# This ensures that, for instance, "for i in *; do ...; done" does the
|
|
|
|
|
# right thing.
|
|
|
|
|
shopt -s nullglob
|
|
|
|
|
|
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
# Set up the initial path.
|
|
|
|
|
PATH=
|
2018-11-14 18:41:50 +00:00
|
|
|
|
HOST_PATH=
|
2014-07-01 15:39:07 +00:00
|
|
|
|
for i in $initialPath; do
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ "$i" = / ]; then i=; fi
|
2017-07-16 16:10:52 +00:00
|
|
|
|
addToSearchPath PATH "$i/bin"
|
2018-11-14 18:41:50 +00:00
|
|
|
|
|
|
|
|
|
# For backward compatibility, we add initial path to HOST_PATH so
|
|
|
|
|
# it can be used in auto patch-shebangs. Unfortunately this will
|
|
|
|
|
# not work with cross compilation.
|
|
|
|
|
if [ -z "${strictDeps-}" ]; then
|
|
|
|
|
addToSearchPath HOST_PATH "$i/bin"
|
|
|
|
|
fi
|
2006-08-07 13:31:18 +00:00
|
|
|
|
done
|
|
|
|
|
|
2019-09-26 22:47:38 +00:00
|
|
|
|
unset i
|
|
|
|
|
|
2017-09-19 23:10:49 +00:00
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
2008-02-20 23:02:41 +00:00
|
|
|
|
echo "initial path: $PATH"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Check that the pre-hook initialised SHELL.
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -z "${SHELL:-}" ]; then echo "SHELL not set"; exit 1; fi
|
2017-07-16 16:10:52 +00:00
|
|
|
|
BASH="$SHELL"
|
|
|
|
|
export CONFIG_SHELL="$SHELL"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2016-05-25 17:36:50 +00:00
|
|
|
|
|
2014-07-01 15:39:07 +00:00
|
|
|
|
# Execute the pre-hook.
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -z "${shell:-}" ]; then export shell="$SHELL"; fi
|
2014-11-06 10:26:09 +00:00
|
|
|
|
runHook preHook
|
2014-07-01 15:39:07 +00:00
|
|
|
|
|
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
# Allow the caller to augment buildInputs (it's not always possible to
|
|
|
|
|
# do this before the call to setup.sh, since the PATH is empty at that
|
|
|
|
|
# point; here we have a basic Unix environment).
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook addInputsHook
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
# Package accumulators
|
|
|
|
|
|
|
|
|
|
declare -a pkgsBuildBuild pkgsBuildHost pkgsBuildTarget
|
|
|
|
|
declare -a pkgsHostHost pkgsHostTarget
|
|
|
|
|
declare -a pkgsTargetTarget
|
|
|
|
|
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a pkgBuildAccumVars=(pkgsBuildBuild pkgsBuildHost pkgsBuildTarget)
|
|
|
|
|
declare -a pkgHostAccumVars=(pkgsHostHost pkgsHostTarget)
|
|
|
|
|
declare -a pkgTargetAccumVars=(pkgsTargetTarget)
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a pkgAccumVarVars=(pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars)
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Hooks
|
|
|
|
|
|
|
|
|
|
declare -a envBuildBuildHooks envBuildHostHooks envBuildTargetHooks
|
|
|
|
|
declare -a envHostHostHooks envHostTargetHooks
|
|
|
|
|
declare -a envTargetTargetHooks
|
|
|
|
|
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a pkgBuildHookVars=(envBuildBuildHook envBuildHostHook envBuildTargetHook)
|
|
|
|
|
declare -a pkgHostHookVars=(envHostHostHook envHostTargetHook)
|
|
|
|
|
declare -a pkgTargetHookVars=(envTargetTargetHook)
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a pkgHookVarVars=(pkgBuildHookVars pkgHostHookVars pkgTargetHookVars)
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
2021-07-19 05:55:56 +00:00
|
|
|
|
# those variables are declared here, since where and if they are used varies
|
|
|
|
|
declare -a preFixupHooks fixupOutputHooks preConfigureHooks postFixupHooks postUnpackHooks unpackCmdHooks
|
|
|
|
|
|
2017-08-03 16:45:06 +00:00
|
|
|
|
# Add env hooks for all sorts of deps with the specified host offset.
|
|
|
|
|
addEnvHooks() {
|
|
|
|
|
local depHostOffset="$1"
|
|
|
|
|
shift
|
|
|
|
|
local pkgHookVarsSlice="${pkgHookVarVars[$depHostOffset + 1]}[@]"
|
|
|
|
|
local pkgHookVar
|
|
|
|
|
for pkgHookVar in "${!pkgHookVarsSlice}"; do
|
|
|
|
|
eval "${pkgHookVar}s"'+=("$@")'
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
# Propagated dep files
|
|
|
|
|
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a propagatedBuildDepFiles=(
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
propagated-build-build-deps
|
|
|
|
|
propagated-native-build-inputs # Legacy name for back-compat
|
|
|
|
|
propagated-build-target-deps
|
|
|
|
|
)
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a propagatedHostDepFiles=(
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
propagated-host-host-deps
|
|
|
|
|
propagated-build-inputs # Legacy name for back-compat
|
|
|
|
|
)
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a propagatedTargetDepFiles=(
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
propagated-target-target-deps
|
|
|
|
|
)
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a propagatedDepFilesVars=(
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
propagatedBuildDepFiles
|
|
|
|
|
propagatedHostDepFiles
|
|
|
|
|
propagatedTargetDepFiles
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Platform offsets: build = -1, host = 0, target = 1
|
2019-09-26 22:47:38 +00:00
|
|
|
|
declare -a allPlatOffsets=(-1 0 1)
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Mutually-recursively find all build inputs. See the dependency section of the
|
|
|
|
|
# stdenv chapter of the Nixpkgs manual for the specification this algorithm
|
|
|
|
|
# implements.
|
2008-04-23 07:19:48 +00:00
|
|
|
|
findInputs() {
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
local -r pkg="$1"
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local -r hostOffset="$2"
|
|
|
|
|
local -r targetOffset="$3"
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
# Sanity check
|
2023-01-16 21:03:21 +00:00
|
|
|
|
(( hostOffset <= targetOffset )) || exit 1
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
2024-07-14 16:17:55 +00:00
|
|
|
|
# shellcheck disable=SC1087
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local varVar="${pkgAccumVarVars[hostOffset + 1]}"
|
2024-07-14 16:17:55 +00:00
|
|
|
|
# shellcheck disable=SC1087
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local varRef="$varVar[$((targetOffset - hostOffset))]"
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
local var="${!varRef}"
|
|
|
|
|
unset -v varVar varRef
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2017-07-25 21:48:50 +00:00
|
|
|
|
# TODO(@Ericson2314): Restore using associative array once Darwin
|
|
|
|
|
# nix-shell doesn't use impure bash. This should replace the O(n)
|
|
|
|
|
# case with an O(1) hash map lookup, assuming bash is implemented
|
|
|
|
|
# well :D.
|
2024-07-14 16:17:55 +00:00
|
|
|
|
# shellcheck disable=SC1087
|
2017-08-09 05:20:56 +00:00
|
|
|
|
local varSlice="$var[*]"
|
|
|
|
|
# ${..-} to hack around old bash empty array problem
|
|
|
|
|
case "${!varSlice-}" in
|
2017-07-25 21:48:50 +00:00
|
|
|
|
*" $pkg "*) return 0 ;;
|
|
|
|
|
esac
|
2017-08-09 05:20:56 +00:00
|
|
|
|
unset -v varSlice
|
2017-07-25 21:48:50 +00:00
|
|
|
|
|
2017-07-26 00:58:47 +00:00
|
|
|
|
eval "$var"'+=("$pkg")'
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2015-06-15 09:24:55 +00:00
|
|
|
|
if ! [ -e "$pkg" ]; then
|
|
|
|
|
echo "build input $pkg does not exist" >&2
|
|
|
|
|
exit 1
|
2014-06-25 15:01:29 +00:00
|
|
|
|
fi
|
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
# The current package's host and target offset together
|
|
|
|
|
# provide a <=-preserving homomorphism from the relative
|
|
|
|
|
# offsets to current offset
|
|
|
|
|
function mapOffset() {
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local -r inputOffset="$1"
|
2021-10-01 12:44:55 +00:00
|
|
|
|
local -n outputOffset="$2"
|
2021-08-17 14:02:11 +00:00
|
|
|
|
if (( inputOffset <= 0 )); then
|
2021-10-01 12:44:55 +00:00
|
|
|
|
outputOffset=$((inputOffset + hostOffset))
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
else
|
2021-10-01 12:44:55 +00:00
|
|
|
|
outputOffset=$((inputOffset - 1 + targetOffset))
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Host offset relative to that of the package whose immediate
|
|
|
|
|
# dependencies we are currently exploring.
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local relHostOffset
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
for relHostOffset in "${allPlatOffsets[@]}"; do
|
|
|
|
|
# `+ 1` so we start at 0 for valid index
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local files="${propagatedDepFilesVars[relHostOffset + 1]}"
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
# Host offset relative to the package currently being
|
|
|
|
|
# built---as absolute an offset as will be used.
|
2021-10-01 12:44:55 +00:00
|
|
|
|
local hostOffsetNext
|
|
|
|
|
mapOffset "$relHostOffset" hostOffsetNext
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
# Ensure we're in bounds relative to the package currently
|
|
|
|
|
# being built.
|
2021-10-01 12:44:55 +00:00
|
|
|
|
(( -1 <= hostOffsetNext && hostOffsetNext <= 1 )) || continue
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
# Target offset relative to the *host* offset of the package
|
|
|
|
|
# whose immediate dependencies we are currently exploring.
|
2021-10-01 12:44:55 +00:00
|
|
|
|
local relTargetOffset
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
for relTargetOffset in "${allPlatOffsets[@]}"; do
|
|
|
|
|
(( "$relHostOffset" <= "$relTargetOffset" )) || continue
|
|
|
|
|
|
|
|
|
|
local fileRef="${files}[$relTargetOffset - $relHostOffset]"
|
|
|
|
|
local file="${!fileRef}"
|
|
|
|
|
unset -v fileRef
|
|
|
|
|
|
|
|
|
|
# Target offset relative to the package currently being
|
|
|
|
|
# built.
|
2021-10-01 12:44:55 +00:00
|
|
|
|
local targetOffsetNext
|
|
|
|
|
mapOffset "$relTargetOffset" targetOffsetNext
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
# Once again, ensure we're in bounds relative to the
|
|
|
|
|
# package currently being built.
|
2021-10-01 12:44:55 +00:00
|
|
|
|
(( -1 <= hostOffsetNext && hostOffsetNext <= 1 )) || continue
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
[[ -f "$pkg/nix-support/$file" ]] || continue
|
|
|
|
|
|
|
|
|
|
local pkgNext
|
2019-09-19 15:43:35 +00:00
|
|
|
|
read -r -d '' pkgNext < "$pkg/nix-support/$file" || true
|
|
|
|
|
for pkgNext in $pkgNext; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkgNext" "$hostOffsetNext" "$targetOffsetNext"
|
|
|
|
|
done
|
2017-11-08 18:43:28 +00:00
|
|
|
|
done
|
2017-11-17 18:26:21 +00:00
|
|
|
|
done
|
2017-11-08 18:43:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
# The way we handle deps* and *Inputs works with structured attrs
|
|
|
|
|
# either enabled or disabled. For this it's convenient that the items
|
|
|
|
|
# in each list must be store paths, and therefore space-free.
|
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
# Make sure all are at least defined as empty
|
2023-01-15 22:36:31 +00:00
|
|
|
|
: "${depsBuildBuild=}" "${depsBuildBuildPropagated=}"
|
|
|
|
|
: "${nativeBuildInputs=}" "${propagatedNativeBuildInputs=}" "${defaultNativeBuildInputs=}"
|
|
|
|
|
: "${depsBuildTarget=}" "${depsBuildTargetPropagated=}"
|
|
|
|
|
: "${depsHostHost=}" "${depsHostHostPropagated=}"
|
|
|
|
|
: "${buildInputs=}" "${propagatedBuildInputs=}" "${defaultBuildInputs=}"
|
|
|
|
|
: "${depsTargetTarget=}" "${depsTargetTargetPropagated=}"
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${depsBuildBuild[@]} ${depsBuildBuildPropagated[@]}; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" -1 -1
|
|
|
|
|
done
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${nativeBuildInputs[@]} ${propagatedNativeBuildInputs[@]}; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" -1 0
|
|
|
|
|
done
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${depsBuildTarget[@]} ${depsBuildTargetPropagated[@]}; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" -1 1
|
|
|
|
|
done
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${depsHostHost[@]} ${depsHostHostPropagated[@]}; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" 0 0
|
|
|
|
|
done
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${buildInputs[@]} ${propagatedBuildInputs[@]} ; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" 0 1
|
|
|
|
|
done
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${depsTargetTarget[@]} ${depsTargetTargetPropagated[@]}; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" 1 1
|
|
|
|
|
done
|
|
|
|
|
# Default inputs must be processed last
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${defaultNativeBuildInputs[@]}; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" -1 0
|
|
|
|
|
done
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for pkg in ${defaultBuildInputs[@]}; do
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
findInputs "$pkg" 0 1
|
|
|
|
|
done
|
|
|
|
|
|
2017-11-08 18:43:28 +00:00
|
|
|
|
# Add package to the future PATH and run setup hooks
|
|
|
|
|
activatePackage() {
|
|
|
|
|
local pkg="$1"
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local -r hostOffset="$2"
|
|
|
|
|
local -r targetOffset="$3"
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
|
|
|
|
|
# Sanity check
|
2023-01-16 21:03:21 +00:00
|
|
|
|
(( hostOffset <= targetOffset )) || exit 1
|
2017-11-08 18:43:28 +00:00
|
|
|
|
|
2015-06-15 09:24:55 +00:00
|
|
|
|
if [ -f "$pkg" ]; then
|
2024-05-22 22:28:31 +00:00
|
|
|
|
nixLog "sourcing setup hook '$pkg'"
|
2015-06-15 09:24:55 +00:00
|
|
|
|
source "$pkg"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
2007-11-17 14:34:27 +00:00
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
# Only dependencies whose host platform is guaranteed to match the
|
|
|
|
|
# build platform are included here. That would be `depsBuild*`,
|
2017-08-28 15:33:08 +00:00
|
|
|
|
# and legacy `nativeBuildInputs`, in general. If we aren't cross
|
|
|
|
|
# compiling, however, everything can be put on the PATH. To ease
|
2021-07-19 05:49:47 +00:00
|
|
|
|
# the transition, we do include everything in that case.
|
2017-08-28 15:33:08 +00:00
|
|
|
|
#
|
|
|
|
|
# TODO(@Ericson2314): Don't special-case native compilation
|
2020-11-11 15:26:06 +00:00
|
|
|
|
if [[ -z "${strictDeps-}" || "$hostOffset" -le -1 ]]; then
|
2017-07-11 20:04:14 +00:00
|
|
|
|
addToSearchPath _PATH "$pkg/bin"
|
2020-11-13 00:12:37 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2021-08-17 14:02:11 +00:00
|
|
|
|
if (( hostOffset <= -1 )); then
|
2020-11-11 15:26:06 +00:00
|
|
|
|
addToSearchPath _XDG_DATA_DIRS "$pkg/share"
|
2016-02-28 00:13:15 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2018-07-23 03:07:25 +00:00
|
|
|
|
if [[ "$hostOffset" -eq 0 && -d "$pkg/bin" ]]; then
|
2019-03-03 01:02:45 +00:00
|
|
|
|
addToSearchPath _HOST_PATH "$pkg/bin"
|
2018-07-23 03:07:25 +00:00
|
|
|
|
fi
|
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
if [[ -f "$pkg/nix-support/setup-hook" ]]; then
|
2024-05-22 22:28:31 +00:00
|
|
|
|
nixLog "sourcing setup hook '$pkg/nix-support/setup-hook'"
|
2015-06-15 09:24:55 +00:00
|
|
|
|
source "$pkg/nix-support/setup-hook"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
_activatePkgs() {
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local hostOffset targetOffset
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
local pkg
|
|
|
|
|
|
|
|
|
|
for hostOffset in "${allPlatOffsets[@]}"; do
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local pkgsVar="${pkgAccumVarVars[hostOffset + 1]}"
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
for targetOffset in "${allPlatOffsets[@]}"; do
|
2021-08-17 14:02:11 +00:00
|
|
|
|
(( hostOffset <= targetOffset )) || continue
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
local pkgsRef="${pkgsVar}[$targetOffset - $hostOffset]"
|
|
|
|
|
local pkgsSlice="${!pkgsRef}[@]"
|
|
|
|
|
for pkg in ${!pkgsSlice+"${!pkgsSlice}"}; do
|
|
|
|
|
activatePackage "$pkg" "$hostOffset" "$targetOffset"
|
|
|
|
|
done
|
|
|
|
|
done
|
2017-11-08 18:43:28 +00:00
|
|
|
|
done
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
}
|
2017-11-17 18:26:21 +00:00
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
# Run the package setup hooks and build _PATH
|
|
|
|
|
_activatePkgs
|
2012-01-19 15:56:17 +00:00
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
# Set the relevant environment variables to point to the build inputs
|
|
|
|
|
# found above.
|
2017-07-06 21:19:53 +00:00
|
|
|
|
#
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
# These `depOffset`s, beyond indexing the arrays, also tell the env
|
|
|
|
|
# hook what sort of dependency (ignoring propagatedness) is being
|
|
|
|
|
# passed to the env hook. In a real language, we'd append a closure
|
|
|
|
|
# with this information to the relevant env hook array, but bash
|
|
|
|
|
# doesn't have closures, so it's easier to just pass this in.
|
|
|
|
|
_addToEnv() {
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local depHostOffset depTargetOffset
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
local pkg
|
|
|
|
|
|
|
|
|
|
for depHostOffset in "${allPlatOffsets[@]}"; do
|
2021-08-17 14:02:11 +00:00
|
|
|
|
local hookVar="${pkgHookVarVars[depHostOffset + 1]}"
|
|
|
|
|
local pkgsVar="${pkgAccumVarVars[depHostOffset + 1]}"
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
for depTargetOffset in "${allPlatOffsets[@]}"; do
|
2021-08-17 14:02:11 +00:00
|
|
|
|
(( depHostOffset <= depTargetOffset )) || continue
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
local hookRef="${hookVar}[$depTargetOffset - $depHostOffset]"
|
2018-05-13 15:31:24 +00:00
|
|
|
|
if [[ -z "${strictDeps-}" ]]; then
|
2018-10-31 19:26:54 +00:00
|
|
|
|
|
|
|
|
|
# Keep track of which packages we have visited before.
|
|
|
|
|
local visitedPkgs=""
|
|
|
|
|
|
2017-08-28 15:33:08 +00:00
|
|
|
|
# Apply environment hooks to all packages during native
|
|
|
|
|
# compilation to ease the transition.
|
|
|
|
|
#
|
|
|
|
|
# TODO(@Ericson2314): Don't special-case native compilation
|
|
|
|
|
for pkg in \
|
2021-07-19 03:11:05 +00:00
|
|
|
|
"${pkgsBuildBuild[@]}" \
|
|
|
|
|
"${pkgsBuildHost[@]}" \
|
|
|
|
|
"${pkgsBuildTarget[@]}" \
|
|
|
|
|
"${pkgsHostHost[@]}" \
|
|
|
|
|
"${pkgsHostTarget[@]}" \
|
|
|
|
|
"${pkgsTargetTarget[@]}"
|
2017-08-28 15:33:08 +00:00
|
|
|
|
do
|
2018-10-31 19:26:54 +00:00
|
|
|
|
if [[ "$visitedPkgs" = *"$pkg"* ]]; then
|
|
|
|
|
continue
|
|
|
|
|
fi
|
2017-08-28 15:33:08 +00:00
|
|
|
|
runHook "${!hookRef}" "$pkg"
|
2018-10-31 19:26:54 +00:00
|
|
|
|
visitedPkgs+=" $pkg"
|
2017-08-28 15:33:08 +00:00
|
|
|
|
done
|
|
|
|
|
else
|
|
|
|
|
local pkgsRef="${pkgsVar}[$depTargetOffset - $depHostOffset]"
|
|
|
|
|
local pkgsSlice="${!pkgsRef}[@]"
|
|
|
|
|
for pkg in ${!pkgsSlice+"${!pkgsSlice}"}; do
|
|
|
|
|
runHook "${!hookRef}" "$pkg"
|
|
|
|
|
done
|
|
|
|
|
fi
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
done
|
|
|
|
|
done
|
2009-11-18 18:16:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
# Run the package-specific hooks set by the setup-hook scripts.
|
|
|
|
|
_addToEnv
|
2009-11-18 18:16:35 +00:00
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2019-09-26 22:47:38 +00:00
|
|
|
|
# Unset setup-specific declared variables
|
|
|
|
|
unset allPlatOffsets
|
|
|
|
|
unset pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars pkgAccumVarVars
|
|
|
|
|
unset pkgBuildHookVars pkgHostHookVars pkgTargetHookVars pkgHookVarVars
|
2019-11-05 21:30:40 +00:00
|
|
|
|
unset propagatedDepFilesVars
|
2019-09-26 22:47:38 +00:00
|
|
|
|
|
|
|
|
|
|
2014-08-24 17:05:56 +00:00
|
|
|
|
_addRpathPrefix "$out"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Set the TZ (timezone) environment variable, otherwise commands like
|
|
|
|
|
# `date' will complain (e.g., `Tue Mar 9 10:01:47 Local time zone must
|
|
|
|
|
# be set--see zic manual page 2004').
|
|
|
|
|
export TZ=UTC
|
|
|
|
|
|
|
|
|
|
|
2006-12-28 21:12:44 +00:00
|
|
|
|
# Set the prefix. This is generally $out, but it can be overriden,
|
|
|
|
|
# for instance if we just want to perform a test build/install to a
|
|
|
|
|
# temporary location and write a build report to $out.
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -z "${prefix:-}" ]; then
|
2017-07-16 16:10:52 +00:00
|
|
|
|
prefix="$out";
|
2006-12-28 21:12:44 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ "${useTempPrefix:-}" = 1 ]; then
|
2006-12-28 21:12:44 +00:00
|
|
|
|
prefix="$NIX_BUILD_TOP/tmp_prefix";
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
PATH="${_PATH-}${_PATH:+${PATH:+:}}$PATH"
|
2019-03-03 01:02:45 +00:00
|
|
|
|
HOST_PATH="${_HOST_PATH-}${_HOST_PATH:+${HOST_PATH:+:}}$HOST_PATH"
|
2020-11-13 00:17:35 +00:00
|
|
|
|
export XDG_DATA_DIRS="${_XDG_DATA_DIRS-}${_XDG_DATA_DIRS:+${XDG_DATA_DIRS:+:}}${XDG_DATA_DIRS-}"
|
2017-09-19 23:10:49 +00:00
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
2008-02-20 23:02:41 +00:00
|
|
|
|
echo "final path: $PATH"
|
2019-03-03 01:02:45 +00:00
|
|
|
|
echo "final host path: $HOST_PATH"
|
2020-11-11 15:26:06 +00:00
|
|
|
|
echo "final data dirs: $XDG_DATA_DIRS"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2019-03-03 01:02:45 +00:00
|
|
|
|
unset _PATH
|
|
|
|
|
unset _HOST_PATH
|
2020-11-11 15:26:06 +00:00
|
|
|
|
unset _XDG_DATA_DIRS
|
2019-03-03 01:02:45 +00:00
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2010-06-23 14:34:59 +00:00
|
|
|
|
# Normalize the NIX_BUILD_CORES variable. The value might be 0, which
|
|
|
|
|
# means that we're supposed to try and auto-detect the number of
|
|
|
|
|
# available CPU cores at run-time.
|
|
|
|
|
|
2021-09-06 03:13:43 +00:00
|
|
|
|
NIX_BUILD_CORES="${NIX_BUILD_CORES:-1}"
|
|
|
|
|
if ((NIX_BUILD_CORES <= 0)); then
|
|
|
|
|
guess=$(nproc 2>/dev/null || true)
|
|
|
|
|
((NIX_BUILD_CORES = guess <= 0 ? 1 : guess))
|
2010-06-23 14:34:59 +00:00
|
|
|
|
fi
|
|
|
|
|
export NIX_BUILD_CORES
|
|
|
|
|
|
|
|
|
|
|
2019-05-09 06:42:07 +00:00
|
|
|
|
# Prevent SSL libraries from using certificates in /etc/ssl, unless set explicitly.
|
2019-05-09 07:49:42 +00:00
|
|
|
|
# Leave it in impure shells for convenience.
|
2021-08-19 14:23:58 +00:00
|
|
|
|
if [[ -z "${NIX_SSL_CERT_FILE:-}" && "${IN_NIX_SHELL:-}" != "impure" ]]; then
|
2019-05-09 06:42:07 +00:00
|
|
|
|
export NIX_SSL_CERT_FILE=/no-cert-file.crt
|
|
|
|
|
fi
|
|
|
|
|
# Another variant left for compatibility.
|
2021-08-19 14:23:58 +00:00
|
|
|
|
if [[ -z "${SSL_CERT_FILE:-}" && "${IN_NIX_SHELL:-}" != "impure" ]]; then
|
2016-02-25 10:53:03 +00:00
|
|
|
|
export SSL_CERT_FILE=/no-cert-file.crt
|
|
|
|
|
fi
|
2016-02-03 12:59:10 +00:00
|
|
|
|
|
|
|
|
|
|
2006-12-27 18:14:57 +00:00
|
|
|
|
######################################################################
|
|
|
|
|
# Textual substitution functions.
|
|
|
|
|
|
2023-10-12 21:43:03 +00:00
|
|
|
|
# only log once, due to max logging limit on hydra
|
2024-02-11 00:48:37 +00:00
|
|
|
|
_substituteStream_has_warned_replace_deprecation=false
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2018-05-06 19:58:03 +00:00
|
|
|
|
substituteStream() {
|
|
|
|
|
local var=$1
|
2018-02-23 13:12:53 +00:00
|
|
|
|
local description=$2
|
|
|
|
|
shift 2
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2017-07-12 15:56:43 +00:00
|
|
|
|
while (( "$#" )); do
|
2024-02-11 00:48:37 +00:00
|
|
|
|
local replace_mode="$1"
|
2017-07-12 15:56:43 +00:00
|
|
|
|
case "$1" in
|
|
|
|
|
--replace)
|
2023-10-12 21:43:03 +00:00
|
|
|
|
# deprecated 2023-11-22
|
|
|
|
|
# this will either get removed, or switch to the behaviour of --replace-fail in the future
|
2024-02-11 00:48:37 +00:00
|
|
|
|
if ! "$_substituteStream_has_warned_replace_deprecation"; then
|
2024-05-25 10:32:15 +00:00
|
|
|
|
echo "substituteStream() in derivation $name: WARNING: '--replace' is deprecated, use --replace-{fail,warn,quiet}. ($description)" >&2
|
2024-02-11 00:48:37 +00:00
|
|
|
|
_substituteStream_has_warned_replace_deprecation=true
|
2023-10-12 21:43:03 +00:00
|
|
|
|
fi
|
2024-02-11 00:48:37 +00:00
|
|
|
|
replace_mode='--replace-warn'
|
2023-10-12 21:43:03 +00:00
|
|
|
|
;&
|
2024-02-11 00:48:37 +00:00
|
|
|
|
--replace-quiet|--replace-warn|--replace-fail)
|
2017-07-16 16:10:52 +00:00
|
|
|
|
pattern="$2"
|
|
|
|
|
replacement="$3"
|
2017-07-12 15:56:43 +00:00
|
|
|
|
shift 3
|
2018-02-23 13:12:53 +00:00
|
|
|
|
local savedvar
|
|
|
|
|
savedvar="${!var}"
|
|
|
|
|
eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}'
|
|
|
|
|
if [ "$pattern" != "$replacement" ]; then
|
|
|
|
|
if [ "${!var}" == "$savedvar" ]; then
|
2024-02-11 00:48:37 +00:00
|
|
|
|
if [ "$replace_mode" == --replace-warn ]; then
|
2024-05-25 10:32:15 +00:00
|
|
|
|
printf "substituteStream() in derivation $name: WARNING: pattern %q doesn't match anything in %s\n" "$pattern" "$description" >&2
|
2024-02-11 00:48:37 +00:00
|
|
|
|
elif [ "$replace_mode" == --replace-fail ]; then
|
2024-05-25 10:32:15 +00:00
|
|
|
|
printf "substituteStream() in derivation $name: ERROR: pattern %q doesn't match anything in %s\n" "$pattern" "$description" >&2
|
2023-10-12 21:43:03 +00:00
|
|
|
|
return 1
|
|
|
|
|
fi
|
2018-02-23 13:12:53 +00:00
|
|
|
|
fi
|
|
|
|
|
fi
|
2017-07-12 15:56:43 +00:00
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
--subst-var)
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local varName="$2"
|
2017-07-12 15:56:43 +00:00
|
|
|
|
shift 2
|
|
|
|
|
# check if the used nix attribute name is a valid bash name
|
2017-07-16 16:10:52 +00:00
|
|
|
|
if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
|
2024-05-25 10:32:15 +00:00
|
|
|
|
echo "substituteStream() in derivation $name: ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2
|
2017-08-31 14:20:51 +00:00
|
|
|
|
return 1
|
2017-07-12 15:56:43 +00:00
|
|
|
|
fi
|
2018-07-08 15:59:57 +00:00
|
|
|
|
if [ -z ${!varName+x} ]; then
|
2024-05-25 10:32:15 +00:00
|
|
|
|
echo "substituteStream() in derivation $name: ERROR: variable \$$varName is unset" >&2
|
2018-07-08 15:59:57 +00:00
|
|
|
|
return 1
|
|
|
|
|
fi
|
2017-07-16 16:10:52 +00:00
|
|
|
|
pattern="@$varName@"
|
|
|
|
|
replacement="${!varName}"
|
2018-02-23 13:12:53 +00:00
|
|
|
|
eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}'
|
2017-07-12 15:56:43 +00:00
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
--subst-var-by)
|
2017-07-16 16:10:52 +00:00
|
|
|
|
pattern="@$2@"
|
|
|
|
|
replacement="$3"
|
2018-02-23 13:12:53 +00:00
|
|
|
|
eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}'
|
2017-07-12 15:56:43 +00:00
|
|
|
|
shift 3
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
*)
|
2024-05-25 10:32:15 +00:00
|
|
|
|
echo "substituteStream() in derivation $name: ERROR: Invalid command line argument: $1" >&2
|
2017-07-12 15:56:43 +00:00
|
|
|
|
return 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
2006-12-27 18:14:57 +00:00
|
|
|
|
done
|
|
|
|
|
|
2018-05-06 19:58:03 +00:00
|
|
|
|
printf "%s" "${!var}"
|
2006-12-27 18:14:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-03 02:07:58 +00:00
|
|
|
|
# put the content of a file in a variable
|
|
|
|
|
# fail loudly if provided with a binary (containing null bytes)
|
2018-05-06 19:58:03 +00:00
|
|
|
|
consumeEntire() {
|
|
|
|
|
# read returns non-0 on EOF, so we want read to fail
|
2023-01-15 22:39:25 +00:00
|
|
|
|
if IFS='' read -r -d '' "$1" ; then
|
2018-05-06 19:58:03 +00:00
|
|
|
|
echo "consumeEntire(): ERROR: Input null bytes, won't process" >&2
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
2006-12-27 18:14:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-05-06 19:58:03 +00:00
|
|
|
|
substitute() {
|
|
|
|
|
local input="$1"
|
|
|
|
|
local output="$2"
|
|
|
|
|
shift 2
|
|
|
|
|
|
|
|
|
|
if [ ! -f "$input" ]; then
|
|
|
|
|
echo "substitute(): ERROR: file '$input' does not exist" >&2
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
local content
|
|
|
|
|
consumeEntire content < "$input"
|
|
|
|
|
|
|
|
|
|
if [ -e "$output" ]; then chmod +w "$output"; fi
|
2018-02-23 13:12:53 +00:00
|
|
|
|
substituteStream content "file '$input'" "$@" > "$output"
|
2018-05-06 19:58:03 +00:00
|
|
|
|
}
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
|
|
|
|
substituteInPlace() {
|
2022-06-29 18:04:31 +00:00
|
|
|
|
local -a fileNames=()
|
|
|
|
|
for arg in "$@"; do
|
|
|
|
|
if [[ "$arg" = "--"* ]]; then
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
fileNames+=("$arg")
|
|
|
|
|
shift
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
for file in "${fileNames[@]}"; do
|
|
|
|
|
substitute "$file" "$file" "$@"
|
|
|
|
|
done
|
2006-12-27 18:14:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-05-06 19:58:03 +00:00
|
|
|
|
_allFlags() {
|
2022-12-07 21:49:00 +00:00
|
|
|
|
# export some local variables for the awk below
|
|
|
|
|
# so some substitutions such as name don't have to be in the env attrset
|
|
|
|
|
# when __structuredAttrs is enabled
|
|
|
|
|
export system pname name version
|
2024-07-14 16:17:55 +00:00
|
|
|
|
while IFS='' read -r varName; do
|
2018-05-06 19:58:03 +00:00
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
2023-08-10 11:59:58 +00:00
|
|
|
|
printf "@%s@ -> %q\n" "${varName}" "${!varName}" >&2
|
2018-05-06 19:58:03 +00:00
|
|
|
|
fi
|
|
|
|
|
args+=("--subst-var" "$varName")
|
2024-07-14 16:17:55 +00:00
|
|
|
|
done < <(awk 'BEGIN { for (v in ENVIRON) if (v ~ /^[a-z][a-zA-Z0-9_]*$/) print v }')
|
2018-05-06 19:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
substituteAllStream() {
|
|
|
|
|
local -a args=()
|
|
|
|
|
_allFlags
|
|
|
|
|
|
2018-02-23 13:12:53 +00:00
|
|
|
|
substituteStream "$1" "$2" "${args[@]}"
|
2018-05-06 19:58:03 +00:00
|
|
|
|
}
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2017-08-31 14:20:51 +00:00
|
|
|
|
# Substitute all environment variables that start with a lowercase character and
|
|
|
|
|
# are valid Bash names.
|
2006-12-27 18:14:57 +00:00
|
|
|
|
substituteAll() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local input="$1"
|
|
|
|
|
local output="$2"
|
2007-11-17 14:34:27 +00:00
|
|
|
|
|
2018-05-06 19:58:03 +00:00
|
|
|
|
local -a args=()
|
|
|
|
|
_allFlags
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2016-04-29 09:22:47 +00:00
|
|
|
|
substitute "$input" "$output" "${args[@]}"
|
2007-11-17 14:34:27 +00:00
|
|
|
|
}
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
|
|
|
|
|
2011-07-28 20:28:37 +00:00
|
|
|
|
substituteAllInPlace() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local fileName="$1"
|
2011-07-28 20:28:37 +00:00
|
|
|
|
shift
|
|
|
|
|
substituteAll "$fileName" "$fileName" "$@"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
######################################################################
|
|
|
|
|
# What follows is the generic builder.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# This function is useful for debugging broken Nix builds. It dumps
|
|
|
|
|
# all environment variables to a file `env-vars' in the build
|
|
|
|
|
# directory. If the build fails and the `-K' option is used, you can
|
|
|
|
|
# then go to the build directory and source in `env-vars' to reproduce
|
|
|
|
|
# the environment used for building.
|
|
|
|
|
dumpVars() {
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ "${noDumpEnvVars:-0}" != 1 ]; then
|
2021-01-05 20:42:18 +00:00
|
|
|
|
export 2>/dev/null >| "$NIX_BUILD_TOP/env-vars" || true
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2016-10-12 20:29:38 +00:00
|
|
|
|
# Utility function: echo the base name of the given path, with the
|
2006-08-07 13:31:18 +00:00
|
|
|
|
# prefix `HASH-' removed, if present.
|
|
|
|
|
stripHash() {
|
2019-08-06 04:27:21 +00:00
|
|
|
|
local strippedName casematchOpt=0
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# On separate line for `set -e`
|
2019-08-06 04:27:21 +00:00
|
|
|
|
strippedName="$(basename -- "$1")"
|
|
|
|
|
shopt -q nocasematch && casematchOpt=1
|
|
|
|
|
shopt -u nocasematch
|
|
|
|
|
if [[ "$strippedName" =~ ^[a-z0-9]{32}- ]]; then
|
|
|
|
|
echo "${strippedName:33}"
|
2016-10-12 20:29:38 +00:00
|
|
|
|
else
|
|
|
|
|
echo "$strippedName"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
2019-08-06 04:27:21 +00:00
|
|
|
|
if (( casematchOpt )); then shopt -s nocasematch; fi
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-12-31 13:25:54 +00:00
|
|
|
|
recordPropagatedDependencies() {
|
|
|
|
|
# Propagate dependencies into the development output.
|
|
|
|
|
declare -ra flatVars=(
|
|
|
|
|
# Build
|
|
|
|
|
depsBuildBuildPropagated
|
|
|
|
|
propagatedNativeBuildInputs
|
|
|
|
|
depsBuildTargetPropagated
|
|
|
|
|
# Host
|
|
|
|
|
depsHostHostPropagated
|
|
|
|
|
propagatedBuildInputs
|
|
|
|
|
# Target
|
|
|
|
|
depsTargetTargetPropagated
|
|
|
|
|
)
|
|
|
|
|
declare -ra flatFiles=(
|
|
|
|
|
"${propagatedBuildDepFiles[@]}"
|
|
|
|
|
"${propagatedHostDepFiles[@]}"
|
|
|
|
|
"${propagatedTargetDepFiles[@]}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
local propagatedInputsIndex
|
|
|
|
|
for propagatedInputsIndex in "${!flatVars[@]}"; do
|
|
|
|
|
local propagatedInputsSlice="${flatVars[$propagatedInputsIndex]}[@]"
|
|
|
|
|
local propagatedInputsFile="${flatFiles[$propagatedInputsIndex]}"
|
|
|
|
|
|
|
|
|
|
[[ "${!propagatedInputsSlice}" ]] || continue
|
|
|
|
|
|
|
|
|
|
mkdir -p "${!outputDev}/nix-support"
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
printWords ${!propagatedInputsSlice} > "${!outputDev}/nix-support/$propagatedInputsFile"
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-07-08 11:47:09 +00:00
|
|
|
|
unpackCmdHooks+=(_defaultUnpack)
|
2014-06-30 11:48:29 +00:00
|
|
|
|
_defaultUnpack() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local fn="$1"
|
2023-01-21 10:33:20 +00:00
|
|
|
|
local destination
|
2014-07-08 12:14:28 +00:00
|
|
|
|
|
|
|
|
|
if [ -d "$fn" ]; then
|
2014-06-30 11:21:30 +00:00
|
|
|
|
|
2023-01-21 10:33:20 +00:00
|
|
|
|
destination="$(stripHash "$fn")"
|
|
|
|
|
|
|
|
|
|
if [ -e "$destination" ]; then
|
|
|
|
|
echo "Cannot copy $fn to $destination: destination already exists!"
|
|
|
|
|
echo "Did you specify two \"srcs\" with the same \"name\"?"
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
|
2016-01-26 15:21:43 +00:00
|
|
|
|
# We can't preserve hardlinks because they may have been
|
|
|
|
|
# introduced by store optimization, which might break things
|
|
|
|
|
# in the build.
|
2023-01-21 10:33:20 +00:00
|
|
|
|
cp -pr --reflink=auto -- "$fn" "$destination"
|
2014-06-30 11:21:30 +00:00
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
2014-07-08 12:14:28 +00:00
|
|
|
|
case "$fn" in
|
2018-07-30 14:44:35 +00:00
|
|
|
|
*.tar.xz | *.tar.lzma | *.txz)
|
2014-06-30 11:21:30 +00:00
|
|
|
|
# Don't rely on tar knowing about .xz.
|
2023-10-25 21:56:55 +00:00
|
|
|
|
# Additionally, we have multiple different xz binaries with different feature sets in different
|
|
|
|
|
# stages. The XZ_OPT env var is only used by the full "XZ utils" implementation, which supports
|
|
|
|
|
# the --threads (-T) flag. This allows us to enable multithreaded decompression exclusively on
|
|
|
|
|
# that implementation, without the use of complex bash conditionals and checks.
|
2024-02-06 10:15:03 +00:00
|
|
|
|
# Since tar does not control the decompression, we need to
|
|
|
|
|
# disregard the error code from the xz invocation. Otherwise,
|
|
|
|
|
# it can happen that tar exits earlier, causing xz to fail
|
|
|
|
|
# from a SIGPIPE.
|
2024-03-19 00:54:31 +00:00
|
|
|
|
(XZ_OPT="--threads=$NIX_BUILD_CORES" xz -d < "$fn"; true) | tar xf - --mode=+w --warning=no-timestamp
|
2014-06-30 11:21:30 +00:00
|
|
|
|
;;
|
2018-07-30 14:44:35 +00:00
|
|
|
|
*.tar | *.tar.* | *.tgz | *.tbz2 | *.tbz)
|
2014-06-30 11:21:30 +00:00
|
|
|
|
# GNU tar can automatically select the decompression method
|
|
|
|
|
# (info "(tar) gzip").
|
2024-03-19 00:54:31 +00:00
|
|
|
|
tar xf "$fn" --mode=+w --warning=no-timestamp
|
2014-06-30 11:21:30 +00:00
|
|
|
|
;;
|
|
|
|
|
*)
|
2014-06-30 11:48:29 +00:00
|
|
|
|
return 1
|
2014-06-30 11:21:30 +00:00
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
fi
|
2014-06-30 11:48:29 +00:00
|
|
|
|
}
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2014-06-30 11:48:29 +00:00
|
|
|
|
|
|
|
|
|
unpackFile() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
curSrc="$1"
|
2023-01-15 21:45:50 +00:00
|
|
|
|
echo "unpacking source archive $curSrc"
|
2014-07-08 12:14:28 +00:00
|
|
|
|
if ! runOneHook unpackCmd "$curSrc"; then
|
2014-06-30 11:48:29 +00:00
|
|
|
|
echo "do not know how to unpack source archive $curSrc"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
unpackPhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preUnpack
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -z "${srcs:-}" ]; then
|
|
|
|
|
if [ -z "${src:-}" ]; then
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# shellcheck disable=SC2016
|
2006-08-07 13:31:18 +00:00
|
|
|
|
echo 'variable $src or $srcs should point to the source'
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2017-07-16 16:10:52 +00:00
|
|
|
|
srcs="$src"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
local -a srcsArray
|
2024-06-09 10:24:21 +00:00
|
|
|
|
concatTo srcsArray srcs
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
# To determine the source directory created by unpacking the
|
|
|
|
|
# source archives, we record the contents of the current
|
|
|
|
|
# directory, then look below which directory got added. Yeah,
|
|
|
|
|
# it's rather hacky.
|
|
|
|
|
local dirsBefore=""
|
|
|
|
|
for i in *; do
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -d "$i" ]; then
|
2006-08-07 13:31:18 +00:00
|
|
|
|
dirsBefore="$dirsBefore $i "
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# Unpack all source archives.
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for i in "${srcsArray[@]}"; do
|
2017-07-12 00:23:06 +00:00
|
|
|
|
unpackFile "$i"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# Find the source directory.
|
2017-08-09 05:20:56 +00:00
|
|
|
|
|
|
|
|
|
# set to empty if unset
|
2023-01-15 22:36:31 +00:00
|
|
|
|
: "${sourceRoot=}"
|
2017-08-09 05:20:56 +00:00
|
|
|
|
|
|
|
|
|
if [ -n "${setSourceRoot:-}" ]; then
|
2014-06-30 11:48:29 +00:00
|
|
|
|
runOneHook setSourceRoot
|
2012-01-19 16:14:09 +00:00
|
|
|
|
elif [ -z "$sourceRoot" ]; then
|
2006-08-07 13:31:18 +00:00
|
|
|
|
for i in *; do
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -d "$i" ]; then
|
2006-08-07 13:31:18 +00:00
|
|
|
|
case $dirsBefore in
|
|
|
|
|
*\ $i\ *)
|
|
|
|
|
;;
|
|
|
|
|
*)
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -n "$sourceRoot" ]; then
|
2006-08-07 13:31:18 +00:00
|
|
|
|
echo "unpacker produced multiple directories"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2017-07-16 16:10:52 +00:00
|
|
|
|
sourceRoot="$i"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -z "$sourceRoot" ]; then
|
2006-08-07 13:31:18 +00:00
|
|
|
|
echo "unpacker appears to have produced no directories"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "source root is $sourceRoot"
|
|
|
|
|
|
|
|
|
|
# By default, add write permission to the sources. This is often
|
|
|
|
|
# necessary when sources have been copied from other store
|
|
|
|
|
# locations.
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ "${dontMakeSourcesWritable:-0}" != 1 ]; then
|
2018-02-15 16:50:24 +00:00
|
|
|
|
chmod -R u+w -- "$sourceRoot"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
* Hook variables in the generic builder are now executed using eval.
This has a major advantage: you can write hooks directly in Nix
expressions. For instance, rather than write a builder like this:
source $stdenv/setup
postInstall=postInstall
postInstall() {
ln -sf gzip $out/bin/gunzip
ln -sf gzip $out/bin/zcat
}
genericBuild
(the gzip builder), you can just add this attribute to the
derivation:
postInstall = "ln -sf gzip $out/bin/gunzip; ln -sf gzip $out/bin/zcat";
and so a separate build script becomes unnecessary. This should
allow us to get rid of most builders in Nixpkgs.
* Allow configure and make arguments to contain whitespace.
Previously, you could say, for instance
configureFlags="CFLAGS=-O0"
but not
configureFlags="CFLAGS=-O0 -g"
since the `-g' would be interpreted as a separate argument to
configure. Now you can say
configureFlagsArray=("CFLAGS=-O0 -g")
or similarly
configureFlagsArray=("CFLAGS=-O0 -g" "LDFLAGS=-L/foo -L/bar")
which does the right thing. Idem for makeFlags, installFlags,
checkFlags and distFlags.
Unfortunately you can't pass arrays to Bash through the environment,
so you can't put the array above in a Nix expression, e.g.,
configureFlagsArray = ["CFLAGS=-O0 -g"];
since it would just be flattened to a since string. However, you
can use the inline hooks described above:
preConfigure = "configureFlagsArray=(\"CFLAGS=-O0 -g\")";
svn path=/nixpkgs/trunk/; revision=6863
2006-10-26 22:20:25 +00:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postUnpack
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
patchPhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook prePatch
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
local -a patchesArray
|
2024-06-09 10:24:21 +00:00
|
|
|
|
concatTo patchesArray patches
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
|
|
|
|
for i in "${patchesArray[@]}"; do
|
2023-01-15 21:45:50 +00:00
|
|
|
|
echo "applying patch $i"
|
2006-12-27 18:14:57 +00:00
|
|
|
|
local uncompress=cat
|
2014-10-09 19:41:56 +00:00
|
|
|
|
case "$i" in
|
2006-12-27 18:14:57 +00:00
|
|
|
|
*.gz)
|
2007-12-03 17:55:41 +00:00
|
|
|
|
uncompress="gzip -d"
|
2006-12-27 18:14:57 +00:00
|
|
|
|
;;
|
|
|
|
|
*.bz2)
|
2007-12-03 17:55:41 +00:00
|
|
|
|
uncompress="bzip2 -d"
|
2006-12-27 18:14:57 +00:00
|
|
|
|
;;
|
2013-08-07 13:45:21 +00:00
|
|
|
|
*.xz)
|
|
|
|
|
uncompress="xz -d"
|
|
|
|
|
;;
|
2009-12-18 11:26:36 +00:00
|
|
|
|
*.lzma)
|
|
|
|
|
uncompress="lzma -d"
|
|
|
|
|
;;
|
2006-12-27 18:14:57 +00:00
|
|
|
|
esac
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
|
|
|
|
local -a flagsArray
|
2024-06-09 10:45:57 +00:00
|
|
|
|
: "${patchFlags:=-p1}"
|
|
|
|
|
concatTo flagsArray patchFlags
|
2013-06-27 14:34:31 +00:00
|
|
|
|
# "2>&1" is a hack to make patch fail if the decompressor fails (nonexistent patch, etc.)
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# shellcheck disable=SC2086
|
2022-05-31 21:34:59 +00:00
|
|
|
|
$uncompress < "$i" 2>&1 | patch "${flagsArray[@]}"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
done
|
2008-03-18 11:03:35 +00:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postPatch
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fixLibtool() {
|
stdenv/setup: tell libtool about library paths
Packages that use libtool run it as a wrapper around the linker.
Before calling the linker, libtool will determine what libraries would
be linked, and check if there's a corresponding libtool
archive (libfoo.la) file in the same directory . This file
contains extra information about the library. This is especially
important for static linking, because static archives don't contain
dependency information, so we need libtool to use the .la files to
figure out which libraries actually need to be linked against.
But in Nixpkgs, this has never worked. libtool isn't able to find any
libraries, because only the compiler wrapper knows how to find them,
and the compiler wrapper is opaque to libtool. This is why
pkgsStatic.util-linuxMinimal doesn't build prior to this patch — it
depends on libpam, which depends on libaudit, and if libtool can't
find the .la file, nothing will tell the linker to also link against
libaudit when linking libpam. (It was previously possible to build a
static util-linux, because linux-pam only recently had the audit
dependency added.)
There are a couple of ways we could fix this, so that libtool knows
where to look for .la files.
* Set LD_LIBRARY_PATH/DYLD_LIBRARY_PATH/whatever, which libtool will
examine. This would have major side effects though, because the
dynamic linker looks at it too.
* Inject libtool scripts with the appropriate information. That's
what I've done here. It was the obvious choice because we're
already finding and modifying the libtool scripts, to remove paths
outside the Nix store that libtool might check in unsandboxed
builds. Instead of emptying out the system paths, we can
repopulate it with our own library paths.
(We can't use a wrapper like we do for other tools in Nixpkgs, because
libtool scripts are often distributed in source tarballs, so we can't
just add a wrapped version of libtool as a dependency. That's why
there's already the fixLibtool function in stdenv.)
With this change, libtool is able to discover .la files, and
pkgsStatic.util-linuxMinimal can build again, linking correctly
against libpam and libaudit.
2021-11-05 13:48:14 +00:00
|
|
|
|
local search_path
|
|
|
|
|
for flag in $NIX_LDFLAGS; do
|
|
|
|
|
case $flag in
|
|
|
|
|
-L*)
|
|
|
|
|
search_path+=" ${flag#-L}"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
sed -i "$1" \
|
2023-07-28 14:30:50 +00:00
|
|
|
|
-e "s^eval \(sys_lib_search_path=\).*^\1'${search_path:-}'^" \
|
stdenv/setup: tell libtool about library paths
Packages that use libtool run it as a wrapper around the linker.
Before calling the linker, libtool will determine what libraries would
be linked, and check if there's a corresponding libtool
archive (libfoo.la) file in the same directory . This file
contains extra information about the library. This is especially
important for static linking, because static archives don't contain
dependency information, so we need libtool to use the .la files to
figure out which libraries actually need to be linked against.
But in Nixpkgs, this has never worked. libtool isn't able to find any
libraries, because only the compiler wrapper knows how to find them,
and the compiler wrapper is opaque to libtool. This is why
pkgsStatic.util-linuxMinimal doesn't build prior to this patch — it
depends on libpam, which depends on libaudit, and if libtool can't
find the .la file, nothing will tell the linker to also link against
libaudit when linking libpam. (It was previously possible to build a
static util-linux, because linux-pam only recently had the audit
dependency added.)
There are a couple of ways we could fix this, so that libtool knows
where to look for .la files.
* Set LD_LIBRARY_PATH/DYLD_LIBRARY_PATH/whatever, which libtool will
examine. This would have major side effects though, because the
dynamic linker looks at it too.
* Inject libtool scripts with the appropriate information. That's
what I've done here. It was the obvious choice because we're
already finding and modifying the libtool scripts, to remove paths
outside the Nix store that libtool might check in unsandboxed
builds. Instead of emptying out the system paths, we can
repopulate it with our own library paths.
(We can't use a wrapper like we do for other tools in Nixpkgs, because
libtool scripts are often distributed in source tarballs, so we can't
just add a wrapped version of libtool as a dependency. That's why
there's already the fixLibtool function in stdenv.)
With this change, libtool is able to discover .la files, and
pkgsStatic.util-linuxMinimal can build again, linking correctly
against libpam and libaudit.
2021-11-05 13:48:14 +00:00
|
|
|
|
-e 's^eval sys_lib_.+search_path=.*^^'
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
configurePhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preConfigure
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
# set to empty if unset
|
2023-01-15 22:36:31 +00:00
|
|
|
|
: "${configureScript=}"
|
2017-08-09 05:20:56 +00:00
|
|
|
|
|
2017-07-16 16:10:52 +00:00
|
|
|
|
if [[ -z "$configureScript" && -x ./configure ]]; then
|
2006-08-07 13:31:18 +00:00
|
|
|
|
configureScript=./configure
|
|
|
|
|
fi
|
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -z "${dontFixLibtool:-}" ]; then
|
2021-07-24 21:56:01 +00:00
|
|
|
|
export lt_cv_deplibs_check_method="${lt_cv_deplibs_check_method-pass_all}"
|
2017-07-12 00:23:06 +00:00
|
|
|
|
local i
|
|
|
|
|
find . -iname "ltmain.sh" -print0 | while IFS='' read -r -d '' i; do
|
2006-08-07 13:31:18 +00:00
|
|
|
|
echo "fixing libtool script $i"
|
2017-07-12 00:23:06 +00:00
|
|
|
|
fixLibtool "$i"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
done
|
fixLibtool(): patch ./configure, add `file` to common-path.nix
libtool's libtool.m4 script assumes that `file` is available, and can
be found at `/usr/bin/file` (this path is hardwired). Furthermore,
the script with this assumption is vendored into the ./configure
scripts of an enormous number of packages. Without this commit, you
will frequently see errors like this during the configurePhase with
the sandbox enabled:
./configure: line 9595: /usr/bin/file: command not found
Due mostly to luck, this error does not affect native compiles on
nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux.
However it will cause incorrect linker flag detection and a failure to
generate shared libraries for sandboxed cross-builds to a x86_64-linux
host as well as any sandboxed build (cross or native) for the following
hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux,
s390x-linux, s390x-tpf, sparc-linux, and *-solaris.
This commit fixes the problem by adding an extra line to fixLibtool()
in pkgs/stdenv/generic/setup.sh. This extra line will scan the
unpacked source code for executable files named "configure" which
contain the following text:
'GNU Libtool is free software; you can redistribute it and/or modify'
This text is taken to be an indicator of a vendored libtool.m4. When
it is found, the configure script containing it is subjected to `sed
-i s_/usr/bin/file_file_` which replaces all occurrences of
`/usr/bin/file` with `file`.
Additionally, the `file` package is now considered to be part of
`stdenv`. It has been added to `common-path.nix` so that the `file`
binary will be found in the `$PATH` of every build, except for the
bootstrap-tools and the first few stages of stdenv boostrapping.
Verified no regressions under:
nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix
This commit allows the following commands to complete, which should
enable Hydra to produce bootstrap-files for mips64el:
nix-build \
--option sandbox true \
--option sandbox-fallback false \
pkgs/top-level/release-cross.nix \
-A bootstrapTools.mips64el-linux-gnuabi64.build
nix-build \
--option sandbox true \
--option sandbox-fallback false \
. \
-A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
2022-04-12 21:46:57 +00:00
|
|
|
|
|
|
|
|
|
# replace `/usr/bin/file` with `file` in any `configure`
|
|
|
|
|
# scripts with vendored libtool code. Preserve mtimes to
|
|
|
|
|
# prevent some packages (e.g. libidn2) from spontaneously
|
|
|
|
|
# autoreconf'ing themselves
|
2022-06-22 19:46:22 +00:00
|
|
|
|
CONFIGURE_MTIME_REFERENCE=$(mktemp configure.mtime.reference.XXXXXX)
|
fixLibtool(): patch ./configure, add `file` to common-path.nix
libtool's libtool.m4 script assumes that `file` is available, and can
be found at `/usr/bin/file` (this path is hardwired). Furthermore,
the script with this assumption is vendored into the ./configure
scripts of an enormous number of packages. Without this commit, you
will frequently see errors like this during the configurePhase with
the sandbox enabled:
./configure: line 9595: /usr/bin/file: command not found
Due mostly to luck, this error does not affect native compiles on
nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux.
However it will cause incorrect linker flag detection and a failure to
generate shared libraries for sandboxed cross-builds to a x86_64-linux
host as well as any sandboxed build (cross or native) for the following
hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux,
s390x-linux, s390x-tpf, sparc-linux, and *-solaris.
This commit fixes the problem by adding an extra line to fixLibtool()
in pkgs/stdenv/generic/setup.sh. This extra line will scan the
unpacked source code for executable files named "configure" which
contain the following text:
'GNU Libtool is free software; you can redistribute it and/or modify'
This text is taken to be an indicator of a vendored libtool.m4. When
it is found, the configure script containing it is subjected to `sed
-i s_/usr/bin/file_file_` which replaces all occurrences of
`/usr/bin/file` with `file`.
Additionally, the `file` package is now considered to be part of
`stdenv`. It has been added to `common-path.nix` so that the `file`
binary will be found in the `$PATH` of every build, except for the
bootstrap-tools and the first few stages of stdenv boostrapping.
Verified no regressions under:
nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix
This commit allows the following commands to complete, which should
enable Hydra to produce bootstrap-files for mips64el:
nix-build \
--option sandbox true \
--option sandbox-fallback false \
pkgs/top-level/release-cross.nix \
-A bootstrapTools.mips64el-linux-gnuabi64.build
nix-build \
--option sandbox true \
--option sandbox-fallback false \
. \
-A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
2022-04-12 21:46:57 +00:00
|
|
|
|
find . \
|
|
|
|
|
-executable \
|
|
|
|
|
-type f \
|
|
|
|
|
-name configure \
|
2022-06-15 19:10:44 +00:00
|
|
|
|
-exec grep -l 'GNU Libtool is free software; you can redistribute it and/or modify' {} \; \
|
|
|
|
|
-exec touch -r {} "$CONFIGURE_MTIME_REFERENCE" \; \
|
|
|
|
|
-exec sed -i s_/usr/bin/file_file_g {} \; \
|
|
|
|
|
-exec touch -r "$CONFIGURE_MTIME_REFERENCE" {} \;
|
fixLibtool(): patch ./configure, add `file` to common-path.nix
libtool's libtool.m4 script assumes that `file` is available, and can
be found at `/usr/bin/file` (this path is hardwired). Furthermore,
the script with this assumption is vendored into the ./configure
scripts of an enormous number of packages. Without this commit, you
will frequently see errors like this during the configurePhase with
the sandbox enabled:
./configure: line 9595: /usr/bin/file: command not found
Due mostly to luck, this error does not affect native compiles on
nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux.
However it will cause incorrect linker flag detection and a failure to
generate shared libraries for sandboxed cross-builds to a x86_64-linux
host as well as any sandboxed build (cross or native) for the following
hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux,
s390x-linux, s390x-tpf, sparc-linux, and *-solaris.
This commit fixes the problem by adding an extra line to fixLibtool()
in pkgs/stdenv/generic/setup.sh. This extra line will scan the
unpacked source code for executable files named "configure" which
contain the following text:
'GNU Libtool is free software; you can redistribute it and/or modify'
This text is taken to be an indicator of a vendored libtool.m4. When
it is found, the configure script containing it is subjected to `sed
-i s_/usr/bin/file_file_` which replaces all occurrences of
`/usr/bin/file` with `file`.
Additionally, the `file` package is now considered to be part of
`stdenv`. It has been added to `common-path.nix` so that the `file`
binary will be found in the `$PATH` of every build, except for the
bootstrap-tools and the first few stages of stdenv boostrapping.
Verified no regressions under:
nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix
This commit allows the following commands to complete, which should
enable Hydra to produce bootstrap-files for mips64el:
nix-build \
--option sandbox true \
--option sandbox-fallback false \
pkgs/top-level/release-cross.nix \
-A bootstrapTools.mips64el-linux-gnuabi64.build
nix-build \
--option sandbox true \
--option sandbox-fallback false \
. \
-A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
2022-04-12 21:46:57 +00:00
|
|
|
|
rm -f "$CONFIGURE_MTIME_REFERENCE"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
prependToVar configureFlags "${prefixKey:---prefix=}$prefix"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2021-07-19 06:24:39 +00:00
|
|
|
|
if [[ -f "$configureScript" ]]; then
|
|
|
|
|
# Add --disable-dependency-tracking to speed up some builds.
|
|
|
|
|
if [ -z "${dontAddDisableDepTrack:-}" ]; then
|
|
|
|
|
if grep -q dependency-tracking "$configureScript"; then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
prependToVar configureFlags --disable-dependency-tracking
|
2021-07-19 06:24:39 +00:00
|
|
|
|
fi
|
2008-02-13 18:27:19 +00:00
|
|
|
|
fi
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2021-07-19 06:24:39 +00:00
|
|
|
|
# By default, disable static builds.
|
|
|
|
|
if [ -z "${dontDisableStatic:-}" ]; then
|
|
|
|
|
if grep -q enable-static "$configureScript"; then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
prependToVar configureFlags --disable-static
|
2021-07-19 06:24:39 +00:00
|
|
|
|
fi
|
2009-04-21 22:40:12 +00:00
|
|
|
|
fi
|
2023-11-05 22:13:45 +00:00
|
|
|
|
|
|
|
|
|
if [ -z "${dontPatchShebangsInConfigure:-}" ]; then
|
|
|
|
|
patchShebangs --build "$configureScript"
|
|
|
|
|
fi
|
2009-04-21 22:40:12 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2015-12-30 10:11:33 +00:00
|
|
|
|
if [ -n "$configureScript" ]; then
|
2022-05-31 21:34:59 +00:00
|
|
|
|
local -a flagsArray
|
2024-06-09 10:24:21 +00:00
|
|
|
|
concatTo flagsArray configureFlags configureFlagsArray
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
2017-07-13 20:31:39 +00:00
|
|
|
|
echoCmd 'configure flags' "${flagsArray[@]}"
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
$configureScript "${flagsArray[@]}"
|
|
|
|
|
unset flagsArray
|
2015-12-30 10:11:33 +00:00
|
|
|
|
else
|
|
|
|
|
echo "no configure script, doing nothing"
|
|
|
|
|
fi
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postConfigure
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
buildPhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preBuild
|
2007-11-17 14:34:27 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
if [[ -z "${makeFlags-}" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then
|
2023-01-05 23:48:11 +00:00
|
|
|
|
echo "no Makefile or custom buildPhase, doing nothing"
|
2015-12-30 10:11:33 +00:00
|
|
|
|
else
|
2018-03-15 00:00:04 +00:00
|
|
|
|
foundMakefile=1
|
|
|
|
|
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-08-09 05:20:56 +00:00
|
|
|
|
local flagsArray=(
|
treewide: drop -l$NIX_BUILD_CORES
Passing `-l$NIX_BUILD_CORES` improperly limits the overall system load.
For a build machine which is configured to run `$B` builds where each
build gets `total cores / B` cores (`$C`), passing `-l $C` to make will
improperly limit the load to `$C` instead of `$B * $C`.
This effect becomes quite pronounced on machines with 80 cores, with
40 simultaneous builds and a cores limit of 2. On a machine with this
configuration, Nix will run 40 builds and make will limit the overall
system load to approximately 2. A build machine with this many cores
can happily run with a load approaching 80.
A non-solution is to oversubscribe the machine, by picking a larger
`$C`. However, there is no way to divide the number of cores in a way
which fairly subdivides the available cores when `$B` is greater than
1.
There has been exploration of passing a jobserver in to the sandbox,
or sharing a jobserver between all the builds. This is one option, but
relatively complicated and only supports make. Lots of other software
uses its own implementation of `-j` and doesn't support either `-l` or
the Make jobserver.
For the case of an interactive user machine, the user should limit
overall system load using `$B`, `$C`, and optionally systemd's
cpu/network/io limiting features.
Making this change should significantly improve the utilization of our
build farm, and improve the throughput of Hydra.
2022-09-22 15:17:14 +00:00
|
|
|
|
${enableParallelBuilding:+-j${NIX_BUILD_CORES}}
|
2024-07-14 16:17:55 +00:00
|
|
|
|
SHELL="$SHELL"
|
2017-08-09 05:20:56 +00:00
|
|
|
|
)
|
2024-06-09 10:24:21 +00:00
|
|
|
|
concatTo flagsArray makeFlags makeFlagsArray buildFlags buildFlagsArray
|
2017-07-12 00:23:06 +00:00
|
|
|
|
|
2017-07-13 20:31:39 +00:00
|
|
|
|
echoCmd 'build flags' "${flagsArray[@]}"
|
2017-07-12 00:23:06 +00:00
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
|
|
|
|
unset flagsArray
|
2008-02-20 23:02:41 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postBuild
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
checkPhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preCheck
|
2008-03-18 11:03:35 +00:00
|
|
|
|
|
2018-03-15 00:00:04 +00:00
|
|
|
|
if [[ -z "${foundMakefile:-}" ]]; then
|
2020-11-07 10:52:59 +00:00
|
|
|
|
echo "no Makefile or custom checkPhase, doing nothing"
|
2018-03-15 00:00:04 +00:00
|
|
|
|
runHook postCheck
|
|
|
|
|
return
|
|
|
|
|
fi
|
2017-07-12 00:23:06 +00:00
|
|
|
|
|
2018-03-15 00:00:04 +00:00
|
|
|
|
if [[ -z "${checkTarget:-}" ]]; then
|
|
|
|
|
#TODO(@oxij): should flagsArray influence make -n?
|
|
|
|
|
if make -n ${makefile:+-f $makefile} check >/dev/null 2>&1; then
|
2024-07-14 16:17:55 +00:00
|
|
|
|
checkTarget="check"
|
2018-03-15 00:00:04 +00:00
|
|
|
|
elif make -n ${makefile:+-f $makefile} test >/dev/null 2>&1; then
|
2024-07-14 16:17:55 +00:00
|
|
|
|
checkTarget="test"
|
2018-03-15 00:00:04 +00:00
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ -z "${checkTarget:-}" ]]; then
|
|
|
|
|
echo "no check/test target in ${makefile:-Makefile}, doing nothing"
|
|
|
|
|
else
|
|
|
|
|
# Old bash empty array hack
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
local flagsArray=(
|
treewide: drop -l$NIX_BUILD_CORES
Passing `-l$NIX_BUILD_CORES` improperly limits the overall system load.
For a build machine which is configured to run `$B` builds where each
build gets `total cores / B` cores (`$C`), passing `-l $C` to make will
improperly limit the load to `$C` instead of `$B * $C`.
This effect becomes quite pronounced on machines with 80 cores, with
40 simultaneous builds and a cores limit of 2. On a machine with this
configuration, Nix will run 40 builds and make will limit the overall
system load to approximately 2. A build machine with this many cores
can happily run with a load approaching 80.
A non-solution is to oversubscribe the machine, by picking a larger
`$C`. However, there is no way to divide the number of cores in a way
which fairly subdivides the available cores when `$B` is greater than
1.
There has been exploration of passing a jobserver in to the sandbox,
or sharing a jobserver between all the builds. This is one option, but
relatively complicated and only supports make. Lots of other software
uses its own implementation of `-j` and doesn't support either `-l` or
the Make jobserver.
For the case of an interactive user machine, the user should limit
overall system load using `$B`, `$C`, and optionally systemd's
cpu/network/io limiting features.
Making this change should significantly improve the utilization of our
build farm, and improve the throughput of Hydra.
2022-09-22 15:17:14 +00:00
|
|
|
|
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
|
2024-07-14 16:17:55 +00:00
|
|
|
|
SHELL="$SHELL"
|
2018-03-15 00:00:04 +00:00
|
|
|
|
)
|
|
|
|
|
|
2024-06-09 10:45:57 +00:00
|
|
|
|
: "${checkFlags:=VERBOSE=y}"
|
|
|
|
|
concatTo flagsArray makeFlags makeFlagsArray checkFlags checkFlagsArray checkTarget
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
2018-03-15 00:00:04 +00:00
|
|
|
|
echoCmd 'check flags' "${flagsArray[@]}"
|
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
|
|
|
|
|
|
|
|
|
unset flagsArray
|
|
|
|
|
fi
|
2008-03-18 11:03:35 +00:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postCheck
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
installPhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preInstall
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2023-01-05 23:48:11 +00:00
|
|
|
|
# Dont reuse 'foundMakefile' set in buildPhase, a makefile may have been created in buildPhase
|
|
|
|
|
if [[ -z "${makeFlags-}" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then
|
|
|
|
|
echo "no Makefile or custom installPhase, doing nothing"
|
|
|
|
|
runHook postInstall
|
|
|
|
|
return
|
|
|
|
|
else
|
|
|
|
|
foundMakefile=1
|
|
|
|
|
fi
|
|
|
|
|
|
2014-08-25 13:30:46 +00:00
|
|
|
|
if [ -n "$prefix" ]; then
|
|
|
|
|
mkdir -p "$prefix"
|
|
|
|
|
fi
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-08-09 05:20:56 +00:00
|
|
|
|
local flagsArray=(
|
2023-02-21 19:50:48 +00:00
|
|
|
|
${enableParallelInstalling:+-j${NIX_BUILD_CORES}}
|
2024-07-14 16:17:55 +00:00
|
|
|
|
SHELL="$SHELL"
|
2017-08-09 05:20:56 +00:00
|
|
|
|
)
|
2024-06-09 10:45:57 +00:00
|
|
|
|
|
|
|
|
|
: "${installTargets:=install}"
|
|
|
|
|
concatTo flagsArray makeFlags makeFlagsArray installFlags installFlagsArray installTargets
|
2017-07-12 00:23:06 +00:00
|
|
|
|
|
2017-07-13 20:31:39 +00:00
|
|
|
|
echoCmd 'install flags' "${flagsArray[@]}"
|
2017-07-12 00:23:06 +00:00
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
|
|
|
|
unset flagsArray
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postInstall
|
2006-12-27 18:14:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-06-25 14:47:58 +00:00
|
|
|
|
# The fixup phase performs generic, package-independent stuff, like
|
|
|
|
|
# stripping binaries, running patchelf and setting
|
|
|
|
|
# propagated-build-inputs.
|
2008-02-20 23:02:41 +00:00
|
|
|
|
fixupPhase() {
|
2014-01-14 13:13:31 +00:00
|
|
|
|
# Make sure everything is writable so "strip" et al. work.
|
stdenv: Fix handling of dependencies and hooks
4 far-reaching changes: Smaller PATH, New vars, different propagation
logic, and different hook logic
Smaller PATH
------------
`buildInputs` no longer go on the PATH at build time, as they cannot be
run when cross compiling and we don't want to special case. Simply make
a `nativeBuildInput` too if one needs them on the PATH. Fixes #21191.
Many new depedendency variables
-------------------------------
See the stdenv chapter of the nixpkgs manual. I pulled out the existing
documentation of dependency specification into a new section, and added
language for these two (and their propagated equivalents) along side
the others'.
More complex propagation logic
------------------------------
Before a propagated*XXX*Input always acted as if it was specified
directly as a *XXX*Input downstream. That's simple enough, but violates
the intended roles of each sort of dep, which has functional and not
just stylistic consequences.
The new algorithm is detailed in the manual, and ensures everything
ends up in the right place. I tried to give both an informal and formal
description, but I suspect in practice it will not make much sense
until one tries cross compiling, after which it will immediately make
sense as the only sane option.
Simplified hook logic
---------------------
Rather than `envHook` and `crossEnvHook`, whose behavior differs
depending on whether we are cross compiling or not, there is now one
hook per sort (or rather non-propagated and propagated pair of sorts)
of dependency. These new hooks have the same meaning regardless of
cross compilation. See the setup hook section of stdenv chapter of the
Nixpkgs manual for more details.
2017-09-11 16:20:20 +00:00
|
|
|
|
local output
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for output in $(getAllOutputNames); do
|
2024-04-10 05:52:44 +00:00
|
|
|
|
# for set*id bits see #300635
|
|
|
|
|
if [ -e "${!output}" ]; then chmod -R u+w,u-s,g-s "${!output}"; fi
|
2014-06-25 14:47:58 +00:00
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
runHook preFixup
|
2014-01-14 13:13:31 +00:00
|
|
|
|
|
2014-06-25 14:47:58 +00:00
|
|
|
|
# Apply fixup to each output.
|
|
|
|
|
local output
|
2022-05-31 21:34:59 +00:00
|
|
|
|
for output in $(getAllOutputNames); do
|
2017-07-16 16:10:52 +00:00
|
|
|
|
prefix="${!output}" runHook fixupOutput
|
2014-06-25 14:47:58 +00:00
|
|
|
|
done
|
|
|
|
|
|
2015-04-18 13:46:00 +00:00
|
|
|
|
|
2022-12-31 13:25:54 +00:00
|
|
|
|
# record propagated dependencies & setup hook into the development output.
|
|
|
|
|
recordPropagatedDependencies
|
2017-11-17 18:26:21 +00:00
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -n "${setupHook:-}" ]; then
|
2015-04-18 13:46:00 +00:00
|
|
|
|
mkdir -p "${!outputDev}/nix-support"
|
|
|
|
|
substituteAll "$setupHook" "${!outputDev}/nix-support/setup-hook"
|
2014-06-25 14:47:58 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2018-05-06 19:58:03 +00:00
|
|
|
|
# TODO(@Ericson2314): Remove after https://github.com/NixOS/nixpkgs/pull/31414
|
|
|
|
|
if [ -n "${setupHooks:-}" ]; then
|
|
|
|
|
mkdir -p "${!outputDev}/nix-support"
|
|
|
|
|
local hook
|
2022-05-31 21:34:59 +00:00
|
|
|
|
# have to use ${setupHooks[@]} without quotes because it needs to support setupHooks being a array or a whitespace separated string
|
|
|
|
|
# # values of setupHooks won't have spaces so it won't cause problems
|
|
|
|
|
# shellcheck disable=2068
|
|
|
|
|
for hook in ${setupHooks[@]}; do
|
2018-05-06 19:58:03 +00:00
|
|
|
|
local content
|
|
|
|
|
consumeEntire content < "$hook"
|
2018-02-23 13:12:53 +00:00
|
|
|
|
substituteAllStream content "file '$hook'" >> "${!outputDev}/nix-support/setup-hook"
|
2018-05-06 19:58:03 +00:00
|
|
|
|
unset -v content
|
|
|
|
|
done
|
|
|
|
|
unset -v hook
|
|
|
|
|
fi
|
|
|
|
|
|
2015-04-18 13:46:00 +00:00
|
|
|
|
# Propagate user-env packages into the output with binaries, TODO?
|
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -n "${propagatedUserEnvPkgs:-}" ]; then
|
2015-04-18 13:46:00 +00:00
|
|
|
|
mkdir -p "${!outputBin}/nix-support"
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-07-25 22:48:47 +00:00
|
|
|
|
printWords $propagatedUserEnvPkgs > "${!outputBin}/nix-support/propagated-user-env-packages"
|
2014-06-25 14:47:58 +00:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
runHook postFixup
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-05-01 21:00:30 +00:00
|
|
|
|
installCheckPhase() {
|
|
|
|
|
runHook preInstallCheck
|
|
|
|
|
|
2018-03-15 00:00:04 +00:00
|
|
|
|
if [[ -z "${foundMakefile:-}" ]]; then
|
2020-11-07 10:52:59 +00:00
|
|
|
|
echo "no Makefile or custom installCheckPhase, doing nothing"
|
2018-03-15 00:00:04 +00:00
|
|
|
|
#TODO(@oxij): should flagsArray influence make -n?
|
|
|
|
|
elif [[ -z "${installCheckTarget:-}" ]] \
|
2023-01-15 22:39:25 +00:00
|
|
|
|
&& ! make -n ${makefile:+-f $makefile} "${installCheckTarget:-installcheck}" >/dev/null 2>&1; then
|
2018-03-15 00:00:04 +00:00
|
|
|
|
echo "no installcheck target in ${makefile:-Makefile}, doing nothing"
|
|
|
|
|
else
|
|
|
|
|
# Old bash empty array hack
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
local flagsArray=(
|
treewide: drop -l$NIX_BUILD_CORES
Passing `-l$NIX_BUILD_CORES` improperly limits the overall system load.
For a build machine which is configured to run `$B` builds where each
build gets `total cores / B` cores (`$C`), passing `-l $C` to make will
improperly limit the load to `$C` instead of `$B * $C`.
This effect becomes quite pronounced on machines with 80 cores, with
40 simultaneous builds and a cores limit of 2. On a machine with this
configuration, Nix will run 40 builds and make will limit the overall
system load to approximately 2. A build machine with this many cores
can happily run with a load approaching 80.
A non-solution is to oversubscribe the machine, by picking a larger
`$C`. However, there is no way to divide the number of cores in a way
which fairly subdivides the available cores when `$B` is greater than
1.
There has been exploration of passing a jobserver in to the sandbox,
or sharing a jobserver between all the builds. This is one option, but
relatively complicated and only supports make. Lots of other software
uses its own implementation of `-j` and doesn't support either `-l` or
the Make jobserver.
For the case of an interactive user machine, the user should limit
overall system load using `$B`, `$C`, and optionally systemd's
cpu/network/io limiting features.
Making this change should significantly improve the utilization of our
build farm, and improve the throughput of Hydra.
2022-09-22 15:17:14 +00:00
|
|
|
|
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
|
2024-07-14 16:17:55 +00:00
|
|
|
|
SHELL="$SHELL"
|
2018-03-15 00:00:04 +00:00
|
|
|
|
)
|
2017-07-12 00:23:06 +00:00
|
|
|
|
|
2024-06-09 10:45:57 +00:00
|
|
|
|
: "${installCheckTarget:=installcheck}"
|
2024-06-09 10:24:21 +00:00
|
|
|
|
concatTo flagsArray makeFlags makeFlagsArray \
|
2024-06-09 10:45:57 +00:00
|
|
|
|
installCheckFlags installCheckFlagsArray installCheckTarget
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
2018-03-15 00:00:04 +00:00
|
|
|
|
echoCmd 'installcheck flags' "${flagsArray[@]}"
|
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
|
|
|
|
unset flagsArray
|
|
|
|
|
fi
|
2012-05-01 21:00:30 +00:00
|
|
|
|
|
|
|
|
|
runHook postInstallCheck
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
distPhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preDist
|
2007-11-17 14:34:27 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
local flagsArray=()
|
2024-06-09 10:45:57 +00:00
|
|
|
|
: "${distTarget:=dist}"
|
|
|
|
|
concatTo flagsArray distFlags distFlagsArray distTarget
|
2017-07-12 00:23:06 +00:00
|
|
|
|
|
|
|
|
|
echo 'dist flags: %q' "${flagsArray[@]}"
|
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ "${dontCopyDist:-0}" != 1 ]; then
|
2012-01-18 20:16:00 +00:00
|
|
|
|
mkdir -p "$out/tarballs"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
|
|
|
|
|
# Note: don't quote $tarballs, since we explicitly permit
|
|
|
|
|
# wildcards in there.
|
2017-07-12 00:23:06 +00:00
|
|
|
|
# shellcheck disable=SC2086
|
2022-05-31 21:34:59 +00:00
|
|
|
|
cp -pvd ${tarballs[*]:-*.tar.gz} "$out/tarballs"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postDist
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
showPhaseHeader() {
|
2017-07-16 16:10:52 +00:00
|
|
|
|
local phase="$1"
|
2023-11-15 09:23:03 +00:00
|
|
|
|
echo "Running phase: $phase"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-04-01 14:14:14 +00:00
|
|
|
|
showPhaseFooter() {
|
|
|
|
|
local phase="$1"
|
|
|
|
|
local startTime="$2"
|
|
|
|
|
local endTime="$3"
|
|
|
|
|
local delta=$(( endTime - startTime ))
|
2023-01-15 22:39:25 +00:00
|
|
|
|
(( delta < 30 )) && return
|
2022-04-01 14:14:14 +00:00
|
|
|
|
|
|
|
|
|
local H=$((delta/3600))
|
|
|
|
|
local M=$((delta%3600/60))
|
|
|
|
|
local S=$((delta%60))
|
|
|
|
|
echo -n "$phase completed in "
|
2023-01-15 22:39:25 +00:00
|
|
|
|
(( H > 0 )) && echo -n "$H hours "
|
|
|
|
|
(( M > 0 )) && echo -n "$M minutes "
|
2022-04-01 14:14:14 +00:00
|
|
|
|
echo "$S seconds"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-05-07 08:17:14 +00:00
|
|
|
|
runPhase() {
|
|
|
|
|
local curPhase="$*"
|
|
|
|
|
if [[ "$curPhase" = unpackPhase && -n "${dontUnpack:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = patchPhase && -n "${dontPatch:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = configurePhase && -n "${dontConfigure:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = buildPhase && -n "${dontBuild:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = checkPhase && -z "${doCheck:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = installPhase && -n "${dontInstall:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = fixupPhase && -n "${dontFixup:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = installCheckPhase && -z "${doInstallCheck:-}" ]]; then return; fi
|
|
|
|
|
if [[ "$curPhase" = distPhase && -z "${doDist:-}" ]]; then return; fi
|
|
|
|
|
|
2024-06-24 07:17:10 +00:00
|
|
|
|
nixLog "@nix { \"action\": \"setPhase\", \"phase\": \"$curPhase\" }"
|
2023-05-07 08:17:14 +00:00
|
|
|
|
|
|
|
|
|
showPhaseHeader "$curPhase"
|
|
|
|
|
dumpVars
|
|
|
|
|
|
2024-07-14 16:17:55 +00:00
|
|
|
|
local startTime endTime
|
|
|
|
|
startTime=$(date +"%s")
|
2023-05-07 08:17:14 +00:00
|
|
|
|
|
|
|
|
|
# Evaluate the variable named $curPhase if it exists, otherwise the
|
|
|
|
|
# function named $curPhase.
|
|
|
|
|
eval "${!curPhase:-$curPhase}"
|
|
|
|
|
|
2024-07-14 16:17:55 +00:00
|
|
|
|
endTime=$(date +"%s")
|
2023-05-07 08:17:14 +00:00
|
|
|
|
|
|
|
|
|
showPhaseFooter "$curPhase" "$startTime" "$endTime"
|
|
|
|
|
|
|
|
|
|
if [ "$curPhase" = unpackPhase ]; then
|
|
|
|
|
# make sure we can cd into the directory
|
2024-06-03 17:40:23 +00:00
|
|
|
|
[ -n "${sourceRoot:-}" ] && chmod +x -- "${sourceRoot}"
|
2023-05-07 08:17:14 +00:00
|
|
|
|
|
2024-06-03 17:40:23 +00:00
|
|
|
|
cd -- "${sourceRoot:-.}"
|
2023-05-07 08:17:14 +00:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
genericBuild() {
|
2023-01-06 20:19:06 +00:00
|
|
|
|
# variable used by our gzip wrapper to add -n.
|
|
|
|
|
# gzip is in common-path.nix and is added to nix-shell but we only want to change its behaviour in nix builds. do not move to a setupHook in gzip.
|
|
|
|
|
export GZIP_NO_TIMESTAMPS=1
|
|
|
|
|
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -f "${buildCommandPath:-}" ]; then
|
|
|
|
|
source "$buildCommandPath"
|
2016-05-29 13:25:09 +00:00
|
|
|
|
return
|
|
|
|
|
fi
|
2017-08-09 05:20:56 +00:00
|
|
|
|
if [ -n "${buildCommand:-}" ]; then
|
2006-12-27 18:14:57 +00:00
|
|
|
|
eval "$buildCommand"
|
|
|
|
|
return
|
|
|
|
|
fi
|
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
if [ -z "${phases[*]:-}" ]; then
|
|
|
|
|
phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \
|
|
|
|
|
configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \
|
|
|
|
|
${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \
|
|
|
|
|
${preDistPhases[*]:-} distPhase ${postPhases[*]:-}";
|
2008-02-20 23:02:41 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
# The use of ${phases[*]} gives the correct behavior both with and
|
|
|
|
|
# without structured attrs. This relies on the fact that each
|
|
|
|
|
# phase name is space-free, which it must be because it's the name
|
|
|
|
|
# of either a shell variable or a shell function.
|
|
|
|
|
for curPhase in ${phases[*]}; do
|
2023-05-07 08:17:14 +00:00
|
|
|
|
runPhase "$curPhase"
|
2006-08-07 13:31:18 +00:00
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-01-07 08:48:23 +00:00
|
|
|
|
# Execute the post-hooks.
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postHook
|
2008-02-20 23:02:41 +00:00
|
|
|
|
|
|
|
|
|
|
2012-12-28 15:36:09 +00:00
|
|
|
|
# Execute the global user hook (defined through the Nixpkgs
|
|
|
|
|
# configuration option ‘stdenv.userHook’). This can be used to set
|
|
|
|
|
# global compiler optimisation flags, for instance.
|
|
|
|
|
runHook userHook
|
|
|
|
|
|
|
|
|
|
|
2006-08-07 13:31:18 +00:00
|
|
|
|
dumpVars
|
2017-08-09 05:20:56 +00:00
|
|
|
|
|
2022-05-31 21:34:59 +00:00
|
|
|
|
|
2022-01-23 02:50:09 +00:00
|
|
|
|
# Restore the original options for nix-shell
|
|
|
|
|
[[ $__nixpkgs_setup_set_original == *e* ]] || set +e
|
|
|
|
|
[[ $__nixpkgs_setup_set_original == *u* ]] || set +u
|
|
|
|
|
unset -v __nixpkgs_setup_set_original
|