Merge pull request #175649 from Artturin/opt-in-structured-attrs
stdenv: support opt-in __structuredAttrs
This commit is contained in:
commit
16f5747575
@ -990,6 +990,32 @@ Convenience function for `makeWrapper` that replaces `<\executable\>` with a wra
|
||||
|
||||
If you will apply it multiple times, it will overwrite the wrapper file and you will end up with double wrapping, which should be avoided.
|
||||
|
||||
### `prependToVar` \<variableName\> \<elements...\> {#fun-prependToVar}
|
||||
|
||||
Prepend elements to a variable.
|
||||
|
||||
Example:
|
||||
|
||||
```shellSession
|
||||
$ configureFlags="--disable-static"
|
||||
$ prependToVar configureFlags --disable-dependency-tracking --enable-foo
|
||||
$ echo $configureFlags
|
||||
--disable-dependency-tracking --enable-foo --disable-static
|
||||
```
|
||||
|
||||
### `appendToVar` \<variableName\> \<elements...\> {#fun-appendToVar}
|
||||
|
||||
Append elements to a variable.
|
||||
|
||||
Example:
|
||||
|
||||
```shellSession
|
||||
$ configureFlags="--disable-static"
|
||||
$ appendToVar configureFlags --disable-dependency-tracking --enable-foo
|
||||
$ echo $configureFlags
|
||||
--disable-static --disable-dependency-tracking --enable-foo
|
||||
```
|
||||
|
||||
## Package setup hooks {#ssec-setup-hooks}
|
||||
|
||||
Nix itself considers a build-time dependency as merely something that should previously be built and accessible at build time—packages themselves are on their own to perform any additional setup. In most cases, that is fine, and the downstream derivation can deal with its own dependencies. But for a few common tasks, that would result in almost every package doing the same sort of setup work—depending not on the package itself, but entirely on which dependencies were used.
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
doSub() {
|
||||
|
@ -1,5 +1,6 @@
|
||||
set -e
|
||||
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
mkdir -p $out/bin
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
echo "unpacking $src..."
|
||||
|
@ -45,7 +45,7 @@ let
|
||||
mv bin/nomad-autoscaler $bin/bin
|
||||
ln -s $bin/bin/nomad-autoscaler $out/bin/nomad-autoscaler
|
||||
|
||||
for d in $outputs; do
|
||||
for d in $(getAllOutputNames); do
|
||||
mkdir -p ''${!d}/share
|
||||
done
|
||||
rmdir $bin/share
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
tar --extract --file=$src libreoffice-$version/download.lst -O > $out
|
||||
|
@ -55,9 +55,9 @@ let
|
||||
bintoolsVersion = lib.getVersion bintools;
|
||||
bintoolsName = lib.removePrefix targetPrefix (lib.getName bintools);
|
||||
|
||||
libc_bin = if libc == null then null else getBin libc;
|
||||
libc_dev = if libc == null then null else getDev libc;
|
||||
libc_lib = if libc == null then null else getLib libc;
|
||||
libc_bin = if libc == null then "" else getBin libc;
|
||||
libc_dev = if libc == null then "" else getDev libc;
|
||||
libc_lib = if libc == null then "" else getLib libc;
|
||||
bintools_bin = if nativeTools then "" else getBin bintools;
|
||||
# The wrapper scripts use 'cat' and 'grep', so we may need coreutils.
|
||||
coreutils_bin = if nativeTools then "" else getBin coreutils;
|
||||
@ -68,7 +68,7 @@ let
|
||||
# The dynamic linker has different names on different platforms. This is a
|
||||
# shell glob that ought to match it.
|
||||
dynamicLinker =
|
||||
/**/ if sharedLibraryLoader == null then null
|
||||
/**/ if sharedLibraryLoader == null then ""
|
||||
else if targetPlatform.libc == "musl" then "${sharedLibraryLoader}/lib/ld-musl-*"
|
||||
else if targetPlatform.libc == "uclibc" then "${sharedLibraryLoader}/lib/ld*-uClibc.so.1"
|
||||
else if (targetPlatform.libc == "bionic" && targetPlatform.is32bit) then "/system/bin/linker"
|
||||
@ -87,7 +87,7 @@ let
|
||||
else if targetPlatform.isDarwin then "/usr/lib/dyld"
|
||||
else if targetPlatform.isFreeBSD then "/libexec/ld-elf.so.1"
|
||||
else if lib.hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1"
|
||||
else null;
|
||||
else "";
|
||||
|
||||
expand-response-params =
|
||||
if buildPackages ? stdenv && buildPackages.stdenv.hasCC && buildPackages.stdenv.cc != "/dev/null"
|
||||
@ -103,15 +103,10 @@ stdenv.mkDerivation {
|
||||
|
||||
preferLocalBuild = true;
|
||||
|
||||
inherit bintools_bin libc_bin libc_dev libc_lib coreutils_bin;
|
||||
shell = getBin shell + shell.shellPath or "";
|
||||
gnugrep_bin = if nativeTools then "" else gnugrep;
|
||||
|
||||
inherit targetPrefix suffixSalt;
|
||||
|
||||
outputs = [ "out" ] ++ optionals propagateDoc ([ "man" ] ++ optional (bintools ? info) "info");
|
||||
|
||||
passthru = {
|
||||
inherit targetPrefix suffixSalt;
|
||||
inherit bintools libc nativeTools nativeLibc nativePrefix;
|
||||
|
||||
emacsBufferSetup = pkgs: ''
|
||||
@ -193,8 +188,6 @@ stdenv.mkDerivation {
|
||||
strictDeps = true;
|
||||
depsTargetTargetPropagated = extraPackages;
|
||||
|
||||
wrapperName = "BINTOOLS_WRAPPER";
|
||||
|
||||
setupHooks = [
|
||||
../setup-hooks/role.bash
|
||||
./setup-hook.sh
|
||||
@ -366,10 +359,15 @@ stdenv.mkDerivation {
|
||||
##
|
||||
+ extraBuildCommands;
|
||||
|
||||
inherit dynamicLinker;
|
||||
|
||||
env = {
|
||||
# for substitution in utils.bash
|
||||
expandResponseParams = "${expand-response-params}/bin/expand-response-params";
|
||||
shell = getBin shell + shell.shellPath or "";
|
||||
gnugrep_bin = if nativeTools then "" else gnugrep;
|
||||
wrapperName = "BINTOOLS_WRAPPER";
|
||||
inherit dynamicLinker targetPrefix suffixSalt coreutils_bin;
|
||||
inherit bintools_bin libc_bin libc_dev libc_lib;
|
||||
};
|
||||
|
||||
meta =
|
||||
let bintools_ = if bintools != null then bintools else {}; in
|
||||
|
@ -42,9 +42,9 @@ let
|
||||
ccVersion = lib.getVersion cc;
|
||||
ccName = lib.removePrefix targetPrefix (lib.getName cc);
|
||||
|
||||
libc_bin = if libc == null then null else getBin libc;
|
||||
libc_dev = if libc == null then null else getDev libc;
|
||||
libc_lib = if libc == null then null else getLib libc;
|
||||
libc_bin = if libc == null then "" else getBin libc;
|
||||
libc_dev = if libc == null then "" else getDev libc;
|
||||
libc_lib = if libc == null then "" else getLib libc;
|
||||
cc_solib = getLib cc
|
||||
+ optionalString (targetPlatform != hostPlatform) "/${targetPlatform.config}";
|
||||
|
||||
@ -131,22 +131,16 @@ stdenv.mkDerivation {
|
||||
|
||||
preferLocalBuild = true;
|
||||
|
||||
inherit cc libc_bin libc_dev libc_lib bintools coreutils_bin;
|
||||
shell = getBin shell + shell.shellPath or "";
|
||||
gnugrep_bin = if nativeTools then "" else gnugrep;
|
||||
|
||||
inherit targetPrefix suffixSalt;
|
||||
inherit darwinPlatformForCC darwinMinVersion darwinMinVersionVariable;
|
||||
|
||||
outputs = [ "out" ] ++ optionals propagateDoc [ "man" "info" ];
|
||||
|
||||
passthru = {
|
||||
inherit targetPrefix suffixSalt;
|
||||
# "cc" is the generic name for a C compiler, but there is no one for package
|
||||
# providing the linker and related tools. The two we use now are GNU
|
||||
# Binutils, and Apple's "cctools"; "bintools" as an attempt to find an
|
||||
# unused middle-ground name that evokes both.
|
||||
inherit bintools;
|
||||
inherit libc nativeTools nativeLibc nativePrefix isGNU isClang;
|
||||
inherit cc libc nativeTools nativeLibc nativePrefix isGNU isClang;
|
||||
|
||||
emacsBufferSetup = pkgs: ''
|
||||
; We should handle propagation here too
|
||||
@ -270,8 +264,6 @@ stdenv.mkDerivation {
|
||||
propagatedBuildInputs = [ bintools ] ++ extraTools ++ optionals cc.langD or false [ zlib ];
|
||||
depsTargetTargetPropagated = optional (libcxx != null) libcxx ++ extraPackages;
|
||||
|
||||
wrapperName = "CC_WRAPPER";
|
||||
|
||||
setupHooks = [
|
||||
../setup-hooks/role.bash
|
||||
] ++ lib.optional (cc.langC or true) ./setup-hook.sh
|
||||
@ -538,8 +530,16 @@ stdenv.mkDerivation {
|
||||
nixSupport);
|
||||
|
||||
|
||||
env = {
|
||||
# for substitution in utils.bash
|
||||
expandResponseParams = "${expand-response-params}/bin/expand-response-params";
|
||||
shell = getBin shell + shell.shellPath or "";
|
||||
gnugrep_bin = if nativeTools then "" else gnugrep;
|
||||
wrapperName = "CC_WRAPPER";
|
||||
inherit suffixSalt coreutils_bin bintools cc;
|
||||
inherit libc_bin libc_dev libc_lib;
|
||||
inherit darwinPlatformForCC darwinMinVersion darwinMinVersionVariable;
|
||||
};
|
||||
|
||||
meta =
|
||||
let cc_ = if cc != null then cc else {}; in
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source "$stdenv/setup"
|
||||
|
||||
header "exporting \`$url' (revision $rev) into \`$out'"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
(echo "#!$SHELL"; \
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
tagtext=""
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source "${stdenv}/setup"
|
||||
header "exporting ${repository}/${imageName} (tag: ${tag}) into ${out}"
|
||||
mkdir -p "${out}"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
header "Cloning Fossil $url [$rev] into $out"
|
||||
|
||||
|
@ -2,6 +2,8 @@
|
||||
# - no revision specified and remote has a HEAD which is used
|
||||
# - revision specified and remote has a HEAD
|
||||
# - revision specified and remote without HEAD
|
||||
#
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
header "exporting $url (rev $rev) into $out"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
header "getting $url${rev:+ ($rev)} into $out"
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
# Curl flags to handle redirects, not use EPSV, handle cookies for
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
set -x
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
header "exporting $url (r$rev) into $out"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
header "exporting $url (r$rev) into $out"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
source $mirrorsFile
|
||||
|
@ -32,8 +32,10 @@ stdenvNoCC.mkDerivation {
|
||||
'';
|
||||
|
||||
# FIXME: get rid of perl dependency.
|
||||
env = {
|
||||
inherit perl;
|
||||
inherit (builtins) storeDir;
|
||||
shell = lib.getBin shell + (shell.shellPath or "");
|
||||
signingUtils = if darwinCodeSign then signingUtils else null;
|
||||
signingUtils = if darwinCodeSign then signingUtils else "";
|
||||
};
|
||||
}
|
||||
|
@ -36,13 +36,10 @@ stdenv.mkDerivation {
|
||||
|
||||
preferLocalBuild = true;
|
||||
|
||||
shell = getBin stdenvNoCC.shell + stdenvNoCC.shell.shellPath or "";
|
||||
|
||||
inherit targetPrefix suffixSalt baseBinName;
|
||||
|
||||
outputs = [ "out" ] ++ optionals propagateDoc ([ "man" ] ++ optional (pkg-config ? doc) "doc");
|
||||
|
||||
passthru = {
|
||||
inherit targetPrefix suffixSalt;
|
||||
inherit pkg-config;
|
||||
};
|
||||
|
||||
@ -83,8 +80,6 @@ stdenv.mkDerivation {
|
||||
ln -s ${pkg-config}/share $out/share
|
||||
'';
|
||||
|
||||
wrapperName = "PKG_CONFIG_WRAPPER";
|
||||
|
||||
setupHooks = [
|
||||
../setup-hooks/role.bash
|
||||
./setup-hook.sh
|
||||
@ -120,6 +115,12 @@ stdenv.mkDerivation {
|
||||
##
|
||||
+ extraBuildCommands;
|
||||
|
||||
env = {
|
||||
shell = getBin stdenvNoCC.shell + stdenvNoCC.shell.shellPath or "";
|
||||
wrapperName = "PKG_CONFIG_WRAPPER";
|
||||
inherit targetPrefix suffixSalt baseBinName;
|
||||
};
|
||||
|
||||
meta =
|
||||
let pkg-config_ = if pkg-config != null then pkg-config else {}; in
|
||||
(if pkg-config_ ? meta then removeAttrs pkg-config.meta ["priority"] else {}) //
|
||||
|
@ -124,7 +124,7 @@ stdenv.mkDerivation (
|
||||
echo "$system" > $out/nix-support/system
|
||||
|
||||
if [ -z "${toString doingAnalysis}" ]; then
|
||||
for i in $outputs; do
|
||||
for i in $(getAllOutputNames); do
|
||||
if [ "$i" = out ]; then j=none; else j="$i"; fi
|
||||
mkdir -p ''${!i}/nix-support
|
||||
echo "nix-build $j ''${!i}" >> ''${!i}/nix-support/hydra-build-products
|
||||
|
@ -84,7 +84,7 @@ autoPatchelf() {
|
||||
# (Expressions don't expand in single quotes, use double quotes for that.)
|
||||
postFixupHooks+=('
|
||||
if [ -z "${dontAutoPatchelf-}" ]; then
|
||||
autoPatchelf -- $(for output in $outputs; do
|
||||
autoPatchelf -- $(for output in $(getAllOutputNames); do
|
||||
[ -e "${!output}" ] || continue
|
||||
echo "${!output}"
|
||||
done)
|
||||
|
@ -5,10 +5,17 @@
|
||||
preFixupHooks+=(_moveToShare)
|
||||
|
||||
_moveToShare() {
|
||||
forceShare=${forceShare:=man doc info}
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
if [ -z "${forceShare-}" ]; then
|
||||
forceShare=( man doc info )
|
||||
fi
|
||||
else
|
||||
forceShare=( ${forceShare:-man doc info} )
|
||||
fi
|
||||
|
||||
if [[ -z "$out" ]]; then return; fi
|
||||
|
||||
for d in $forceShare; do
|
||||
for d in "${forceShare[@]}"; do
|
||||
if [ -d "$out/$d" ]; then
|
||||
if [ -d "$out/share/$d" ]; then
|
||||
echo "both $d/ and share/$d/ exist!"
|
||||
@ -20,4 +27,3 @@ _moveToShare() {
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ _overrideFirst outputInfo "info" "$outputBin"
|
||||
|
||||
# Add standard flags to put files into the desired outputs.
|
||||
_multioutConfig() {
|
||||
if [ "$outputs" = "out" ] || [ -z "${setOutputFlags-1}" ]; then return; fi;
|
||||
if [ "$(getAllOutputNames)" = "out" ] || [ -z "${setOutputFlags-1}" ]; then return; fi;
|
||||
|
||||
# try to detect share/doc/${shareDocName}
|
||||
# Note: sadly, $configureScript detection comes later in configurePhase,
|
||||
@ -66,19 +66,17 @@ _multioutConfig() {
|
||||
fi
|
||||
fi
|
||||
|
||||
configureFlags="\
|
||||
--bindir=${!outputBin}/bin --sbindir=${!outputBin}/sbin \
|
||||
--includedir=${!outputInclude}/include --oldincludedir=${!outputInclude}/include \
|
||||
--mandir=${!outputMan}/share/man --infodir=${!outputInfo}/share/info \
|
||||
--docdir=${!outputDoc}/share/doc/${shareDocName} \
|
||||
--libdir=${!outputLib}/lib --libexecdir=${!outputLib}/libexec \
|
||||
--localedir=${!outputLib}/share/locale \
|
||||
$configureFlags"
|
||||
prependToVar configureFlags \
|
||||
--bindir="${!outputBin}"/bin --sbindir="${!outputBin}"/sbin \
|
||||
--includedir="${!outputInclude}"/include --oldincludedir="${!outputInclude}"/include \
|
||||
--mandir="${!outputMan}"/share/man --infodir="${!outputInfo}"/share/info \
|
||||
--docdir="${!outputDoc}"/share/doc/"${shareDocName}" \
|
||||
--libdir="${!outputLib}"/lib --libexecdir="${!outputLib}"/libexec \
|
||||
--localedir="${!outputLib}"/share/locale
|
||||
|
||||
installFlags="\
|
||||
pkgconfigdir=${!outputDev}/lib/pkgconfig \
|
||||
m4datadir=${!outputDev}/share/aclocal aclocaldir=${!outputDev}/share/aclocal \
|
||||
$installFlags"
|
||||
prependToVar installFlags \
|
||||
pkgconfigdir="${!outputDev}"/lib/pkgconfig \
|
||||
m4datadir="${!outputDev}"/share/aclocal aclocaldir="${!outputDev}"/share/aclocal
|
||||
}
|
||||
|
||||
|
||||
@ -94,7 +92,7 @@ moveToOutput() {
|
||||
local patt="$1"
|
||||
local dstOut="$2"
|
||||
local output
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "${!output}" = "$dstOut" ]; then continue; fi
|
||||
local srcPath
|
||||
for srcPath in "${!output}"/$patt; do
|
||||
@ -149,7 +147,7 @@ _multioutDocs() {
|
||||
|
||||
# Move development-only stuff to the desired outputs.
|
||||
_multioutDevs() {
|
||||
if [ "$outputs" = "out" ] || [ -z "${moveToDev-1}" ]; then return; fi;
|
||||
if [ "$(getAllOutputNames)" = "out" ] || [ -z "${moveToDev-1}" ]; then return; fi;
|
||||
moveToOutput include "${!outputInclude}"
|
||||
# these files are sometimes provided even without using the corresponding tool
|
||||
moveToOutput lib/pkgconfig "${!outputDev}"
|
||||
@ -166,10 +164,10 @@ _multioutDevs() {
|
||||
|
||||
# Make the "dev" propagate other outputs needed for development.
|
||||
_multioutPropagateDev() {
|
||||
if [ "$outputs" = "out" ]; then return; fi;
|
||||
if [ "$(getAllOutputNames)" = "out" ]; then return; fi;
|
||||
|
||||
local outputFirst
|
||||
for outputFirst in $outputs; do
|
||||
for outputFirst in $(getAllOutputNames); do
|
||||
break
|
||||
done
|
||||
local propagaterOutput="$outputDev"
|
||||
|
@ -70,7 +70,7 @@ patchPpdFileCommands () {
|
||||
# * outputs of current build before buildInputs
|
||||
# * `/lib/cups/filter' before `/bin`
|
||||
# * add HOST_PATH at end, so we don't miss anything
|
||||
for path in $outputs; do
|
||||
for path in $(getAllOutputNames); do
|
||||
addToSearchPath cupspath "${!path}/lib/cups/filter"
|
||||
addToSearchPath cupspath "${!path}/bin"
|
||||
done
|
||||
|
@ -12,11 +12,20 @@ _doStrip() {
|
||||
local -ra stripCmds=(STRIP STRIP_FOR_TARGET)
|
||||
local -ra ranlibCmds=(RANLIB RANLIB_FOR_TARGET)
|
||||
|
||||
# TODO(structured-attrs): This doesn't work correctly if one of
|
||||
# the items in strip*List or strip*Flags contains a space,
|
||||
# even with structured attrs enabled. This is OK for now
|
||||
# because very few packages set any of these, and it doesn't
|
||||
# affect any of them.
|
||||
#
|
||||
# After __structuredAttrs = true is universal, come back and
|
||||
# push arrays all the way through this logic.
|
||||
|
||||
# Strip only host paths by default. Leave targets as is.
|
||||
stripDebugList=${stripDebugList:-lib lib32 lib64 libexec bin sbin}
|
||||
stripDebugListTarget=${stripDebugListTarget:-}
|
||||
stripAllList=${stripAllList:-}
|
||||
stripAllListTarget=${stripAllListTarget:-}
|
||||
stripDebugList=${stripDebugList[*]:-lib lib32 lib64 libexec bin sbin}
|
||||
stripDebugListTarget=${stripDebugListTarget[*]:-}
|
||||
stripAllList=${stripAllList[*]:-}
|
||||
stripAllListTarget=${stripAllListTarget[*]:-}
|
||||
|
||||
local i
|
||||
for i in ${!stripCmds[@]}; do
|
||||
@ -30,8 +39,8 @@ _doStrip() {
|
||||
if [[ "${dontStrip-}" || "${flag-}" ]] || ! type -f "${stripCmd-}" 2>/dev/null
|
||||
then continue; fi
|
||||
|
||||
stripDirs "$stripCmd" "$ranlibCmd" "$debugDirList" "${stripDebugFlags:--S}"
|
||||
stripDirs "$stripCmd" "$ranlibCmd" "$allDirList" "${stripAllFlags:--s}"
|
||||
stripDirs "$stripCmd" "$ranlibCmd" "$debugDirList" "${stripDebugFlags[*]:--S}"
|
||||
stripDirs "$stripCmd" "$ranlibCmd" "$allDirList" "${stripAllFlags[*]:--s}"
|
||||
done
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ _linkDLLs() {
|
||||
# prefix $PATH by currently-built outputs
|
||||
local DLLPATH=""
|
||||
local outName
|
||||
for outName in $outputs; do
|
||||
for outName in $(getAllOutputNames); do
|
||||
addToSearchPath DLLPATH "${!outName}/bin"
|
||||
done
|
||||
DLLPATH="$DLLPATH:$PATH"
|
||||
|
@ -35,7 +35,7 @@ echo "testBuildFailure: Original builder produced exit code: $r"
|
||||
# -----------------------------------------
|
||||
# Write the build log to the default output
|
||||
|
||||
outs=( $outputs )
|
||||
outs=( $(getAllOutputNames) )
|
||||
defOut=${outs[0]}
|
||||
defOutPath=${!defOut}
|
||||
|
||||
|
@ -50,7 +50,7 @@ stdenvNoCC.mkDerivation {
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" != "out" ]; then
|
||||
local outputDir="''${!output}"
|
||||
local iconsDir="$outputDir"/share/icons
|
||||
|
@ -52,7 +52,7 @@ stdenvNoCC.mkDerivation rec {
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
for outputName in $outputs ; do
|
||||
for outputName in $(getAllOutputNames) ; do
|
||||
if [ $outputName != out ]; then
|
||||
local outputDir=''${!outputName};
|
||||
local iconsDir=$outputDir/share/icons
|
||||
|
@ -143,7 +143,7 @@ stdenv.mkDerivation rec {
|
||||
# We use rsync to merge the directories.
|
||||
rsync --archive "${DESTDIR}/etc" "$out"
|
||||
rm --recursive "${DESTDIR}/etc"
|
||||
for o in $outputs; do
|
||||
for o in $(getAllOutputNames); do
|
||||
if [[ "$o" = "debug" ]]; then continue; fi
|
||||
rsync --archive "${DESTDIR}/''${!o}" "$(dirname "''${!o}")"
|
||||
rm --recursive "${DESTDIR}/''${!o}"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
preConfigure() {
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
export JAVA_HOME=$jre
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
header "exporting egg ${eggName} (version $version) into $out"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
header "exporting egg ${eggName} (version $version) into $out"
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
pkgdir=$(pwd)/pkg
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
tar xf $src
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
# -*- shell-script -*-
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
function extract
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
configureFlags="-prefix $out $configureFlags"
|
||||
|
@ -131,12 +131,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -135,12 +135,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -135,12 +135,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -131,12 +131,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -131,12 +131,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -138,12 +138,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -149,12 +149,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -140,12 +140,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -140,12 +140,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -187,12 +187,12 @@ let
|
||||
postFixup = ''
|
||||
# Build the set of output library directories to rpath against
|
||||
LIBDIRS=""
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS"
|
||||
done
|
||||
# Add the local library paths to remove dependencies on the bootstrap
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ "$output" = debug ]; then continue; fi
|
||||
OUTPUTDIR=$(eval echo \$$output)
|
||||
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
|
||||
|
@ -281,6 +281,7 @@ in with passthru; stdenv.mkDerivation {
|
||||
substituteInPlace "Lib/tkinter/tix.py" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'"
|
||||
'';
|
||||
|
||||
env = {
|
||||
CPPFLAGS = concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs);
|
||||
LDFLAGS = concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs);
|
||||
LIBS = "${optionalString (!stdenv.isDarwin) "-lcrypt"}";
|
||||
@ -290,6 +291,7 @@ in with passthru; stdenv.mkDerivation {
|
||||
}."${stdenv.hostPlatform.libc}" or "");
|
||||
# Determinism: We fix the hashes of str, bytes and datetime objects.
|
||||
PYTHONHASHSEED=0;
|
||||
};
|
||||
|
||||
configureFlags = [
|
||||
"--without-ensurepip"
|
||||
|
@ -6,7 +6,9 @@ let
|
||||
hook = ./setup-hook.sh;
|
||||
in runCommand "python-setup-hook.sh" {
|
||||
strictDeps = true;
|
||||
env = {
|
||||
inherit sitePackages;
|
||||
};
|
||||
} ''
|
||||
cp ${hook} hook.sh
|
||||
substituteAllInPlace hook.sh
|
||||
|
@ -60,7 +60,9 @@ stdenv.mkDerivation rec {
|
||||
../../../build-support/setup-hooks/role.bash
|
||||
./gettext-setup-hook.sh
|
||||
];
|
||||
env = {
|
||||
gettextNeedsLdflags = stdenv.hostPlatform.libc != "glibc" && !stdenv.hostPlatform.isMusl;
|
||||
};
|
||||
|
||||
enableParallelBuilding = true;
|
||||
enableParallelChecking = false; # fails sometimes
|
||||
|
@ -54,9 +54,6 @@ assert withGd -> gd != null && libpng != null;
|
||||
|
||||
stdenv.mkDerivation ({
|
||||
version = version + patchSuffix;
|
||||
linuxHeaders = if withLinuxHeaders then linuxHeaders else null;
|
||||
|
||||
inherit (stdenv) is64bit;
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
@ -175,10 +172,14 @@ stdenv.mkDerivation ({
|
||||
nativeBuildInputs = [ bison python3Minimal ] ++ extraNativeBuildInputs;
|
||||
buildInputs = [ linuxHeaders ] ++ lib.optionals withGd [ gd libpng ] ++ extraBuildInputs;
|
||||
|
||||
env = {
|
||||
linuxHeaders = if withLinuxHeaders then linuxHeaders else "";
|
||||
inherit (stdenv) is64bit;
|
||||
# Needed to install share/zoneinfo/zone.tab. Set to impure /bin/sh to
|
||||
# prevent a retained dependency on the bootstrap tools in the stdenv-linux
|
||||
# bootstrap.
|
||||
BASH_SHELL = "/bin/sh";
|
||||
};
|
||||
|
||||
# Used by libgcc, elf-header, and others to determine ABI
|
||||
passthru = { inherit version; minorRelease = version; };
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
# Glibc cannot have itself in its RPATH.
|
||||
export NIX_NO_SELF_RPATH=1
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
genericBuild
|
||||
|
@ -167,7 +167,7 @@ stdenv.mkDerivation rec {
|
||||
rsync --archive "${DESTDIR}${system}"/* "$out"
|
||||
rm --recursive "${DESTDIR}${system}"/*
|
||||
rmdir --parents --ignore-fail-on-non-empty "${DESTDIR}${system}"
|
||||
for o in $outputs; do
|
||||
for o in $(getAllOutputNames); do
|
||||
rsync --archive "${DESTDIR}/''${!o}" "$(dirname "''${!o}")"
|
||||
rm --recursive "${DESTDIR}/''${!o}"
|
||||
done
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
mkdir unzipped
|
||||
|
@ -26,7 +26,7 @@ let
|
||||
nativeBuildInputs = [ autoreconfHook ];
|
||||
|
||||
doCheck = true;
|
||||
AUTOMATED_TESTING = true; # https://trac.xapian.org/changeset/8be35f5e1/git
|
||||
env.AUTOMATED_TESTING = true; # https://trac.xapian.org/changeset/8be35f5e1/git
|
||||
|
||||
patches = lib.optionals stdenv.isDarwin [ ./skip-flaky-darwin-test.patch ];
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
export HOME=$NIX_BUILD_TOP
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
PERL5LIB="$PERL5LIB${PERL5LIB:+:}$out/lib/perl5/site_perl"
|
||||
|
@ -24,6 +24,8 @@
|
||||
# https://metacpan.org/pod/release/XSAWYERX/perl-5.26.0/pod/perldelta.pod#Removal-of-the-current-directory-%28%22.%22%29-from-@INC
|
||||
, PERL_USE_UNSAFE_INC ? "1"
|
||||
|
||||
, env ? {}
|
||||
|
||||
, ...
|
||||
}@attrs:
|
||||
|
||||
@ -43,10 +45,11 @@ lib.throwIf (attrs ? name) "buildPerlPackage: `name` (\"${attrs.name}\") is depr
|
||||
buildInputs = buildInputs ++ [ perl ];
|
||||
nativeBuildInputs = nativeBuildInputs ++ [ (perl.mini or perl) ];
|
||||
|
||||
fullperl = buildPerl;
|
||||
|
||||
inherit outputs src doCheck checkTarget enableParallelBuilding;
|
||||
env = {
|
||||
inherit PERL_AUTOINSTALL AUTOMATED_TESTING PERL_USE_UNSAFE_INC;
|
||||
fullperl = buildPerl;
|
||||
} // env;
|
||||
|
||||
meta = defaultMeta // (attrs.meta or { });
|
||||
});
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
unpackPhase
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
boot_bin=$out/bin/boot
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
# Wrap the given `aclocal' program, appending extra `-I' flags
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
tar zxvf $src
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
arch=$(uname -m)
|
||||
|
@ -25,7 +25,7 @@ signDarwinBinariesIn() {
|
||||
signDarwinBinariesInAllOutputs() {
|
||||
local output
|
||||
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
signDarwinBinariesIn "${!output}"
|
||||
done
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
unpackManually() {
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
mkdir -p $out/lib
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
source $stdenv/setup
|
||||
|
||||
unzip $src
|
||||
|
@ -55,7 +55,7 @@ stdenv.mkDerivation rec {
|
||||
];
|
||||
|
||||
# needs to find a local perl module during build
|
||||
PERL_USE_UNSAFE_INC = "1";
|
||||
env.PERL_USE_UNSAFE_INC = "1";
|
||||
|
||||
# TODO: tests are failing https://munin-monitoring.org/ticket/1390#comment:1
|
||||
# NOTE: important, test command always exits with 0, think of a way to abort the build once tests pass
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
# This is the builder for all X.org components.
|
||||
source $stdenv/setup
|
||||
|
||||
|
@ -262,11 +262,12 @@ rec {
|
||||
ln -s ${bootstrapTools}/bin/rewrite-tbd $out/bin
|
||||
'';
|
||||
|
||||
binutils-unwrapped = { name = "bootstrap-stage0-binutils"; outPath = bootstrapTools; };
|
||||
binutils-unwrapped = bootstrapTools // {
|
||||
name = "bootstrap-stage0-binutils";
|
||||
};
|
||||
|
||||
cctools = {
|
||||
cctools = bootstrapTools // {
|
||||
name = "bootstrap-stage0-cctools";
|
||||
outPath = bootstrapTools;
|
||||
targetPrefix = "";
|
||||
};
|
||||
|
||||
|
@ -1,2 +1,6 @@
|
||||
if [ -f .attrs.sh ]; then
|
||||
. .attrs.sh
|
||||
fi
|
||||
|
||||
source $stdenv/setup
|
||||
genericBuild
|
||||
|
@ -154,6 +154,12 @@ let
|
||||
(! attrs ? outputHash) # Fixed-output drvs can't be content addressed too
|
||||
&& config.contentAddressedByDefault
|
||||
|
||||
# Experimental. For simple packages mostly just works,
|
||||
# but for anything complex, be prepared to debug if enabling.
|
||||
, __structuredAttrs ? config.structuredAttrsByDefault or false
|
||||
|
||||
, env ? { }
|
||||
|
||||
, ... } @ attrs:
|
||||
|
||||
let
|
||||
@ -259,13 +265,16 @@ else let
|
||||
lib.unique (lib.concatMap (input: input.__propagatedImpureHostDeps or [])
|
||||
(lib.concatLists propagatedDependencies));
|
||||
|
||||
envIsExportable = lib.isAttrs env && !lib.isDerivation env;
|
||||
|
||||
derivationArg =
|
||||
(removeAttrs attrs
|
||||
["meta" "passthru" "pos"
|
||||
(["meta" "passthru" "pos"
|
||||
"checkInputs" "installCheckInputs"
|
||||
"__darwinAllowLocalNetworking"
|
||||
"__impureHostDeps" "__propagatedImpureHostDeps"
|
||||
"sandboxProfile" "propagatedSandboxProfile"])
|
||||
"sandboxProfile" "propagatedSandboxProfile"]
|
||||
++ lib.optionals envIsExportable [ "env" ]))
|
||||
// (lib.optionalAttrs (attrs ? name || (attrs ? pname && attrs ? version)) {
|
||||
name =
|
||||
let
|
||||
@ -289,7 +298,7 @@ else let
|
||||
then attrs.name + hostSuffix
|
||||
else "${attrs.pname}${staticMarker}${hostSuffix}-${attrs.version}"
|
||||
);
|
||||
}) // {
|
||||
}) // lib.optionalAttrs (envIsExportable && __structuredAttrs) { env = checkedEnv; } // {
|
||||
builder = attrs.realBuilder or stdenv.shell;
|
||||
args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)];
|
||||
inherit stdenv;
|
||||
@ -304,8 +313,7 @@ else let
|
||||
|
||||
userHook = config.stdenv.userHook or null;
|
||||
__ignoreNulls = true;
|
||||
|
||||
inherit strictDeps;
|
||||
inherit __structuredAttrs strictDeps;
|
||||
|
||||
depsBuildBuild = lib.elemAt (lib.elemAt dependencies 0) 0;
|
||||
nativeBuildInputs = lib.elemAt (lib.elemAt dependencies 0) 1;
|
||||
@ -473,6 +481,17 @@ else let
|
||||
else true);
|
||||
};
|
||||
|
||||
checkedEnv =
|
||||
let
|
||||
overlappingNames = lib.intersectLists (lib.attrNames env) (lib.attrNames derivationArg);
|
||||
in
|
||||
assert lib.assertMsg (overlappingNames == [ ])
|
||||
"The ‘env’ attribute set cannot contain any attributes passed to derivation. The following attributes are overlapping: ${lib.concatStringsSep ", " overlappingNames}";
|
||||
lib.mapAttrs
|
||||
(n: v: assert lib.assertMsg (lib.isString v || lib.isBool v || lib.isInt v || lib.isDerivation v)
|
||||
"The ‘env’ attribute set can only contain derivation, string, boolean or integer attributes. The ‘${n}’ attribute is of type ${builtins.typeOf v}."; v)
|
||||
env;
|
||||
|
||||
in
|
||||
|
||||
lib.extendDerivation
|
||||
@ -509,7 +528,7 @@ lib.extendDerivation
|
||||
# should be made available to Nix expressions using the
|
||||
# derivation (e.g., in assertions).
|
||||
passthru)
|
||||
(derivation derivationArg);
|
||||
(derivation (derivationArg // lib.optionalAttrs envIsExportable checkedEnv));
|
||||
|
||||
in
|
||||
fnOrAttrs:
|
||||
|
@ -15,8 +15,33 @@ if (( "${NIX_DEBUG:-0}" >= 6 )); then
|
||||
set -x
|
||||
fi
|
||||
|
||||
: ${outputs:=out}
|
||||
if [ -f .attrs.sh ]; then
|
||||
__structuredAttrs=1
|
||||
echo "structuredAttrs is enabled"
|
||||
else
|
||||
__structuredAttrs=
|
||||
fi
|
||||
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
for outputName in "${!outputs[@]}"; do
|
||||
# ex: out=/nix/store/...
|
||||
export "$outputName=${outputs[$outputName]}"
|
||||
done
|
||||
# $NIX_ATTRS_JSON_FILE points to the wrong location in sandbox
|
||||
# https://github.com/NixOS/nix/issues/6736
|
||||
export NIX_ATTRS_JSON_FILE="$NIX_BUILD_TOP/.attrs.json"
|
||||
export NIX_ATTRS_SH_FILE="$NIX_BUILD_TOP/.attrs.sh"
|
||||
else
|
||||
: ${outputs:=out}
|
||||
fi
|
||||
|
||||
getAllOutputNames() {
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
echo "${!outputs[*]}"
|
||||
else
|
||||
echo "$outputs"
|
||||
fi
|
||||
}
|
||||
|
||||
######################################################################
|
||||
# Hook handling.
|
||||
@ -175,6 +200,109 @@ addToSearchPath() {
|
||||
addToSearchPathWithCustomDelimiter ":" "$@"
|
||||
}
|
||||
|
||||
# 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() {
|
||||
local -n nameref="$1"
|
||||
|
||||
useArray=
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
useArray=true
|
||||
else
|
||||
useArray=false
|
||||
fi
|
||||
|
||||
# check if variable already exist and if it does then do extra checks
|
||||
if declare -p "$1" 2> /dev/null | grep -q '^'; then
|
||||
type="$(declare -p "$1")"
|
||||
if [[ "$type" =~ "declare -A" ]]; then
|
||||
echo "prependToVar(): ERROR: trying to use prependToVar on an associative array." >&2
|
||||
return 1
|
||||
elif [[ "$type" =~ "declare -a" ]]; then
|
||||
useArray=true
|
||||
else
|
||||
useArray=false
|
||||
fi
|
||||
fi
|
||||
|
||||
shift
|
||||
|
||||
if $useArray; then
|
||||
nameref=( "$@" ${nameref+"${nameref[@]}"} )
|
||||
else
|
||||
nameref="$* ${nameref-}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Same as above
|
||||
appendToVar() {
|
||||
local -n nameref="$1"
|
||||
|
||||
useArray=
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
useArray=true
|
||||
else
|
||||
useArray=false
|
||||
fi
|
||||
|
||||
# check if variable already exist and if it does then do extra checks
|
||||
if declare -p "$1" 2> /dev/null | grep -q '^'; then
|
||||
type="$(declare -p "$1")"
|
||||
if [[ "$type" =~ "declare -A" ]]; then
|
||||
echo "appendToVar(): ERROR: trying to use appendToVar on an associative array, use variable+=([\"X\"]=\"Y\") instead." >&2
|
||||
return 1
|
||||
elif [[ "$type" =~ "declare -a" ]]; then
|
||||
useArray=true
|
||||
else
|
||||
useArray=false
|
||||
fi
|
||||
fi
|
||||
|
||||
shift
|
||||
|
||||
if $useArray; then
|
||||
nameref=( ${nameref+"${nameref[@]}"} "$@" )
|
||||
else
|
||||
nameref="${nameref-} $*"
|
||||
fi
|
||||
}
|
||||
|
||||
# Accumulate into `flagsArray` the flags from the named variables.
|
||||
#
|
||||
# If __structuredAttrs, the variables are all treated as arrays
|
||||
# and simply concatenated onto `flagsArray`.
|
||||
#
|
||||
# If not __structuredAttrs, then:
|
||||
# * Each variable is treated as a string, and split on whitespace;
|
||||
# * except variables whose names end in "Array", which are treated
|
||||
# as arrays.
|
||||
_accumFlagsArray() {
|
||||
local name
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
for name in "$@"; do
|
||||
local -n nameref="$name"
|
||||
flagsArray+=( ${nameref+"${nameref[@]}"} )
|
||||
done
|
||||
else
|
||||
for name in "$@"; do
|
||||
local -n nameref="$name"
|
||||
case "$name" in
|
||||
*Array)
|
||||
flagsArray+=( ${nameref+"${nameref[@]}"} ) ;;
|
||||
*)
|
||||
flagsArray+=( ${nameref-} ) ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
# Add $1/lib* into rpaths.
|
||||
# The function is used in multiple-outputs.sh hook,
|
||||
# so it is defined here but tried after the hook.
|
||||
@ -255,6 +383,11 @@ printWords() {
|
||||
######################################################################
|
||||
# Initialisation.
|
||||
|
||||
# export all vars that should be in the ENV
|
||||
for envVar in "${!env[@]}"; do
|
||||
declare -x "${envVar}=${env[${envVar}]}"
|
||||
done
|
||||
|
||||
|
||||
# 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
|
||||
@ -469,6 +602,10 @@ findInputs() {
|
||||
done
|
||||
}
|
||||
|
||||
# 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.
|
||||
|
||||
# Make sure all are at least defined as empty
|
||||
: ${depsBuildBuild=} ${depsBuildBuildPropagated=}
|
||||
: ${nativeBuildInputs=} ${propagatedNativeBuildInputs=} ${defaultNativeBuildInputs=}
|
||||
@ -477,29 +614,29 @@ findInputs() {
|
||||
: ${buildInputs=} ${propagatedBuildInputs=} ${defaultBuildInputs=}
|
||||
: ${depsTargetTarget=} ${depsTargetTargetPropagated=}
|
||||
|
||||
for pkg in $depsBuildBuild $depsBuildBuildPropagated; do
|
||||
for pkg in ${depsBuildBuild[@]} ${depsBuildBuildPropagated[@]}; do
|
||||
findInputs "$pkg" -1 -1
|
||||
done
|
||||
for pkg in $nativeBuildInputs $propagatedNativeBuildInputs; do
|
||||
for pkg in ${nativeBuildInputs[@]} ${propagatedNativeBuildInputs[@]}; do
|
||||
findInputs "$pkg" -1 0
|
||||
done
|
||||
for pkg in $depsBuildTarget $depsBuildTargetPropagated; do
|
||||
for pkg in ${depsBuildTarget[@]} ${depsBuildTargetPropagated[@]}; do
|
||||
findInputs "$pkg" -1 1
|
||||
done
|
||||
for pkg in $depsHostHost $depsHostHostPropagated; do
|
||||
for pkg in ${depsHostHost[@]} ${depsHostHostPropagated[@]}; do
|
||||
findInputs "$pkg" 0 0
|
||||
done
|
||||
for pkg in $buildInputs $propagatedBuildInputs ; do
|
||||
for pkg in ${buildInputs[@]} ${propagatedBuildInputs[@]} ; do
|
||||
findInputs "$pkg" 0 1
|
||||
done
|
||||
for pkg in $depsTargetTarget $depsTargetTargetPropagated; do
|
||||
for pkg in ${depsTargetTarget[@]} ${depsTargetTargetPropagated[@]}; do
|
||||
findInputs "$pkg" 1 1
|
||||
done
|
||||
# Default inputs must be processed last
|
||||
for pkg in $defaultNativeBuildInputs; do
|
||||
for pkg in ${defaultNativeBuildInputs[@]}; do
|
||||
findInputs "$pkg" -1 0
|
||||
done
|
||||
for pkg in $defaultBuildInputs; do
|
||||
for pkg in ${defaultBuildInputs[@]}; do
|
||||
findInputs "$pkg" 0 1
|
||||
done
|
||||
|
||||
@ -787,6 +924,10 @@ substituteInPlace() {
|
||||
}
|
||||
|
||||
_allFlags() {
|
||||
# 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
|
||||
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}"
|
||||
@ -909,6 +1050,13 @@ unpackPhase() {
|
||||
srcs="$src"
|
||||
fi
|
||||
|
||||
local -a srcsArray
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
srcsArray=( "${srcs[@]}" )
|
||||
else
|
||||
srcsArray=( $srcs )
|
||||
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,
|
||||
@ -921,7 +1069,7 @@ unpackPhase() {
|
||||
done
|
||||
|
||||
# Unpack all source archives.
|
||||
for i in $srcs; do
|
||||
for i in "${srcsArray[@]}"; do
|
||||
unpackFile "$i"
|
||||
done
|
||||
|
||||
@ -971,7 +1119,14 @@ unpackPhase() {
|
||||
patchPhase() {
|
||||
runHook prePatch
|
||||
|
||||
for i in ${patches:-}; do
|
||||
local -a patchesArray
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
patchesArray=( ${patches:+"${patches[@]}"} )
|
||||
else
|
||||
patchesArray=( ${patches:-} )
|
||||
fi
|
||||
|
||||
for i in "${patchesArray[@]}"; do
|
||||
header "applying patch $i" 3
|
||||
local uncompress=cat
|
||||
case "$i" in
|
||||
@ -988,9 +1143,17 @@ patchPhase() {
|
||||
uncompress="lzma -d"
|
||||
;;
|
||||
esac
|
||||
|
||||
local -a flagsArray
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
flagsArray=( "${patchFlags[@]:--p1}" )
|
||||
else
|
||||
# shellcheck disable=SC2086
|
||||
flagsArray=( ${patchFlags:--p1} )
|
||||
fi
|
||||
# "2>&1" is a hack to make patch fail if the decompressor fails (nonexistent patch, etc.)
|
||||
# shellcheck disable=SC2086
|
||||
$uncompress < "$i" 2>&1 | patch ${patchFlags:--p1}
|
||||
$uncompress < "$i" 2>&1 | patch "${flagsArray[@]}"
|
||||
done
|
||||
|
||||
runHook postPatch
|
||||
@ -1018,7 +1181,6 @@ configurePhase() {
|
||||
|
||||
# set to empty if unset
|
||||
: ${configureScript=}
|
||||
: ${configureFlags=}
|
||||
|
||||
if [[ -z "$configureScript" && -x ./configure ]]; then
|
||||
configureScript=./configure
|
||||
@ -1049,31 +1211,29 @@ configurePhase() {
|
||||
fi
|
||||
|
||||
if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then
|
||||
configureFlags="${prefixKey:---prefix=}$prefix $configureFlags"
|
||||
prependToVar configureFlags "${prefixKey:---prefix=}$prefix"
|
||||
fi
|
||||
|
||||
if [[ -f "$configureScript" ]]; then
|
||||
# Add --disable-dependency-tracking to speed up some builds.
|
||||
if [ -z "${dontAddDisableDepTrack:-}" ]; then
|
||||
if grep -q dependency-tracking "$configureScript"; then
|
||||
configureFlags="--disable-dependency-tracking $configureFlags"
|
||||
prependToVar configureFlags --disable-dependency-tracking
|
||||
fi
|
||||
fi
|
||||
|
||||
# By default, disable static builds.
|
||||
if [ -z "${dontDisableStatic:-}" ]; then
|
||||
if grep -q enable-static "$configureScript"; then
|
||||
configureFlags="--disable-static $configureFlags"
|
||||
prependToVar configureFlags --disable-static
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$configureScript" ]; then
|
||||
# Old bash empty array hack
|
||||
# shellcheck disable=SC2086
|
||||
local flagsArray=(
|
||||
$configureFlags "${configureFlagsArray[@]}"
|
||||
)
|
||||
local -a flagsArray
|
||||
_accumFlagsArray configureFlags configureFlagsArray
|
||||
|
||||
echoCmd 'configure flags' "${flagsArray[@]}"
|
||||
# shellcheck disable=SC2086
|
||||
$configureScript "${flagsArray[@]}"
|
||||
@ -1089,22 +1249,17 @@ configurePhase() {
|
||||
buildPhase() {
|
||||
runHook preBuild
|
||||
|
||||
# set to empty if unset
|
||||
: ${makeFlags=}
|
||||
|
||||
if [[ -z "$makeFlags" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then
|
||||
if [[ -z "${makeFlags-}" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then
|
||||
echo "no Makefile, doing nothing"
|
||||
else
|
||||
foundMakefile=1
|
||||
|
||||
# Old bash empty array hack
|
||||
# shellcheck disable=SC2086
|
||||
local flagsArray=(
|
||||
${enableParallelBuilding:+-j${NIX_BUILD_CORES}}
|
||||
SHELL=$SHELL
|
||||
$makeFlags "${makeFlagsArray[@]}"
|
||||
$buildFlags "${buildFlagsArray[@]}"
|
||||
)
|
||||
_accumFlagsArray makeFlags makeFlagsArray buildFlags buildFlagsArray
|
||||
|
||||
echoCmd 'build flags' "${flagsArray[@]}"
|
||||
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
||||
@ -1141,11 +1296,17 @@ checkPhase() {
|
||||
local flagsArray=(
|
||||
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
|
||||
SHELL=$SHELL
|
||||
$makeFlags "${makeFlagsArray[@]}"
|
||||
${checkFlags:-VERBOSE=y} "${checkFlagsArray[@]}"
|
||||
${checkTarget}
|
||||
)
|
||||
|
||||
_accumFlagsArray makeFlags makeFlagsArray
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
flagsArray+=( "${checkFlags[@]:-VERBOSE=y}" )
|
||||
else
|
||||
flagsArray+=( ${checkFlags:-VERBOSE=y} )
|
||||
fi
|
||||
_accumFlagsArray checkFlagsArray
|
||||
flagsArray+=( ${checkTarget} )
|
||||
|
||||
echoCmd 'check flags' "${flagsArray[@]}"
|
||||
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
||||
|
||||
@ -1163,14 +1324,16 @@ installPhase() {
|
||||
mkdir -p "$prefix"
|
||||
fi
|
||||
|
||||
# Old bash empty array hack
|
||||
# shellcheck disable=SC2086
|
||||
local flagsArray=(
|
||||
SHELL=$SHELL
|
||||
$makeFlags "${makeFlagsArray[@]}"
|
||||
$installFlags "${installFlagsArray[@]}"
|
||||
${installTargets:-install}
|
||||
)
|
||||
_accumFlagsArray makeFlags makeFlagsArray installFlags installFlagsArray
|
||||
if [ -n "$__structuredAttrs" ]; then
|
||||
flagsArray+=( "${installTargets[@]:-install}" )
|
||||
else
|
||||
flagsArray+=( ${installTargets:-install} )
|
||||
fi
|
||||
|
||||
echoCmd 'install flags' "${flagsArray[@]}"
|
||||
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
||||
@ -1186,7 +1349,7 @@ installPhase() {
|
||||
fixupPhase() {
|
||||
# Make sure everything is writable so "strip" et al. work.
|
||||
local output
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
if [ -e "${!output}" ]; then chmod -R u+w "${!output}"; fi
|
||||
done
|
||||
|
||||
@ -1194,7 +1357,7 @@ fixupPhase() {
|
||||
|
||||
# Apply fixup to each output.
|
||||
local output
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
prefix="${!output}" runHook fixupOutput
|
||||
done
|
||||
|
||||
@ -1239,7 +1402,10 @@ fixupPhase() {
|
||||
if [ -n "${setupHooks:-}" ]; then
|
||||
mkdir -p "${!outputDev}/nix-support"
|
||||
local hook
|
||||
for hook in $setupHooks; do
|
||||
# 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
|
||||
local content
|
||||
consumeEntire content < "$hook"
|
||||
substituteAllStream content "file '$hook'" >> "${!outputDev}/nix-support/setup-hook"
|
||||
@ -1275,11 +1441,12 @@ installCheckPhase() {
|
||||
local flagsArray=(
|
||||
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
|
||||
SHELL=$SHELL
|
||||
$makeFlags "${makeFlagsArray[@]}"
|
||||
$installCheckFlags "${installCheckFlagsArray[@]}"
|
||||
${installCheckTarget:-installcheck}
|
||||
)
|
||||
|
||||
_accumFlagsArray makeFlags makeFlagsArray \
|
||||
installCheckFlags installCheckFlagsArray
|
||||
flagsArray+=( ${installCheckTarget:-installcheck} )
|
||||
|
||||
echoCmd 'installcheck flags' "${flagsArray[@]}"
|
||||
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
||||
unset flagsArray
|
||||
@ -1292,11 +1459,9 @@ installCheckPhase() {
|
||||
distPhase() {
|
||||
runHook preDist
|
||||
|
||||
# Old bash empty array hack
|
||||
# shellcheck disable=SC2086
|
||||
local flagsArray=(
|
||||
$distFlags "${distFlagsArray[@]}" ${distTarget:-dist}
|
||||
)
|
||||
local flagsArray=()
|
||||
_accumFlagsArray distFlags distFlagsArray
|
||||
flagsArray+=( ${distTarget:-dist} )
|
||||
|
||||
echo 'dist flags: %q' "${flagsArray[@]}"
|
||||
make ${makefile:+-f $makefile} "${flagsArray[@]}"
|
||||
@ -1307,7 +1472,7 @@ distPhase() {
|
||||
# Note: don't quote $tarballs, since we explicitly permit
|
||||
# wildcards in there.
|
||||
# shellcheck disable=SC2086
|
||||
cp -pvd ${tarballs:-*.tar.gz} "$out/tarballs"
|
||||
cp -pvd ${tarballs[*]:-*.tar.gz} "$out/tarballs"
|
||||
fi
|
||||
|
||||
runHook postDist
|
||||
@ -1357,14 +1522,18 @@ genericBuild() {
|
||||
return
|
||||
fi
|
||||
|
||||
if [ -z "${phases:-}" ]; then
|
||||
phases="${prePhases:-} unpackPhase patchPhase ${preConfigurePhases:-} \
|
||||
configurePhase ${preBuildPhases:-} buildPhase checkPhase \
|
||||
${preInstallPhases:-} installPhase ${preFixupPhases:-} fixupPhase installCheckPhase \
|
||||
${preDistPhases:-} distPhase ${postPhases:-}";
|
||||
if [ -z "${phases[*]:-}" ]; then
|
||||
phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \
|
||||
configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \
|
||||
${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \
|
||||
${preDistPhases[*]:-} distPhase ${postPhases[*]:-}";
|
||||
fi
|
||||
|
||||
for curPhase in $phases; do
|
||||
# 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
|
||||
if [[ "$curPhase" = unpackPhase && -n "${dontUnpack:-}" ]]; then continue; fi
|
||||
if [[ "$curPhase" = patchPhase && -n "${dontPatch:-}" ]]; then continue; fi
|
||||
if [[ "$curPhase" = configurePhase && -n "${dontConfigure:-}" ]]; then continue; fi
|
||||
@ -1414,6 +1583,7 @@ runHook userHook
|
||||
|
||||
dumpVars
|
||||
|
||||
|
||||
# Restore the original options for nix-shell
|
||||
[[ $__nixpkgs_setup_set_original == *e* ]] || set +e
|
||||
[[ $__nixpkgs_setup_set_original == *u* ]] || set +u
|
||||
|
@ -249,7 +249,7 @@ in
|
||||
# Apparently iconv won't work with bootstrap glibc, but it will be used
|
||||
# with glibc built later where we keep *this* build of libunistring,
|
||||
# so we need to trick it into supporting libiconv.
|
||||
am_cv_func_iconv_works = "yes";
|
||||
env = attrs.env or {} // { am_cv_func_iconv_works = "yes"; };
|
||||
});
|
||||
libidn2 = super.libidn2.overrideAttrs (attrs: {
|
||||
postFixup = attrs.postFixup or "" + ''
|
||||
|
@ -21,6 +21,7 @@ with pkgs;
|
||||
cc-wrapper-clang-9 = callPackage ./cc-wrapper { stdenv = llvmPackages_9.stdenv; };
|
||||
cc-wrapper-libcxx-9 = callPackage ./cc-wrapper { stdenv = llvmPackages_9.libcxxStdenv; };
|
||||
stdenv-inputs = callPackage ./stdenv-inputs { };
|
||||
stdenv = callPackage ./stdenv { };
|
||||
|
||||
config = callPackage ./config.nix { };
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
set -x
|
||||
|
||||
export NIX_DEBUG=1
|
||||
|
159
pkgs/test/stdenv/default.nix
Normal file
159
pkgs/test/stdenv/default.nix
Normal file
@ -0,0 +1,159 @@
|
||||
# To run these tests:
|
||||
# nix-build -A tests.stdenv
|
||||
|
||||
{ stdenv
|
||||
, pkgs
|
||||
, lib
|
||||
,
|
||||
}:
|
||||
|
||||
let
|
||||
# use a early stdenv so when hacking on stdenv this test can be run quickly
|
||||
bootStdenv = stdenv.__bootPackages.stdenv.__bootPackages.stdenv.__bootPackages.stdenv.__bootPackages.stdenv;
|
||||
pkgsStructured = import pkgs.path { config = { structuredAttrsByDefault = true; }; inherit (stdenv.hostPlatform) system; };
|
||||
bootStdenvStructuredAttrsByDefault = pkgsStructured.stdenv.__bootPackages.stdenv.__bootPackages.stdenv.__bootPackages.stdenv.__bootPackages.stdenv;
|
||||
|
||||
|
||||
ccWrapperSubstitutionsTest = { name, stdenv', extraAttrs ? { } }:
|
||||
|
||||
stdenv'.cc.overrideAttrs (previousAttrs: ({
|
||||
inherit name;
|
||||
|
||||
postFixup = previousAttrs.postFixup + ''
|
||||
declare -p wrapperName
|
||||
echo "env.wrapperName = $wrapperName"
|
||||
[[ $wrapperName == "CC_WRAPPER" ]] || (echo "'\$wrapperName' was not 'CC_WRAPPER'" && false)
|
||||
declare -p suffixSalt
|
||||
echo "env.suffixSalt = $suffixSalt"
|
||||
[[ $suffixSalt == "${stdenv'.cc.suffixSalt}" ]] || (echo "'\$suffxSalt' was not '${stdenv'.cc.suffixSalt}'" && false)
|
||||
|
||||
grep -q "@out@" $out/bin/cc || echo "@out@ in $out/bin/cc was substituted"
|
||||
grep -q "@suffixSalt@" $out/bin/cc && (echo "$out/bin/cc contains unsubstituted variables" && false)
|
||||
|
||||
touch $out
|
||||
'';
|
||||
} // extraAttrs));
|
||||
|
||||
testEnvAttrset = { name, stdenv', extraAttrs ? { } }:
|
||||
stdenv'.mkDerivation
|
||||
({
|
||||
inherit name;
|
||||
env = {
|
||||
string = "testing-string";
|
||||
};
|
||||
|
||||
passAsFile = [ "buildCommand" ];
|
||||
buildCommand = ''
|
||||
declare -p string
|
||||
echo "env.string = $string"
|
||||
[[ $string == "testing-string" ]] || (echo "'\$string' was not 'testing-string'" && false)
|
||||
touch $out
|
||||
'';
|
||||
} // extraAttrs);
|
||||
|
||||
testPrependAndAppendToVar = { name, stdenv', extraAttrs ? { } }:
|
||||
stdenv'.mkDerivation
|
||||
({
|
||||
inherit name;
|
||||
env = {
|
||||
string = "testing-string";
|
||||
};
|
||||
|
||||
passAsFile = [ "buildCommand" ] ++ lib.optionals (extraAttrs ? extraTest) [ "extraTest" ];
|
||||
buildCommand = ''
|
||||
declare -p string
|
||||
appendToVar string hello
|
||||
# test that quoted strings work
|
||||
prependToVar string "world"
|
||||
declare -p string
|
||||
|
||||
declare -A associativeArray=(["X"]="Y")
|
||||
[[ $(appendToVar associativeArray "fail" 2>&1) =~ "trying to use" ]] || (echo "prependToVar did not catch prepending associativeArray" && false)
|
||||
[[ $(prependToVar associativeArray "fail" 2>&1) =~ "trying to use" ]] || (echo "prependToVar did not catch prepending associativeArray" && false)
|
||||
|
||||
[[ $string == "world testing-string hello" ]] || (echo "'\$string' was not 'world testing-string hello'" && false)
|
||||
|
||||
# test appending to a unset variable
|
||||
appendToVar nonExistant created hello
|
||||
typeset -p nonExistant
|
||||
if [[ -n $__structuredAttrs ]]; then
|
||||
[[ "''${nonExistant[@]}" == "created hello" ]]
|
||||
else
|
||||
# there's a extra " " in front here and a extra " " in the end of prependToVar
|
||||
# shouldn't matter because these functions will mostly be used for $*Flags and the Flag variable will in most cases already exit
|
||||
[[ "$nonExistant" == " created hello" ]]
|
||||
fi
|
||||
|
||||
eval "$extraTest"
|
||||
|
||||
touch $out
|
||||
'';
|
||||
} // extraAttrs);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
test-env-attrset = testEnvAttrset { name = "test-env-attrset"; stdenv' = bootStdenv; };
|
||||
|
||||
test-prepend-append-to-var = testPrependAndAppendToVar {
|
||||
name = "test-prepend-append-to-var";
|
||||
stdenv' = bootStdenv;
|
||||
};
|
||||
|
||||
test-structured-env-attrset = testEnvAttrset {
|
||||
name = "test-structured-env-attrset";
|
||||
stdenv' = bootStdenv;
|
||||
extraAttrs = { __structuredAttrs = true; };
|
||||
};
|
||||
|
||||
test-cc-wrapper-substitutions = ccWrapperSubstitutionsTest {
|
||||
name = "test-cc-wrapper-substitutions";
|
||||
stdenv' = bootStdenv;
|
||||
};
|
||||
|
||||
structuredAttrsByDefault = lib.recurseIntoAttrs {
|
||||
test-cc-wrapper-substitutions = ccWrapperSubstitutionsTest {
|
||||
name = "test-cc-wrapper-substitutions-structuredAttrsByDefault";
|
||||
stdenv' = bootStdenvStructuredAttrsByDefault;
|
||||
};
|
||||
|
||||
test-structured-env-attrset = testEnvAttrset {
|
||||
name = "test-structured-env-attrset-structuredAttrsByDefault";
|
||||
stdenv' = bootStdenvStructuredAttrsByDefault;
|
||||
};
|
||||
|
||||
test-prepend-append-to-var = testPrependAndAppendToVar {
|
||||
name = "test-prepend-append-to-var-structuredAttrsByDefault";
|
||||
stdenv' = bootStdenvStructuredAttrsByDefault;
|
||||
extraAttrs = {
|
||||
# will be a bash indexed array in attrs.sh
|
||||
# declare -a list=('a' 'b' )
|
||||
# and a json array in attrs.json
|
||||
# "list":["a","b"]
|
||||
list = [ "a" "b" ];
|
||||
# will be a bash associative array(dictionary) in attrs.sh
|
||||
# declare -A array=(['a']='1' ['b']='2' )
|
||||
# and a json object in attrs.json
|
||||
# {"array":{"a":"1","b":"2"}
|
||||
array = { a = "1"; b = "2"; };
|
||||
extraTest = ''
|
||||
declare -p array
|
||||
array+=(["c"]="3")
|
||||
declare -p array
|
||||
|
||||
[[ "''${array[c]}" == "3" ]] || (echo "c element of '\$array' was not '3'" && false)
|
||||
|
||||
declare -p list
|
||||
prependToVar list hello
|
||||
# test that quoted strings work
|
||||
appendToVar list "world"
|
||||
declare -p list
|
||||
|
||||
[[ "''${list[0]}" == "hello" ]] || (echo "first element of '\$list' was not 'hello'" && false)
|
||||
[[ "''${list[1]}" == "a" ]] || (echo "first element of '\$list' was not 'a'" && false)
|
||||
[[ "''${list[-1]}" == "world" ]] || (echo "last element of '\$list' was not 'world'" && false)
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
# Prepare a makefile specifying the appropriate output directories.
|
||||
#
|
||||
# Written by Ludovic Courtès <ludo@gnu.org>.
|
||||
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||
|
||||
source "$stdenv/setup" || exit 1
|
||||
|
||||
|
@ -247,7 +247,7 @@ core-big = stdenv.mkDerivation { #TODO: upmendex
|
||||
"xetex"
|
||||
];
|
||||
postInstall = ''
|
||||
for output in $outputs; do
|
||||
for output in $(getAllOutputNames); do
|
||||
mkdir -p "''${!output}/bin"
|
||||
done
|
||||
|
||||
|
@ -13966,10 +13966,12 @@ with pkgs;
|
||||
|
||||
wrapNonDeterministicGcc = stdenv: ccWrapper:
|
||||
if ccWrapper.isGNU then ccWrapper.overrideAttrs(old: {
|
||||
cc = old.cc.override {
|
||||
env = old.env // {
|
||||
cc = old.env.cc.override {
|
||||
reproducibleBuild = false;
|
||||
profiledCompiler = with stdenv; (!isDarwin && hostPlatform.isx86);
|
||||
};
|
||||
};
|
||||
}) else ccWrapper;
|
||||
|
||||
gccStdenv =
|
||||
|
@ -47,6 +47,10 @@ let
|
||||
feature = "set `strictDeps` to true by default";
|
||||
};
|
||||
|
||||
structuredAttrsByDefault = mkMassRebuild {
|
||||
feature = "set `__structuredAttrs` to true by default";
|
||||
};
|
||||
|
||||
enableParallelBuildingByDefault = mkMassRebuild {
|
||||
feature = "set `enableParallelBuilding` to true by default";
|
||||
};
|
||||
|
@ -23029,7 +23029,7 @@ let
|
||||
|
||||
# For some crazy reason Makefile.PL doesn't generate a Makefile if
|
||||
# AUTOMATED_TESTING is set.
|
||||
AUTOMATED_TESTING = false;
|
||||
env.AUTOMATED_TESTING = false;
|
||||
|
||||
# Makefile.PL looks for ncurses in Glibc's prefix.
|
||||
preConfigure =
|
||||
@ -27058,7 +27058,7 @@ let
|
||||
hash = "sha256-gxxY8549/ebS3QORjSs8IgdBs2aD05Tu+9Bn70gu7gQ=";
|
||||
})
|
||||
];
|
||||
AUTOMATED_TESTING = false;
|
||||
env.AUTOMATED_TESTING = false;
|
||||
nativeBuildInputs = [ pkgs.pkg-config ];
|
||||
buildInputs = [ pkgs.xorg.libxcb pkgs.xorg.xcbproto pkgs.xorg.xcbutil pkgs.xorg.xcbutilwm ExtUtilsDepends ExtUtilsPkgConfig TestDeep TestException XSObjectMagic ];
|
||||
propagatedBuildInputs = [ DataDump MouseXNativeTraits XMLDescent XMLSimple ];
|
||||
|
Loading…
Reference in New Issue
Block a user