2017-08-09 06:20:56 +01:00
|
|
|
|
set -eu
|
2014-10-10 10:50:25 +01:00
|
|
|
|
set -o pipefail
|
2014-07-01 15:17:23 +01:00
|
|
|
|
|
2017-09-20 00:11:29 +01:00
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 6 )); then
|
|
|
|
|
set -x
|
|
|
|
|
fi
|
|
|
|
|
|
2014-06-25 15:47:58 +01:00
|
|
|
|
: ${outputs:=out}
|
|
|
|
|
|
|
|
|
|
|
2014-06-25 14:38:37 +01: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 12:47:09 +01: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 14:38:37 +01:00
|
|
|
|
runHook() {
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local oldOpts="$(shopt -po nounset)"
|
|
|
|
|
set -u # May be called from elsewhere, so do `set -u`.
|
|
|
|
|
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local hookName="$1"
|
2014-07-08 13:14:28 +01:00
|
|
|
|
shift
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local hooksSlice="${hookName%Hook}Hooks[@]"
|
2017-07-25 22:48:50 +01:00
|
|
|
|
|
2017-07-07 00:29:48 +01:00
|
|
|
|
local hook
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# Hack around old bash being bad and thinking empty arrays are
|
|
|
|
|
# undefined.
|
|
|
|
|
for hook in "_callImplicitHook 0 $hookName" ${!hooksSlice+"${!hooksSlice}"}; do
|
2015-05-12 17:41:02 +01:00
|
|
|
|
_eval "$hook" "$@"
|
2017-08-09 06:20:56 +01:00
|
|
|
|
set -u # To balance `_eval`
|
2014-06-25 14:38:37 +01:00
|
|
|
|
done
|
2017-08-09 06:20:56 +01:00
|
|
|
|
|
|
|
|
|
eval "${oldOpts}"
|
2014-06-25 14:38:37 +01:00
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-06-30 12:48:29 +01: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-08-09 06:20:56 +01:00
|
|
|
|
local oldOpts="$(shopt -po nounset)"
|
|
|
|
|
set -u # May be called from elsewhere, so do `set -u`.
|
|
|
|
|
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local hookName="$1"
|
2014-07-08 13:14:28 +01:00
|
|
|
|
shift
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local hooksSlice="${hookName%Hook}Hooks[@]"
|
2017-07-25 22:48:50 +01:00
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local hook ret=1
|
|
|
|
|
# Hack around old bash like above
|
|
|
|
|
for hook in "_callImplicitHook 1 $hookName" ${!hooksSlice+"${!hooksSlice}"}; do
|
2014-07-08 13:14:28 +01:00
|
|
|
|
if _eval "$hook" "$@"; then
|
2017-08-09 06:20:56 +01:00
|
|
|
|
ret=0
|
|
|
|
|
break
|
2014-06-30 12:48:29 +01:00
|
|
|
|
fi
|
2017-08-09 06:20:56 +01:00
|
|
|
|
set -u # To balance `_eval`
|
2014-06-30 12:48:29 +01:00
|
|
|
|
done
|
2017-08-09 06:20:56 +01:00
|
|
|
|
|
|
|
|
|
eval "${oldOpts}"
|
|
|
|
|
return "$ret"
|
2014-06-30 12:48:29 +01: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 14:38:37 +01: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 14:38:37 +01:00
|
|
|
|
# environment variables) and from shell scripts (as functions). If you
|
|
|
|
|
# want to allow multiple hooks, use runHook instead.
|
2014-06-30 12:48:29 +01:00
|
|
|
|
_callImplicitHook() {
|
2017-08-09 06:20:56 +01:00
|
|
|
|
set -u
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local def="$1"
|
|
|
|
|
local hookName="$2"
|
2017-07-12 01:23:06 +01:00
|
|
|
|
case "$(type -t "$hookName")" in
|
2017-08-09 06:20:56 +01:00
|
|
|
|
(function|alias|builtin)
|
|
|
|
|
set +u
|
|
|
|
|
"$hookName";;
|
|
|
|
|
(file)
|
|
|
|
|
set +u
|
|
|
|
|
source "$hookName";;
|
2009-11-19 17:19:32 +00:00
|
|
|
|
(keyword) :;;
|
2017-08-09 06:20:56 +01:00
|
|
|
|
(*) if [ -z "${!hookName:-}" ]; then
|
|
|
|
|
return "$def";
|
|
|
|
|
else
|
|
|
|
|
set +u
|
|
|
|
|
eval "${!hookName}"
|
|
|
|
|
fi;;
|
2009-11-19 17:19:32 +00:00
|
|
|
|
esac
|
2017-08-09 06:20:56 +01: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 14:38:37 +01:00
|
|
|
|
# A function wrapper around ‘eval’ that ensures that ‘return’ inside
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# hooks exits the hook, not the caller. Also will only pass args if
|
|
|
|
|
# command can take them
|
2014-06-25 14:38:37 +01:00
|
|
|
|
_eval() {
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ "$(type -t "$1")" = function ]; then
|
|
|
|
|
set +u
|
|
|
|
|
"$@" # including args
|
2014-07-08 13:14:28 +01:00
|
|
|
|
else
|
2017-08-09 06:20:56 +01:00
|
|
|
|
set +u
|
|
|
|
|
eval "$1"
|
2014-07-08 13:14:28 +01:00
|
|
|
|
fi
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# `run*Hook` reenables `set -u`
|
2014-06-25 14:38:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2015-06-15 10:24:11 +01:00
|
|
|
|
######################################################################
|
|
|
|
|
# Logging.
|
|
|
|
|
|
2017-07-24 13:25:57 +01:00
|
|
|
|
# Obsolete.
|
|
|
|
|
stopNest() { true; }
|
|
|
|
|
header() { echo "$1"; }
|
|
|
|
|
closeNest() { true; }
|
2015-06-15 10:24:11 +01:00
|
|
|
|
|
2017-07-13 21:31:39 +01: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 10:24:11 +01:00
|
|
|
|
|
2014-06-25 14:38:37 +01:00
|
|
|
|
######################################################################
|
|
|
|
|
# Error handling.
|
|
|
|
|
|
2008-04-23 08:19:48 +01:00
|
|
|
|
exitHandler() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
exitCode="$?"
|
2008-04-23 08:19:48 +01:00
|
|
|
|
set +e
|
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -n "${showBuildStats:-}" ]; then
|
2009-07-02 10:01:37 +01:00
|
|
|
|
times > "$NIX_BUILD_TOP/.times"
|
|
|
|
|
local -a times=($(cat "$NIX_BUILD_TOP/.times"))
|
2008-04-23 08:19:48 +01:00
|
|
|
|
# Print the following statistics:
|
|
|
|
|
# - user time for the shell
|
|
|
|
|
# - system time for the shell
|
|
|
|
|
# - user time for all child processes
|
|
|
|
|
# - system time for all child processes
|
2017-07-12 01:23:06 +01:00
|
|
|
|
echo "build time elapsed: " "${times[@]}"
|
2008-04-23 08:19:48 +01:00
|
|
|
|
fi
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2017-08-09 06:20:56 +01: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 08:19:48 +01:00
|
|
|
|
# If the builder had a non-zero exit code and
|
|
|
|
|
# $succeedOnFailure is set, create the file
|
2015-08-03 19:03:11 +01:00
|
|
|
|
# ‘$out/nix-support/failed’ to signal failure, and exit
|
2008-04-23 08:19:48 +01:00
|
|
|
|
# normally. Otherwise, return the original exit code.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -n "${succeedOnFailure:-}" ]; then
|
2008-04-23 08:19:48 +01: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 17:10:52 +01:00
|
|
|
|
printf "%s" "$exitCode" > "$out/nix-support/failed"
|
2008-04-23 08:19:48 +01:00
|
|
|
|
exit 0
|
|
|
|
|
fi
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2008-04-23 08:19:48 +01:00
|
|
|
|
else
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook exitHook
|
2008-04-23 08:19:48 +01:00
|
|
|
|
fi
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2017-07-16 17:10:52 +01:00
|
|
|
|
exit "$exitCode"
|
2008-04-23 08:19:48 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trap "exitHandler" EXIT
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
######################################################################
|
2014-07-01 15:17:23 +01:00
|
|
|
|
# Helper functions.
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2007-11-17 14:34:27 +00:00
|
|
|
|
|
|
|
|
|
addToSearchPathWithCustomDelimiter() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local delimiter="$1"
|
|
|
|
|
local varName="$2"
|
|
|
|
|
local dir="$3"
|
2009-04-18 23:22:51 +01:00
|
|
|
|
if [ -d "$dir" ]; then
|
2017-08-09 06:20:56 +01:00
|
|
|
|
export "${varName}=${!varName:+${!varName}${delimiter}}${dir}"
|
2007-11-17 14:34:49 +00:00
|
|
|
|
fi
|
2007-11-17 14:34:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-04-18 23:22:51 +01:00
|
|
|
|
PATH_DELIMITER=':'
|
|
|
|
|
|
2008-04-23 08:19:48 +01:00
|
|
|
|
addToSearchPath() {
|
2007-11-17 14:34:49 +00:00
|
|
|
|
addToSearchPathWithCustomDelimiter "${PATH_DELIMITER}" "$@"
|
2007-11-17 14:34:27 +00:00
|
|
|
|
}
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2014-08-25 14:30:46 +01: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 06:20:56 +01:00
|
|
|
|
if [ "${NIX_NO_SELF_RPATH:-0}" != 1 ]; then
|
2014-08-25 14:30:46 +01:00
|
|
|
|
export NIX_LDFLAGS="-rpath $1/lib $NIX_LDFLAGS"
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -n "${NIX_LIB64_IN_SELF_RPATH:-}" ]; then
|
2014-08-25 14:30:46 +01:00
|
|
|
|
export NIX_LDFLAGS="-rpath $1/lib64 $NIX_LDFLAGS"
|
|
|
|
|
fi
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -n "${NIX_LIB32_IN_SELF_RPATH:-}" ]; then
|
2014-08-25 14:30:46 +01:00
|
|
|
|
export NIX_LDFLAGS="-rpath $1/lib32 $NIX_LDFLAGS"
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
}
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2016-02-18 21:52:44 +00:00
|
|
|
|
# Return success if the specified file is an ELF object.
|
|
|
|
|
isELF() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local fn="$1"
|
2017-06-30 01:28:27 +01:00
|
|
|
|
local fd
|
2016-02-18 21:52:44 +00:00
|
|
|
|
local magic
|
|
|
|
|
exec {fd}< "$fn"
|
2017-07-16 17:10:52 +01:00
|
|
|
|
read -r -n 4 -u "$fd" magic
|
2016-02-18 21:52:44 +00:00
|
|
|
|
exec {fd}<&-
|
2017-07-16 17:10:52 +01:00
|
|
|
|
if [[ "$magic" =~ ELF ]]; then return 0; else return 1; fi
|
2016-02-18 21:52:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-05-04 19:06:40 +01:00
|
|
|
|
# Return success if the specified file is a script (i.e. starts with
|
|
|
|
|
# "#!").
|
|
|
|
|
isScript() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local fn="$1"
|
2017-06-30 01:28:27 +01:00
|
|
|
|
local fd
|
2017-05-04 19:06:40 +01:00
|
|
|
|
local magic
|
|
|
|
|
exec {fd}< "$fn"
|
2017-07-16 17:10:52 +01:00
|
|
|
|
read -r -n 2 -u "$fd" magic
|
2017-05-04 19:06:40 +01:00
|
|
|
|
exec {fd}<&-
|
2017-07-16 17:10:52 +01:00
|
|
|
|
if [[ "$magic" =~ \#! ]]; then return 0; else return 1; fi
|
2017-05-04 19:06:40 +01:00
|
|
|
|
}
|
|
|
|
|
|
2017-07-10 16:59:14 +01:00
|
|
|
|
# printf unfortunately will print a trailing newline regardless
|
|
|
|
|
printLines() {
|
2017-11-17 18:26:21 +00:00
|
|
|
|
(( "$#" > 0 )) || return 0
|
2017-07-10 16:59:14 +01:00
|
|
|
|
printf '%s\n' "$@"
|
|
|
|
|
}
|
2016-02-18 21:52:44 +00:00
|
|
|
|
|
2017-07-25 23:48:47 +01:00
|
|
|
|
printWords() {
|
2017-11-17 18:26:21 +00:00
|
|
|
|
(( "$#" > 0 )) || return 0
|
2017-07-25 23:48:47 +01:00
|
|
|
|
printf '%s ' "$@"
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-01 15:17:23 +01:00
|
|
|
|
######################################################################
|
|
|
|
|
# Initialisation.
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
|
|
|
|
|
2015-12-03 10:49:32 +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 1 = 1970-01-01 00:00:01. We don't use 0 because it
|
|
|
|
|
# confuses some applications.
|
|
|
|
|
export SOURCE_DATE_EPOCH
|
|
|
|
|
: ${SOURCE_DATE_EPOCH:=1}
|
|
|
|
|
|
|
|
|
|
|
2009-04-18 23:22:51 +01: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 14:31:18 +01:00
|
|
|
|
# Set up the initial path.
|
|
|
|
|
PATH=
|
2014-07-01 16:39:07 +01:00
|
|
|
|
for i in $initialPath; do
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ "$i" = / ]; then i=; fi
|
2017-07-16 17:10:52 +01:00
|
|
|
|
addToSearchPath PATH "$i/bin"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
done
|
|
|
|
|
|
2017-09-20 00:10:49 +01:00
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
2008-02-20 23:02:41 +00:00
|
|
|
|
echo "initial path: $PATH"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Check that the pre-hook initialised SHELL.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -z "${SHELL:-}" ]; then echo "SHELL not set"; exit 1; fi
|
2017-07-16 17:10:52 +01:00
|
|
|
|
BASH="$SHELL"
|
|
|
|
|
export CONFIG_SHELL="$SHELL"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2014-07-01 15:17:23 +01:00
|
|
|
|
|
2016-05-25 18:36:50 +01:00
|
|
|
|
# Dummy implementation of the paxmark function. On Linux, this is
|
|
|
|
|
# overwritten by paxctl's setup hook.
|
|
|
|
|
paxmark() { true; }
|
|
|
|
|
|
|
|
|
|
|
2014-07-01 16:39:07 +01:00
|
|
|
|
# Execute the pre-hook.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -z "${shell:-}" ]; then export shell="$SHELL"; fi
|
2014-11-06 10:26:09 +00:00
|
|
|
|
runHook preHook
|
2014-07-01 16:39:07 +01:00
|
|
|
|
|
|
|
|
|
|
2006-08-07 14:31:18 +01: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 14:31:18 +01: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 17:20:20 +01:00
|
|
|
|
# Package accumulators
|
|
|
|
|
|
|
|
|
|
# shellcheck disable=SC2034
|
|
|
|
|
declare -a pkgsBuildBuild pkgsBuildHost pkgsBuildTarget
|
|
|
|
|
declare -a pkgsHostHost pkgsHostTarget
|
|
|
|
|
declare -a pkgsTargetTarget
|
|
|
|
|
|
|
|
|
|
declare -ra pkgBuildAccumVars=(pkgsBuildBuild pkgsBuildHost pkgsBuildTarget)
|
|
|
|
|
declare -ra pkgHostAccumVars=(pkgsHostHost pkgsHostTarget)
|
|
|
|
|
declare -ra pkgTargetAccumVars=(pkgsTargetTarget)
|
|
|
|
|
|
|
|
|
|
declare -ra pkgAccumVarVars=(pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Hooks
|
|
|
|
|
|
|
|
|
|
declare -a envBuildBuildHooks envBuildHostHooks envBuildTargetHooks
|
|
|
|
|
declare -a envHostHostHooks envHostTargetHooks
|
|
|
|
|
declare -a envTargetTargetHooks
|
|
|
|
|
|
|
|
|
|
declare -ra pkgBuildHookVars=(envBuildBuildHook envBuildHostHook envBuildTargetHook)
|
|
|
|
|
declare -ra pkgHostHookVars=(envHostHostHook envHostTargetHook)
|
|
|
|
|
declare -ra pkgTargetHookVars=(envTargetTargetHook)
|
|
|
|
|
|
|
|
|
|
declare -ra pkgHookVarVars=(pkgBuildHookVars pkgHostHookVars pkgTargetHookVars)
|
|
|
|
|
|
2017-08-03 17:45:06 +01: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 17:20:20 +01:00
|
|
|
|
|
|
|
|
|
# Propagated dep files
|
|
|
|
|
|
|
|
|
|
declare -ra propagatedBuildDepFiles=(
|
|
|
|
|
propagated-build-build-deps
|
|
|
|
|
propagated-native-build-inputs # Legacy name for back-compat
|
|
|
|
|
propagated-build-target-deps
|
|
|
|
|
)
|
|
|
|
|
declare -ra propagatedHostDepFiles=(
|
|
|
|
|
propagated-host-host-deps
|
|
|
|
|
propagated-build-inputs # Legacy name for back-compat
|
|
|
|
|
)
|
|
|
|
|
declare -ra propagatedTargetDepFiles=(
|
|
|
|
|
propagated-target-target-deps
|
|
|
|
|
)
|
|
|
|
|
declare -ra propagatedDepFilesVars=(
|
|
|
|
|
propagatedBuildDepFiles
|
|
|
|
|
propagatedHostDepFiles
|
|
|
|
|
propagatedTargetDepFiles
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Platform offsets: build = -1, host = 0, target = 1
|
|
|
|
|
declare -ra allPlatOffsets=(-1 0 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 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 08:19:48 +01: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 17:20:20 +01:00
|
|
|
|
local -r pkg="$1"
|
|
|
|
|
local -ri hostOffset="$2"
|
|
|
|
|
local -ri targetOffset="$3"
|
|
|
|
|
|
|
|
|
|
# Sanity check
|
|
|
|
|
(( "$hostOffset" <= "$targetOffset" )) || exit -1
|
|
|
|
|
|
|
|
|
|
local varVar="${pkgAccumVarVars[$hostOffset + 1]}"
|
|
|
|
|
local varRef="$varVar[\$targetOffset - \$hostOffset]"
|
|
|
|
|
local var="${!varRef}"
|
|
|
|
|
unset -v varVar varRef
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2017-07-25 22:48:50 +01: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.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local varSlice="$var[*]"
|
|
|
|
|
# ${..-} to hack around old bash empty array problem
|
|
|
|
|
case "${!varSlice-}" in
|
2017-07-25 22:48:50 +01:00
|
|
|
|
*" $pkg "*) return 0 ;;
|
|
|
|
|
esac
|
2017-08-09 06:20:56 +01:00
|
|
|
|
unset -v varSlice
|
2017-07-25 22:48:50 +01:00
|
|
|
|
|
2017-07-26 01:58:47 +01:00
|
|
|
|
eval "$var"'+=("$pkg")'
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2015-06-15 10:24:55 +01:00
|
|
|
|
if ! [ -e "$pkg" ]; then
|
|
|
|
|
echo "build input $pkg does not exist" >&2
|
|
|
|
|
exit 1
|
2014-06-25 16:01:29 +01: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 17:20:20 +01:00
|
|
|
|
# The current package's host and target offset together
|
|
|
|
|
# provide a <=-preserving homomorphism from the relative
|
|
|
|
|
# offsets to current offset
|
|
|
|
|
function mapOffset() {
|
|
|
|
|
local -ri inputOffset="$1"
|
|
|
|
|
if (( "$inputOffset" <= 0 )); then
|
|
|
|
|
local -ri outputOffset="$inputOffset + $hostOffset"
|
|
|
|
|
else
|
|
|
|
|
local -ri outputOffset="$inputOffset - 1 + $targetOffset"
|
|
|
|
|
fi
|
|
|
|
|
echo "$outputOffset"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Host offset relative to that of the package whose immediate
|
|
|
|
|
# dependencies we are currently exploring.
|
|
|
|
|
local -i relHostOffset
|
|
|
|
|
for relHostOffset in "${allPlatOffsets[@]}"; do
|
|
|
|
|
# `+ 1` so we start at 0 for valid index
|
|
|
|
|
local files="${propagatedDepFilesVars[$relHostOffset + 1]}"
|
|
|
|
|
|
|
|
|
|
# Host offset relative to the package currently being
|
|
|
|
|
# built---as absolute an offset as will be used.
|
|
|
|
|
local -i hostOffsetNext
|
|
|
|
|
hostOffsetNext="$(mapOffset relHostOffset)"
|
|
|
|
|
|
|
|
|
|
# Ensure we're in bounds relative to the package currently
|
|
|
|
|
# being built.
|
|
|
|
|
[[ "${allPlatOffsets[*]}" = *"$hostOffsetNext"* ]] || continue
|
|
|
|
|
|
|
|
|
|
# Target offset relative to the *host* offset of the package
|
|
|
|
|
# whose immediate dependencies we are currently exploring.
|
|
|
|
|
local -i relTargetOffset
|
|
|
|
|
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.
|
|
|
|
|
local -i targetOffsetNext
|
|
|
|
|
targetOffsetNext="$(mapOffset relTargetOffset)"
|
|
|
|
|
|
|
|
|
|
# Once again, ensure we're in bounds relative to the
|
|
|
|
|
# package currently being built.
|
|
|
|
|
[[ "${allPlatOffsets[*]}" = *"$targetOffsetNext"* ]] || continue
|
|
|
|
|
|
|
|
|
|
[[ -f "$pkg/nix-support/$file" ]] || continue
|
|
|
|
|
|
|
|
|
|
local pkgNext
|
|
|
|
|
for pkgNext in $(< "$pkg/nix-support/$file"); do
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
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 17:20:20 +01:00
|
|
|
|
# Make sure all are at least defined as empty
|
|
|
|
|
: ${depsBuildBuild=} ${depsBuildBuildPropagated=}
|
|
|
|
|
: ${nativeBuildInputs=} ${propagatedNativeBuildInputs=} ${defaultNativeBuildInputs=}
|
|
|
|
|
: ${depsBuildTarget=} ${depsBuildTargetPropagated=}
|
|
|
|
|
: ${depsHostHost=} ${depsHostHostPropagated=}
|
|
|
|
|
: ${buildInputs=} ${propagatedBuildInputs=} ${defaultBuildInputs=}
|
|
|
|
|
: ${depsTargetTarget=} ${depsTargetTargetPropagated=}
|
|
|
|
|
|
|
|
|
|
for pkg in $depsBuildBuild $depsBuildBuildPropagated; do
|
|
|
|
|
findInputs "$pkg" -1 -1
|
|
|
|
|
done
|
|
|
|
|
for pkg in $nativeBuildInputs $propagatedNativeBuildInputs; do
|
|
|
|
|
findInputs "$pkg" -1 0
|
|
|
|
|
done
|
|
|
|
|
for pkg in $depsBuildTarget $depsBuildTargetPropagated; do
|
|
|
|
|
findInputs "$pkg" -1 1
|
|
|
|
|
done
|
|
|
|
|
for pkg in $depsHostHost $depsHostHostPropagated; do
|
|
|
|
|
findInputs "$pkg" 0 0
|
|
|
|
|
done
|
|
|
|
|
for pkg in $buildInputs $propagatedBuildInputs ; do
|
|
|
|
|
findInputs "$pkg" 0 1
|
|
|
|
|
done
|
|
|
|
|
for pkg in $depsTargetTarget $depsTargetTargetPropagated; do
|
|
|
|
|
findInputs "$pkg" 1 1
|
|
|
|
|
done
|
|
|
|
|
# Default inputs must be processed last
|
|
|
|
|
for pkg in $defaultNativeBuildInputs; do
|
|
|
|
|
findInputs "$pkg" -1 0
|
|
|
|
|
done
|
|
|
|
|
for pkg in $defaultBuildInputs; do
|
|
|
|
|
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"
|
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 17:20:20 +01:00
|
|
|
|
local -ri hostOffset="$2"
|
|
|
|
|
local -ri targetOffset="$3"
|
|
|
|
|
|
|
|
|
|
# Sanity check
|
|
|
|
|
(( "$hostOffset" <= "$targetOffset" )) || exit -1
|
2017-11-08 18:43:28 +00:00
|
|
|
|
|
2015-06-15 10:24:55 +01:00
|
|
|
|
if [ -f "$pkg" ]; then
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local oldOpts="$(shopt -po nounset)"
|
|
|
|
|
set +u
|
2015-06-15 10:24:55 +01:00
|
|
|
|
source "$pkg"
|
2017-08-09 06:20:56 +01:00
|
|
|
|
eval "$oldOpts"
|
2006-08-07 14:31:18 +01: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 17:20:20 +01:00
|
|
|
|
# Only dependencies whose host platform is guaranteed to match the
|
|
|
|
|
# build platform are included here. That would be `depsBuild*`,
|
2017-08-28 16:33:08 +01:00
|
|
|
|
# and legacy `nativeBuildInputs`, in general. If we aren't cross
|
|
|
|
|
# compiling, however, everything can be put on the PATH. To ease
|
|
|
|
|
# the transition, we do include everything in thatcase.
|
|
|
|
|
#
|
|
|
|
|
# TODO(@Ericson2314): Don't special-case native compilation
|
2018-05-13 16:31:24 +01:00
|
|
|
|
if [[ ( -z "${strictDeps-}" || "$hostOffset" -le -1 ) && -d "$pkg/bin" ]]; then
|
2017-07-11 21:04:14 +01:00
|
|
|
|
addToSearchPath _PATH "$pkg/bin"
|
2016-02-28 00:13:15 +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 17:20:20 +01:00
|
|
|
|
if [[ -f "$pkg/nix-support/setup-hook" ]]; then
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local oldOpts="$(shopt -po nounset)"
|
|
|
|
|
set +u
|
2015-06-15 10:24:55 +01:00
|
|
|
|
source "$pkg/nix-support/setup-hook"
|
2017-08-09 06:20:56 +01:00
|
|
|
|
eval "$oldOpts"
|
2006-08-07 14:31:18 +01: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 17:20:20 +01:00
|
|
|
|
_activatePkgs() {
|
|
|
|
|
local -i hostOffset targetOffset
|
|
|
|
|
local pkg
|
|
|
|
|
|
|
|
|
|
for hostOffset in "${allPlatOffsets[@]}"; do
|
|
|
|
|
local pkgsVar="${pkgAccumVarVars[$hostOffset + 1]}"
|
|
|
|
|
for targetOffset in "${allPlatOffsets[@]}"; do
|
|
|
|
|
(( "$hostOffset" <= "$targetOffset" )) || continue
|
|
|
|
|
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 17:20:20 +01: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 17:20:20 +01:00
|
|
|
|
# Run the package setup hooks and build _PATH
|
|
|
|
|
_activatePkgs
|
2012-01-19 15:56:17 +00:00
|
|
|
|
|
2006-08-07 14:31:18 +01:00
|
|
|
|
# Set the relevant environment variables to point to the build inputs
|
|
|
|
|
# found above.
|
2017-07-06 22:19:53 +01: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 17:20:20 +01: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() {
|
|
|
|
|
local -i depHostOffset depTargetOffset
|
|
|
|
|
local pkg
|
|
|
|
|
|
|
|
|
|
for depHostOffset in "${allPlatOffsets[@]}"; do
|
|
|
|
|
local hookVar="${pkgHookVarVars[$depHostOffset + 1]}"
|
|
|
|
|
local pkgsVar="${pkgAccumVarVars[$depHostOffset + 1]}"
|
|
|
|
|
for depTargetOffset in "${allPlatOffsets[@]}"; do
|
|
|
|
|
(( "$depHostOffset" <= "$depTargetOffset" )) || continue
|
|
|
|
|
local hookRef="${hookVar}[$depTargetOffset - $depHostOffset]"
|
2018-05-13 16:31:24 +01:00
|
|
|
|
if [[ -z "${strictDeps-}" ]]; then
|
2017-08-28 16:33:08 +01: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 \
|
|
|
|
|
${pkgsBuildBuild+"${pkgsBuildBuild[@]}"} \
|
|
|
|
|
${pkgsBuildHost+"${pkgsBuildHost[@]}"} \
|
|
|
|
|
${pkgsBuildTarget+"${pkgsBuildTarget[@]}"} \
|
|
|
|
|
${pkgsHostHost+"${pkgsHostHost[@]}"} \
|
|
|
|
|
${pkgsHostTarget+"${pkgsHostTarget[@]}"} \
|
|
|
|
|
${pkgsTargetTarget+"${pkgsTargetTarget[@]}"}
|
|
|
|
|
do
|
|
|
|
|
runHook "${!hookRef}" "$pkg"
|
|
|
|
|
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 17:20:20 +01: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 17:20:20 +01:00
|
|
|
|
# Run the package-specific hooks set by the setup-hook scripts.
|
|
|
|
|
_addToEnv
|
2009-11-18 18:16:35 +00:00
|
|
|
|
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2014-08-24 18:05:56 +01:00
|
|
|
|
_addRpathPrefix "$out"
|
2006-08-07 14:31:18 +01: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 06:20:56 +01:00
|
|
|
|
if [ -z "${prefix:-}" ]; then
|
2017-07-16 17:10:52 +01:00
|
|
|
|
prefix="$out";
|
2006-12-28 21:12:44 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ "${useTempPrefix:-}" = 1 ]; then
|
2006-12-28 21:12:44 +00:00
|
|
|
|
prefix="$NIX_BUILD_TOP/tmp_prefix";
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
PATH="${_PATH-}${_PATH:+${PATH:+:}}$PATH"
|
2017-09-20 00:10:49 +01:00
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
2008-02-20 23:02:41 +00:00
|
|
|
|
echo "final path: $PATH"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
2009-01-19 20:31:02 +00:00
|
|
|
|
# Make GNU Make produce nested output.
|
|
|
|
|
export NIX_INDENT_MAKE=1
|
|
|
|
|
|
|
|
|
|
|
2010-06-23 15:34:59 +01: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.
|
|
|
|
|
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -z "${NIX_BUILD_CORES:-}" ]; then
|
2010-06-23 15:34:59 +01:00
|
|
|
|
NIX_BUILD_CORES="1"
|
2012-01-19 16:14:09 +00:00
|
|
|
|
elif [ "$NIX_BUILD_CORES" -le 0 ]; then
|
2010-06-23 15:34:59 +01:00
|
|
|
|
NIX_BUILD_CORES=$(nproc 2>/dev/null || true)
|
|
|
|
|
if expr >/dev/null 2>&1 "$NIX_BUILD_CORES" : "^[0-9][0-9]*$"; then
|
|
|
|
|
:
|
|
|
|
|
else
|
|
|
|
|
NIX_BUILD_CORES="1"
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
export NIX_BUILD_CORES
|
|
|
|
|
|
|
|
|
|
|
2016-02-03 12:59:10 +00:00
|
|
|
|
# Prevent OpenSSL-based applications from using certificates in
|
|
|
|
|
# /etc/ssl.
|
2016-09-01 19:50:08 +01:00
|
|
|
|
# Leave it in shells for convenience.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -z "${SSL_CERT_FILE:-}" ] && [ -z "${IN_NIX_SHELL:-}" ]; 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.
|
|
|
|
|
|
|
|
|
|
|
2018-05-06 20:58:03 +01:00
|
|
|
|
substituteStream() {
|
|
|
|
|
local var=$1
|
|
|
|
|
shift
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2017-07-12 16:56:43 +01:00
|
|
|
|
while (( "$#" )); do
|
|
|
|
|
case "$1" in
|
|
|
|
|
--replace)
|
2017-07-16 17:10:52 +01:00
|
|
|
|
pattern="$2"
|
|
|
|
|
replacement="$3"
|
2017-07-12 16:56:43 +01:00
|
|
|
|
shift 3
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
--subst-var)
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local varName="$2"
|
2017-07-12 16:56:43 +01:00
|
|
|
|
shift 2
|
|
|
|
|
# check if the used nix attribute name is a valid bash name
|
2017-07-16 17:10:52 +01:00
|
|
|
|
if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
|
2018-05-06 20:58:03 +01:00
|
|
|
|
echo "substituteStream(): ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2
|
2017-08-31 15:20:51 +01:00
|
|
|
|
return 1
|
2017-07-12 16:56:43 +01:00
|
|
|
|
fi
|
2018-07-08 16:59:57 +01:00
|
|
|
|
if [ -z ${!varName+x} ]; then
|
|
|
|
|
echo "substituteStream(): ERROR: variable \$$varName is unset" >&2
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
2017-07-16 17:10:52 +01:00
|
|
|
|
pattern="@$varName@"
|
|
|
|
|
replacement="${!varName}"
|
2017-07-12 16:56:43 +01:00
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
--subst-var-by)
|
2017-07-16 17:10:52 +01:00
|
|
|
|
pattern="@$2@"
|
|
|
|
|
replacement="$3"
|
2017-07-12 16:56:43 +01:00
|
|
|
|
shift 3
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
*)
|
2018-05-06 20:58:03 +01:00
|
|
|
|
echo "substituteStream(): ERROR: Invalid command line argument: $1" >&2
|
2017-07-12 16:56:43 +01:00
|
|
|
|
return 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2018-05-06 20:58:03 +01:00
|
|
|
|
eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}'
|
2006-12-27 18:14:57 +00:00
|
|
|
|
done
|
|
|
|
|
|
2018-05-06 20:58:03 +01:00
|
|
|
|
printf "%s" "${!var}"
|
2006-12-27 18:14:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-05-06 20:58:03 +01:00
|
|
|
|
consumeEntire() {
|
|
|
|
|
# read returns non-0 on EOF, so we want read to fail
|
|
|
|
|
if IFS='' read -r -N 0 $1; then
|
|
|
|
|
echo "consumeEntire(): ERROR: Input null bytes, won't process" >&2
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
2006-12-27 18:14:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-05-06 20:58:03 +01: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
|
|
|
|
|
substituteStream content "$@" > "$output"
|
|
|
|
|
}
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
|
|
|
|
substituteInPlace() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local fileName="$1"
|
2006-12-27 18:14:57 +00:00
|
|
|
|
shift
|
|
|
|
|
substitute "$fileName" "$fileName" "$@"
|
|
|
|
|
}
|
|
|
|
|
|
2018-05-06 20:58:03 +01:00
|
|
|
|
_allFlags() {
|
|
|
|
|
for varName in $(awk 'BEGIN { for (v in ENVIRON) if (v ~ /^[a-z][a-zA-Z0-9_]*$/) print v }'); do
|
|
|
|
|
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
|
|
|
|
printf "@%s@ -> %q\n" "${varName}" "${!varName}"
|
|
|
|
|
fi
|
|
|
|
|
args+=("--subst-var" "$varName")
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
substituteAllStream() {
|
|
|
|
|
local -a args=()
|
|
|
|
|
_allFlags
|
|
|
|
|
|
|
|
|
|
substituteStream "$1" "${args[@]}"
|
|
|
|
|
}
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2017-08-31 15:20:51 +01: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 17:10:52 +01:00
|
|
|
|
local input="$1"
|
|
|
|
|
local output="$2"
|
2007-11-17 14:34:27 +00:00
|
|
|
|
|
2018-05-06 20:58:03 +01:00
|
|
|
|
local -a args=()
|
|
|
|
|
_allFlags
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2016-04-29 10:22:47 +01:00
|
|
|
|
substitute "$input" "$output" "${args[@]}"
|
2007-11-17 14:34:27 +00:00
|
|
|
|
}
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
|
|
|
|
|
2011-07-28 21:28:37 +01:00
|
|
|
|
substituteAllInPlace() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local fileName="$1"
|
2011-07-28 21:28:37 +01:00
|
|
|
|
shift
|
|
|
|
|
substituteAll "$fileName" "$fileName" "$@"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-08-07 14:31:18 +01: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 06:20:56 +01:00
|
|
|
|
if [ "${noDumpEnvVars:-0}" != 1 ]; then
|
2015-10-06 19:31:26 +01:00
|
|
|
|
export > "$NIX_BUILD_TOP/env-vars" || true
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2016-10-12 21:29:38 +01:00
|
|
|
|
# Utility function: echo the base name of the given path, with the
|
2006-08-07 14:31:18 +01:00
|
|
|
|
# prefix `HASH-' removed, if present.
|
|
|
|
|
stripHash() {
|
2017-07-12 01:23:06 +01:00
|
|
|
|
local strippedName
|
|
|
|
|
# On separate line for `set -e`
|
2017-07-16 17:10:52 +01:00
|
|
|
|
strippedName="$(basename "$1")"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
if echo "$strippedName" | grep -q '^[a-z0-9]\{32\}-'; then
|
2016-10-11 17:09:56 +01:00
|
|
|
|
echo "$strippedName" | cut -c34-
|
2016-10-12 21:29:38 +01:00
|
|
|
|
else
|
|
|
|
|
echo "$strippedName"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-07-08 12:47:09 +01:00
|
|
|
|
unpackCmdHooks+=(_defaultUnpack)
|
2014-06-30 12:48:29 +01:00
|
|
|
|
_defaultUnpack() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local fn="$1"
|
2014-07-08 13:14:28 +01:00
|
|
|
|
|
|
|
|
|
if [ -d "$fn" ]; then
|
2014-06-30 12:21:30 +01:00
|
|
|
|
|
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.
|
2018-01-25 05:58:57 +00:00
|
|
|
|
cp -pr --reflink=auto -- "$fn" "$(stripHash "$fn")"
|
2014-06-30 12:21:30 +01:00
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
2014-07-08 13:14:28 +01:00
|
|
|
|
case "$fn" in
|
2014-06-30 12:21:30 +01:00
|
|
|
|
*.tar.xz | *.tar.lzma)
|
|
|
|
|
# Don't rely on tar knowing about .xz.
|
2014-07-08 13:14:28 +01:00
|
|
|
|
xz -d < "$fn" | tar xf -
|
2014-06-30 12:21:30 +01:00
|
|
|
|
;;
|
|
|
|
|
*.tar | *.tar.* | *.tgz | *.tbz2)
|
|
|
|
|
# GNU tar can automatically select the decompression method
|
|
|
|
|
# (info "(tar) gzip").
|
2014-07-08 13:14:28 +01:00
|
|
|
|
tar xf "$fn"
|
2014-06-30 12:21:30 +01:00
|
|
|
|
;;
|
|
|
|
|
*)
|
2014-06-30 12:48:29 +01:00
|
|
|
|
return 1
|
2014-06-30 12:21:30 +01:00
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
fi
|
2014-06-30 12:48:29 +01:00
|
|
|
|
}
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2014-06-30 12:48:29 +01:00
|
|
|
|
|
|
|
|
|
unpackFile() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
curSrc="$1"
|
2014-06-30 12:48:29 +01:00
|
|
|
|
header "unpacking source archive $curSrc" 3
|
2014-07-08 13:14:28 +01:00
|
|
|
|
if ! runOneHook unpackCmd "$curSrc"; then
|
2014-06-30 12:48:29 +01:00
|
|
|
|
echo "do not know how to unpack source archive $curSrc"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2006-08-07 14:31:18 +01: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 06:20:56 +01:00
|
|
|
|
if [ -z "${srcs:-}" ]; then
|
|
|
|
|
if [ -z "${src:-}" ]; then
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2016
|
2006-08-07 14:31:18 +01:00
|
|
|
|
echo 'variable $src or $srcs should point to the source'
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2017-07-16 17:10:52 +01:00
|
|
|
|
srcs="$src"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# 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 14:31:18 +01:00
|
|
|
|
dirsBefore="$dirsBefore $i "
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# Unpack all source archives.
|
|
|
|
|
for i in $srcs; do
|
2017-07-12 01:23:06 +01:00
|
|
|
|
unpackFile "$i"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# Find the source directory.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
|
|
|
|
|
# set to empty if unset
|
|
|
|
|
: ${sourceRoot=}
|
|
|
|
|
|
|
|
|
|
if [ -n "${setSourceRoot:-}" ]; then
|
2014-06-30 12:48:29 +01:00
|
|
|
|
runOneHook setSourceRoot
|
2012-01-19 16:14:09 +00:00
|
|
|
|
elif [ -z "$sourceRoot" ]; then
|
2006-08-07 14:31:18 +01:00
|
|
|
|
for i in *; do
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -d "$i" ]; then
|
2006-08-07 14:31:18 +01:00
|
|
|
|
case $dirsBefore in
|
|
|
|
|
*\ $i\ *)
|
|
|
|
|
;;
|
|
|
|
|
*)
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -n "$sourceRoot" ]; then
|
2006-08-07 14:31:18 +01:00
|
|
|
|
echo "unpacker produced multiple directories"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2017-07-16 17:10:52 +01:00
|
|
|
|
sourceRoot="$i"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ -z "$sourceRoot" ]; then
|
2006-08-07 14:31:18 +01: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 06:20:56 +01:00
|
|
|
|
if [ "${dontMakeSourcesWritable:-0}" != 1 ]; then
|
2018-02-15 16:50:24 +00:00
|
|
|
|
chmod -R u+w -- "$sourceRoot"
|
2006-08-07 14:31:18 +01: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 23:20:25 +01:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postUnpack
|
2006-08-07 14:31:18 +01: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
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
for i in ${patches:-}; do
|
2006-08-07 14:31:18 +01:00
|
|
|
|
header "applying patch $i" 3
|
2006-12-27 18:14:57 +00:00
|
|
|
|
local uncompress=cat
|
2014-10-09 20:41:56 +01: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 14:45:21 +01: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
|
2013-06-27 15:34:31 +01:00
|
|
|
|
# "2>&1" is a hack to make patch fail if the decompressor fails (nonexistent patch, etc.)
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2086
|
2014-10-09 20:41:56 +01:00
|
|
|
|
$uncompress < "$i" 2>&1 | patch ${patchFlags:--p1}
|
2006-08-07 14:31:18 +01:00
|
|
|
|
done
|
2008-03-18 11:03:35 +00:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postPatch
|
2006-08-07 14:31:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fixLibtool() {
|
2008-06-11 15:08:01 +01:00
|
|
|
|
sed -i -e 's^eval sys_lib_.*search_path=.*^^' "$1"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
configurePhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preConfigure
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# set to empty if unset
|
|
|
|
|
: ${configureScript=}
|
|
|
|
|
: ${configureFlags=}
|
|
|
|
|
|
2017-07-16 17:10:52 +01:00
|
|
|
|
if [[ -z "$configureScript" && -x ./configure ]]; then
|
2006-08-07 14:31:18 +01:00
|
|
|
|
configureScript=./configure
|
|
|
|
|
fi
|
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -z "${dontFixLibtool:-}" ]; then
|
2017-07-12 01:23:06 +01:00
|
|
|
|
local i
|
|
|
|
|
find . -iname "ltmain.sh" -print0 | while IFS='' read -r -d '' i; do
|
2006-08-07 14:31:18 +01:00
|
|
|
|
echo "fixing libtool script $i"
|
2017-07-12 01:23:06 +01:00
|
|
|
|
fixLibtool "$i"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then
|
2007-11-17 14:34:27 +00:00
|
|
|
|
configureFlags="${prefixKey:---prefix=}$prefix $configureFlags"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2008-02-13 18:27:19 +00:00
|
|
|
|
# Add --disable-dependency-tracking to speed up some builds.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -z "${dontAddDisableDepTrack:-}" ]; then
|
2016-03-31 07:56:18 +01:00
|
|
|
|
if [ -f "$configureScript" ] && grep -q dependency-tracking "$configureScript"; then
|
2008-03-18 10:26:43 +00:00
|
|
|
|
configureFlags="--disable-dependency-tracking $configureFlags"
|
2008-02-13 18:27:19 +00:00
|
|
|
|
fi
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2009-04-21 23:40:12 +01:00
|
|
|
|
# By default, disable static builds.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -z "${dontDisableStatic:-}" ]; then
|
2016-03-31 07:56:18 +01:00
|
|
|
|
if [ -f "$configureScript" ] && grep -q enable-static "$configureScript"; then
|
2009-04-21 23:40:12 +01:00
|
|
|
|
configureFlags="--disable-static $configureFlags"
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
2015-12-30 10:11:33 +00:00
|
|
|
|
if [ -n "$configureScript" ]; then
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# Old bash empty array hack
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local flagsArray=(
|
|
|
|
|
$configureFlags ${configureFlagsArray+"${configureFlagsArray[@]}"}
|
|
|
|
|
)
|
2017-07-13 21:31:39 +01:00
|
|
|
|
echoCmd 'configure flags' "${flagsArray[@]}"
|
2017-07-12 01:23:06 +01: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 14:31:18 +01:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postConfigure
|
2006-08-07 14:31:18 +01: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
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# set to empty if unset
|
|
|
|
|
: ${makeFlags=}
|
|
|
|
|
|
2018-03-15 00:00:01 +00:00
|
|
|
|
if [[ -z "$makeFlags" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then
|
2008-02-20 23:02:41 +00:00
|
|
|
|
echo "no Makefile, doing nothing"
|
2015-12-30 10:11:33 +00:00
|
|
|
|
else
|
2018-03-15 00:00:04 +00:00
|
|
|
|
foundMakefile=1
|
|
|
|
|
|
2015-12-30 10:11:33 +00:00
|
|
|
|
# See https://github.com/NixOS/nixpkgs/pull/1354#issuecomment-31260409
|
|
|
|
|
makeFlags="SHELL=$SHELL $makeFlags"
|
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# Old bash empty array hack
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local flagsArray=(
|
|
|
|
|
${enableParallelBuilding:+-j${NIX_BUILD_CORES} -l${NIX_BUILD_CORES}}
|
|
|
|
|
$makeFlags ${makeFlagsArray+"${makeFlagsArray[@]}"}
|
|
|
|
|
$buildFlags ${buildFlagsArray+"${buildFlagsArray[@]}"}
|
|
|
|
|
)
|
2017-07-12 01:23:06 +01:00
|
|
|
|
|
2017-07-13 21:31:39 +01:00
|
|
|
|
echoCmd 'build flags' "${flagsArray[@]}"
|
2017-07-12 01:23:06 +01: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 14:31:18 +01: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
|
|
|
|
|
echo "no Makefile or custom buildPhase, doing nothing"
|
|
|
|
|
runHook postCheck
|
|
|
|
|
return
|
|
|
|
|
fi
|
2017-07-12 01:23:06 +01: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
|
|
|
|
|
checkTarget=check
|
|
|
|
|
elif make -n ${makefile:+-f $makefile} test >/dev/null 2>&1; then
|
|
|
|
|
checkTarget=test
|
|
|
|
|
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=(
|
|
|
|
|
${enableParallelBuilding:+-j${NIX_BUILD_CORES} -l${NIX_BUILD_CORES}}
|
|
|
|
|
$makeFlags ${makeFlagsArray+"${makeFlagsArray[@]}"}
|
|
|
|
|
${checkFlags:-VERBOSE=y} ${checkFlagsArray+"${checkFlagsArray[@]}"}
|
|
|
|
|
${checkTarget}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
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 14:31:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
installPhase() {
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook preInstall
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2014-08-25 14:30:46 +01:00
|
|
|
|
if [ -n "$prefix" ]; then
|
|
|
|
|
mkdir -p "$prefix"
|
|
|
|
|
fi
|
2006-12-27 18:14:57 +00:00
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# Old bash empty array hack
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local flagsArray=(
|
|
|
|
|
$makeFlags ${makeFlagsArray+"${makeFlagsArray[@]}"}
|
|
|
|
|
$installFlags ${installFlagsArray+"${installFlagsArray[@]}"}
|
2018-03-15 00:00:02 +00:00
|
|
|
|
${installTargets:-install}
|
2017-08-09 06:20:56 +01:00
|
|
|
|
)
|
2017-07-12 01:23:06 +01:00
|
|
|
|
|
2017-07-13 21:31:39 +01:00
|
|
|
|
echoCmd 'install flags' "${flagsArray[@]}"
|
2017-07-12 01:23:06 +01:00
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
|
|
|
|
unset flagsArray
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postInstall
|
2006-12-27 18:14:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-06-25 15:47:58 +01: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 17:20:20 +01:00
|
|
|
|
local output
|
2014-06-25 15:47:58 +01:00
|
|
|
|
for output in $outputs; do
|
2014-07-08 13:15:44 +01:00
|
|
|
|
if [ -e "${!output}" ]; then chmod -R u+w "${!output}"; fi
|
2014-06-25 15:47:58 +01:00
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
runHook preFixup
|
2014-01-14 13:13:31 +00:00
|
|
|
|
|
2014-06-25 15:47:58 +01:00
|
|
|
|
# Apply fixup to each output.
|
|
|
|
|
local output
|
|
|
|
|
for output in $outputs; do
|
2017-07-16 17:10:52 +01:00
|
|
|
|
prefix="${!output}" runHook fixupOutput
|
2014-06-25 15:47:58 +01:00
|
|
|
|
done
|
|
|
|
|
|
2015-04-18 14:46:00 +01: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 17:20:20 +01:00
|
|
|
|
# Propagate dependencies & setup hook 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]}"
|
2014-08-24 17:37:23 +01: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 17:20:20 +01:00
|
|
|
|
[[ "${!propagatedInputsSlice}" ]] || continue
|
2014-06-25 15:47:58 +01:00
|
|
|
|
|
2017-11-17 18:26:21 +00:00
|
|
|
|
mkdir -p "${!outputDev}/nix-support"
|
|
|
|
|
# shellcheck disable=SC2086
|
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 17:20:20 +01:00
|
|
|
|
printWords ${!propagatedInputsSlice} > "${!outputDev}/nix-support/$propagatedInputsFile"
|
|
|
|
|
done
|
2014-06-25 15:47:58 +01:00
|
|
|
|
|
2017-11-17 18:26:21 +00:00
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -n "${setupHook:-}" ]; then
|
2015-04-18 14:46:00 +01:00
|
|
|
|
mkdir -p "${!outputDev}/nix-support"
|
|
|
|
|
substituteAll "$setupHook" "${!outputDev}/nix-support/setup-hook"
|
2014-06-25 15:47:58 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2018-05-06 20:58:03 +01:00
|
|
|
|
# TODO(@Ericson2314): Remove after https://github.com/NixOS/nixpkgs/pull/31414
|
|
|
|
|
if [ -n "${setupHooks:-}" ]; then
|
|
|
|
|
mkdir -p "${!outputDev}/nix-support"
|
|
|
|
|
local hook
|
|
|
|
|
for hook in $setupHooks; do
|
|
|
|
|
local content
|
|
|
|
|
consumeEntire content < "$hook"
|
|
|
|
|
substituteAllStream content >> "${!outputDev}/nix-support/setup-hook"
|
|
|
|
|
unset -v content
|
|
|
|
|
done
|
|
|
|
|
unset -v hook
|
|
|
|
|
fi
|
|
|
|
|
|
2015-04-18 14:46:00 +01:00
|
|
|
|
# Propagate user-env packages into the output with binaries, TODO?
|
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -n "${propagatedUserEnvPkgs:-}" ]; then
|
2015-04-18 14:46:00 +01:00
|
|
|
|
mkdir -p "${!outputBin}/nix-support"
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-07-25 23:48:47 +01:00
|
|
|
|
printWords $propagatedUserEnvPkgs > "${!outputBin}/nix-support/propagated-user-env-packages"
|
2014-06-25 15:47:58 +01:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
runHook postFixup
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-05-01 22:00:30 +01:00
|
|
|
|
installCheckPhase() {
|
|
|
|
|
runHook preInstallCheck
|
|
|
|
|
|
2018-03-15 00:00:04 +00:00
|
|
|
|
if [[ -z "${foundMakefile:-}" ]]; then
|
|
|
|
|
echo "no Makefile or custom buildPhase, doing nothing"
|
|
|
|
|
#TODO(@oxij): should flagsArray influence make -n?
|
|
|
|
|
elif [[ -z "${installCheckTarget:-}" ]] \
|
|
|
|
|
&& ! make -n ${makefile:+-f $makefile} ${installCheckTarget:-installcheck} >/dev/null 2>&1; then
|
|
|
|
|
echo "no installcheck target in ${makefile:-Makefile}, doing nothing"
|
|
|
|
|
else
|
|
|
|
|
# Old bash empty array hack
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
local flagsArray=(
|
|
|
|
|
${enableParallelBuilding:+-j${NIX_BUILD_CORES} -l${NIX_BUILD_CORES}}
|
|
|
|
|
$makeFlags ${makeFlagsArray+"${makeFlagsArray[@]}"}
|
|
|
|
|
$installCheckFlags ${installCheckFlagsArray+"${installCheckFlagsArray[@]}"}
|
|
|
|
|
${installCheckTarget:-installcheck}
|
|
|
|
|
)
|
2017-07-12 01:23:06 +01:00
|
|
|
|
|
2018-03-15 00:00:04 +00:00
|
|
|
|
echoCmd 'installcheck flags' "${flagsArray[@]}"
|
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
|
|
|
|
unset flagsArray
|
|
|
|
|
fi
|
2012-05-01 22:00:30 +01: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
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
# Old bash empty array hack
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local flagsArray=(
|
|
|
|
|
$distFlags ${distFlagsArray+"${distFlagsArray[@]}"} ${distTarget:-dist}
|
|
|
|
|
)
|
2017-07-12 01:23:06 +01:00
|
|
|
|
|
|
|
|
|
echo 'dist flags: %q' "${flagsArray[@]}"
|
|
|
|
|
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ "${dontCopyDist:-0}" != 1 ]; then
|
2012-01-18 20:16:00 +00:00
|
|
|
|
mkdir -p "$out/tarballs"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
|
|
|
|
|
# Note: don't quote $tarballs, since we explicitly permit
|
|
|
|
|
# wildcards in there.
|
2017-07-12 01:23:06 +01:00
|
|
|
|
# shellcheck disable=SC2086
|
2017-07-16 17:10:52 +01:00
|
|
|
|
cp -pvd ${tarballs:-*.tar.gz} "$out/tarballs"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2009-02-01 21:28:02 +00:00
|
|
|
|
runHook postDist
|
2006-08-07 14:31:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
showPhaseHeader() {
|
2017-07-16 17:10:52 +01:00
|
|
|
|
local phase="$1"
|
|
|
|
|
case "$phase" in
|
2008-02-20 23:02:41 +00:00
|
|
|
|
unpackPhase) header "unpacking sources";;
|
|
|
|
|
patchPhase) header "patching sources";;
|
|
|
|
|
configurePhase) header "configuring";;
|
|
|
|
|
buildPhase) header "building";;
|
|
|
|
|
checkPhase) header "running tests";;
|
|
|
|
|
installPhase) header "installing";;
|
|
|
|
|
fixupPhase) header "post-installation fixup";;
|
2012-05-01 22:00:30 +01:00
|
|
|
|
installCheckPhase) header "running install tests";;
|
2008-02-20 23:02:41 +00:00
|
|
|
|
*) header "$phase";;
|
|
|
|
|
esac
|
2006-08-07 14:31:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
genericBuild() {
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -f "${buildCommandPath:-}" ]; then
|
|
|
|
|
local oldOpts="$(shopt -po nounset)"
|
|
|
|
|
set +u
|
|
|
|
|
source "$buildCommandPath"
|
|
|
|
|
eval "$oldOpts"
|
2016-05-29 14:25:09 +01:00
|
|
|
|
return
|
|
|
|
|
fi
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [ -n "${buildCommand:-}" ]; then
|
|
|
|
|
local oldOpts="$(shopt -po nounset)"
|
|
|
|
|
set +u
|
2006-12-27 18:14:57 +00:00
|
|
|
|
eval "$buildCommand"
|
2017-08-09 06:20:56 +01:00
|
|
|
|
eval "$oldOpts"
|
2006-12-27 18:14:57 +00:00
|
|
|
|
return
|
|
|
|
|
fi
|
|
|
|
|
|
2017-08-09 06:20:56 +01: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
|
|
|
|
|
|
|
|
|
|
for curPhase in $phases; do
|
2017-08-09 06:20:56 +01:00
|
|
|
|
if [[ "$curPhase" = buildPhase && -n "${dontBuild:-}" ]]; then continue; fi
|
|
|
|
|
if [[ "$curPhase" = checkPhase && -z "${doCheck:-}" ]]; then continue; fi
|
|
|
|
|
if [[ "$curPhase" = installPhase && -n "${dontInstall:-}" ]]; then continue; fi
|
|
|
|
|
if [[ "$curPhase" = fixupPhase && -n "${dontFixup:-}" ]]; then continue; fi
|
|
|
|
|
if [[ "$curPhase" = installCheckPhase && -z "${doInstallCheck:-}" ]]; then continue; fi
|
|
|
|
|
if [[ "$curPhase" = distPhase && -z "${doDist:-}" ]]; then continue; fi
|
|
|
|
|
|
2017-09-07 21:24:27 +01:00
|
|
|
|
if [[ -n $NIX_LOG_FD ]]; then
|
|
|
|
|
echo "@nix { \"action\": \"setPhase\", \"phase\": \"$curPhase\" }" >&$NIX_LOG_FD
|
|
|
|
|
fi
|
|
|
|
|
|
2008-02-20 23:02:41 +00:00
|
|
|
|
showPhaseHeader "$curPhase"
|
2006-08-07 14:31:18 +01:00
|
|
|
|
dumpVars
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2014-01-07 08:43:39 +00:00
|
|
|
|
# Evaluate the variable named $curPhase if it exists, otherwise the
|
|
|
|
|
# function named $curPhase.
|
2017-08-09 06:20:56 +01:00
|
|
|
|
local oldOpts="$(shopt -po nounset)"
|
|
|
|
|
set +u
|
2014-01-07 08:43:39 +00:00
|
|
|
|
eval "${!curPhase:-$curPhase}"
|
2017-08-09 06:20:56 +01:00
|
|
|
|
eval "$oldOpts"
|
2008-02-20 23:02:41 +00:00
|
|
|
|
|
2012-01-19 16:14:09 +00:00
|
|
|
|
if [ "$curPhase" = unpackPhase ]; then
|
2008-02-20 23:02:41 +00:00
|
|
|
|
cd "${sourceRoot:-.}"
|
|
|
|
|
fi
|
2006-08-07 14:31:18 +01: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 14:31:18 +01:00
|
|
|
|
dumpVars
|
2017-08-09 06:20:56 +01:00
|
|
|
|
|
|
|
|
|
# Disable nounset for nix-shell.
|
|
|
|
|
set +u
|