Merge pull request #175649 from Artturin/opt-in-structured-attrs

stdenv: support opt-in __structuredAttrs

Changed files
+644 -192
doc
nixos
modules
services
networking
ircd-hybrid
web-servers
jboss
pkgs
applications
misc
adobe-reader
networking
cluster
nomad-autoscaler
office
build-support
bintools-wrapper
cc-wrapper
fetchbzr
fetchcvs
fetchdarcs
fetchdocker
fetchfossil
fetchgit
fetchhg
fetchipfs
fetchmtn
fetchsvn
fetchsvnssh
fetchurl
nuke-references
pkg-config-wrapper
release
setup-hooks
testers
data
icons
catppuccin-cursors
comixcursors
desktops
gnome
core
gnustep
make
development
compilers
interpreters
python
libraries
nim-packages
fetch-nimble
perl-modules
tools
build-managers
apache-maven
boot
misc
automake
parsing
antlr
misc
cups
drivers
samsung
4.00.39
os-specific
darwin
signing-utils
linux
nvidia-x11
opengl
xorg-sys
servers
http
tomcat
axis2
monitoring
munin
x11
xorg
stdenv
test
tools
typesetting
lout
tex
texlive
top-level
+26
doc/stdenv/stdenv.chapter.md
···
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.
## 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.
···
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
nixos/modules/services/networking/ircd-hybrid/builder.sh
···
source $stdenv/setup
doSub() {
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
doSub() {
+1
nixos/modules/services/web-servers/jboss/builder.sh
···
set -e
source $stdenv/setup
mkdir -p $out/bin
···
set -e
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
mkdir -p $out/bin
+1
pkgs/applications/misc/adobe-reader/builder.sh
···
source $stdenv/setup
echo "unpacking $src..."
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
echo "unpacking $src..."
+1 -1
pkgs/applications/networking/cluster/nomad-autoscaler/default.nix
···
mv bin/nomad-autoscaler $bin/bin
ln -s $bin/bin/nomad-autoscaler $out/bin/nomad-autoscaler
-
for d in $outputs; do
mkdir -p ''${!d}/share
done
rmdir $bin/share
···
mv bin/nomad-autoscaler $bin/bin
ln -s $bin/bin/nomad-autoscaler $out/bin/nomad-autoscaler
+
for d in $(getAllOutputNames); do
mkdir -p ''${!d}/share
done
rmdir $bin/share
+1
pkgs/applications/office/libreoffice/download-list-builder.sh
···
source $stdenv/setup
tar --extract --file=$src libreoffice-$version/download.lst -O > $out
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
tar --extract --file=$src libreoffice-$version/download.lst -O > $out
+15 -17
pkgs/build-support/bintools-wrapper/default.nix
···
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;
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;
···
# 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
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"
···
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;
expand-response-params =
if buildPackages ? stdenv && buildPackages.stdenv.hasCC && buildPackages.stdenv.cc != "/dev/null"
···
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 bintools libc nativeTools nativeLibc nativePrefix;
emacsBufferSetup = pkgs: ''
···
strictDeps = true;
depsTargetTargetPropagated = extraPackages;
-
-
wrapperName = "BINTOOLS_WRAPPER";
setupHooks = [
../setup-hooks/role.bash
···
##
+ extraBuildCommands;
-
inherit dynamicLinker;
-
-
# for substitution in utils.bash
-
expandResponseParams = "${expand-response-params}/bin/expand-response-params";
meta =
let bintools_ = if bintools != null then bintools else {}; in
···
bintoolsVersion = lib.getVersion bintools;
bintoolsName = lib.removePrefix targetPrefix (lib.getName bintools);
+
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;
···
# The dynamic linker has different names on different platforms. This is a
# shell glob that ought to match it.
dynamicLinker =
+
/**/ 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"
···
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 "";
expand-response-params =
if buildPackages ? stdenv && buildPackages.stdenv.hasCC && buildPackages.stdenv.cc != "/dev/null"
···
preferLocalBuild = true;
outputs = [ "out" ] ++ optionals propagateDoc ([ "man" ] ++ optional (bintools ? info) "info");
passthru = {
+
inherit targetPrefix suffixSalt;
inherit bintools libc nativeTools nativeLibc nativePrefix;
emacsBufferSetup = pkgs: ''
···
strictDeps = true;
depsTargetTargetPropagated = extraPackages;
setupHooks = [
../setup-hooks/role.bash
···
##
+ extraBuildCommands;
+
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
+15 -15
pkgs/build-support/cc-wrapper/default.nix
···
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;
cc_solib = getLib cc
+ optionalString (targetPlatform != hostPlatform) "/${targetPlatform.config}";
···
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 = {
# "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;
emacsBufferSetup = pkgs: ''
; We should handle propagation here too
···
strictDeps = true;
propagatedBuildInputs = [ bintools ] ++ extraTools ++ optionals cc.langD or false [ zlib ];
depsTargetTargetPropagated = optional (libcxx != null) libcxx ++ extraPackages;
-
-
wrapperName = "CC_WRAPPER";
setupHooks = [
../setup-hooks/role.bash
···
nixSupport);
-
# for substitution in utils.bash
-
expandResponseParams = "${expand-response-params}/bin/expand-response-params";
meta =
let cc_ = if cc != null then cc else {}; in
···
ccVersion = lib.getVersion cc;
ccName = lib.removePrefix targetPrefix (lib.getName cc);
+
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}";
···
preferLocalBuild = true;
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 cc libc nativeTools nativeLibc nativePrefix isGNU isClang;
emacsBufferSetup = pkgs: ''
; We should handle propagation here too
···
strictDeps = true;
propagatedBuildInputs = [ bintools ] ++ extraTools ++ optionals cc.langD or false [ zlib ];
depsTargetTargetPropagated = optional (libcxx != null) libcxx ++ extraPackages;
setupHooks = [
../setup-hooks/role.bash
···
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
pkgs/build-support/fetchbzr/builder.sh
···
source "$stdenv/setup"
header "exporting \`$url' (revision $rev) into \`$out'"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source "$stdenv/setup"
header "exporting \`$url' (revision $rev) into \`$out'"
+1
pkgs/build-support/fetchcvs/builder.sh
···
source $stdenv/setup
(echo "#!$SHELL"; \
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
(echo "#!$SHELL"; \
+1
pkgs/build-support/fetchdarcs/builder.sh
···
source $stdenv/setup
tagtext=""
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
tagtext=""
+2 -1
pkgs/build-support/fetchdocker/fetchdocker-builder.sh
···
source "${stdenv}/setup"
header "exporting ${repository}/${imageName} (tag: ${tag}) into ${out}"
mkdir -p "${out}"
···
# Create a tar archive of a docker image's layers, docker image config
# json, manifest.json, and repositories json; this streams directly to
# stdout and is intended to be used in concert with docker load, i.e:
-
#
# ${out}/compositeImage.sh | docker load
# The first character follow the 's' command for sed becomes the
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source "${stdenv}/setup"
header "exporting ${repository}/${imageName} (tag: ${tag}) into ${out}"
mkdir -p "${out}"
···
# Create a tar archive of a docker image's layers, docker image config
# json, manifest.json, and repositories json; this streams directly to
# stdout and is intended to be used in concert with docker load, i.e:
+
#
# ${out}/compositeImage.sh | docker load
# The first character follow the 's' command for sed becomes the
+1
pkgs/build-support/fetchfossil/builder.sh
···
source $stdenv/setup
header "Cloning Fossil $url [$rev] into $out"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
header "Cloning Fossil $url [$rev] into $out"
+2
pkgs/build-support/fetchgit/builder.sh
···
# - no revision specified and remote has a HEAD which is used
# - revision specified and remote has a HEAD
# - revision specified and remote without HEAD
source $stdenv/setup
header "exporting $url (rev $rev) into $out"
···
# - 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
pkgs/build-support/fetchhg/builder.sh
···
source $stdenv/setup
header "getting $url${rev:+ ($rev)} into $out"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
header "getting $url${rev:+ ($rev)} into $out"
+1
pkgs/build-support/fetchipfs/builder.sh
···
source $stdenv/setup
# Curl flags to handle redirects, not use EPSV, handle cookies for
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
# Curl flags to handle redirects, not use EPSV, handle cookies for
+1
pkgs/build-support/fetchmtn/builder.sh
···
source $stdenv/setup
set -x
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
set -x
+1
pkgs/build-support/fetchsvn/builder.sh
···
source $stdenv/setup
header "exporting $url (r$rev) into $out"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
header "exporting $url (r$rev) into $out"
+1
pkgs/build-support/fetchsvnssh/builder.sh
···
source $stdenv/setup
header "exporting $url (r$rev) into $out"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
header "exporting $url (r$rev) into $out"
+1
pkgs/build-support/fetchurl/builder.sh
···
source $stdenv/setup
source $mirrorsFile
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
source $mirrorsFile
+6 -4
pkgs/build-support/nuke-references/default.nix
···
'';
# FIXME: get rid of perl dependency.
-
inherit perl;
-
inherit (builtins) storeDir;
-
shell = lib.getBin shell + (shell.shellPath or "");
-
signingUtils = if darwinCodeSign then signingUtils else null;
}
···
'';
# 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 "";
+
};
}
+7 -6
pkgs/build-support/pkg-config-wrapper/default.nix
···
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 pkg-config;
};
···
+ ''
ln -s ${pkg-config}/share $out/share
'';
-
-
wrapperName = "PKG_CONFIG_WRAPPER";
setupHooks = [
../setup-hooks/role.bash
···
## Extra custom steps
##
+ extraBuildCommands;
meta =
let pkg-config_ = if pkg-config != null then pkg-config else {}; in
···
preferLocalBuild = true;
outputs = [ "out" ] ++ optionals propagateDoc ([ "man" ] ++ optional (pkg-config ? doc) "doc");
passthru = {
+
inherit targetPrefix suffixSalt;
inherit pkg-config;
};
···
+ ''
ln -s ${pkg-config}/share $out/share
'';
setupHooks = [
../setup-hooks/role.bash
···
## Extra custom steps
##
+ 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
+1 -1
pkgs/build-support/release/nix-build.nix
···
echo "$system" > $out/nix-support/system
if [ -z "${toString doingAnalysis}" ]; then
-
for i in $outputs; 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
···
echo "$system" > $out/nix-support/system
if [ -z "${toString doingAnalysis}" ]; then
+
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
+1 -1
pkgs/build-support/setup-hooks/auto-patchelf.sh
···
# (Expressions don't expand in single quotes, use double quotes for that.)
postFixupHooks+=('
if [ -z "${dontAutoPatchelf-}" ]; then
-
autoPatchelf -- $(for output in $outputs; do
[ -e "${!output}" ] || continue
echo "${!output}"
done)
···
# (Expressions don't expand in single quotes, use double quotes for that.)
postFixupHooks+=('
if [ -z "${dontAutoPatchelf-}" ]; then
+
autoPatchelf -- $(for output in $(getAllOutputNames); do
[ -e "${!output}" ] || continue
echo "${!output}"
done)
+9 -3
pkgs/build-support/setup-hooks/move-docs.sh
···
preFixupHooks+=(_moveToShare)
_moveToShare() {
-
forceShare=${forceShare:=man doc info}
if [[ -z "$out" ]]; then return; fi
-
for d in $forceShare; do
if [ -d "$out/$d" ]; then
if [ -d "$out/share/$d" ]; then
echo "both $d/ and share/$d/ exist!"
···
fi
done
}
-
···
preFixupHooks+=(_moveToShare)
_moveToShare() {
+
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
if [ -d "$out/$d" ]; then
if [ -d "$out/share/$d" ]; then
echo "both $d/ and share/$d/ exist!"
···
fi
done
}
+15 -17
pkgs/build-support/setup-hooks/multiple-outputs.sh
···
# Add standard flags to put files into the desired outputs.
_multioutConfig() {
-
if [ "$outputs" = "out" ] || [ -z "${setOutputFlags-1}" ]; then return; fi;
# try to detect share/doc/${shareDocName}
# Note: sadly, $configureScript detection comes later in configurePhase,
···
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"
-
installFlags="\
-
pkgconfigdir=${!outputDev}/lib/pkgconfig \
-
m4datadir=${!outputDev}/share/aclocal aclocaldir=${!outputDev}/share/aclocal \
-
$installFlags"
}
···
local patt="$1"
local dstOut="$2"
local output
-
for output in $outputs; do
if [ "${!output}" = "$dstOut" ]; then continue; fi
local srcPath
for srcPath in "${!output}"/$patt; do
···
# Move development-only stuff to the desired outputs.
_multioutDevs() {
-
if [ "$outputs" = "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}"
···
# Make the "dev" propagate other outputs needed for development.
_multioutPropagateDev() {
-
if [ "$outputs" = "out" ]; then return; fi;
local outputFirst
-
for outputFirst in $outputs; do
break
done
local propagaterOutput="$outputDev"
···
# Add standard flags to put files into the desired outputs.
_multioutConfig() {
+
if [ "$(getAllOutputNames)" = "out" ] || [ -z "${setOutputFlags-1}" ]; then return; fi;
# try to detect share/doc/${shareDocName}
# Note: sadly, $configureScript detection comes later in configurePhase,
···
fi
fi
+
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
+
prependToVar installFlags \
+
pkgconfigdir="${!outputDev}"/lib/pkgconfig \
+
m4datadir="${!outputDev}"/share/aclocal aclocaldir="${!outputDev}"/share/aclocal
}
···
local patt="$1"
local dstOut="$2"
local output
+
for output in $(getAllOutputNames); do
if [ "${!output}" = "$dstOut" ]; then continue; fi
local srcPath
for srcPath in "${!output}"/$patt; do
···
# Move development-only stuff to the desired outputs.
_multioutDevs() {
+
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}"
···
# Make the "dev" propagate other outputs needed for development.
_multioutPropagateDev() {
+
if [ "$(getAllOutputNames)" = "out" ]; then return; fi;
local outputFirst
+
for outputFirst in $(getAllOutputNames); do
break
done
local propagaterOutput="$outputDev"
+1 -1
pkgs/build-support/setup-hooks/patch-ppd-files/patch-ppd-hook.sh
···
# * 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
addToSearchPath cupspath "${!path}/lib/cups/filter"
addToSearchPath cupspath "${!path}/bin"
done
···
# * 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 $(getAllOutputNames); do
addToSearchPath cupspath "${!path}/lib/cups/filter"
addToSearchPath cupspath "${!path}/bin"
done
+15 -6
pkgs/build-support/setup-hooks/strip.sh
···
local -ra stripCmds=(STRIP STRIP_FOR_TARGET)
local -ra ranlibCmds=(RANLIB RANLIB_FOR_TARGET)
# Strip only host paths by default. Leave targets as is.
-
stripDebugList=${stripDebugList:-lib lib32 lib64 libexec bin sbin}
-
stripDebugListTarget=${stripDebugListTarget:-}
-
stripAllList=${stripAllList:-}
-
stripAllListTarget=${stripAllListTarget:-}
local i
for i in ${!stripCmds[@]}; do
···
if [[ "${dontStrip-}" || "${flag-}" ]] || ! type -f "${stripCmd-}" 2>/dev/null
then continue; fi
-
stripDirs "$stripCmd" "$ranlibCmd" "$debugDirList" "${stripDebugFlags:--S}"
-
stripDirs "$stripCmd" "$ranlibCmd" "$allDirList" "${stripAllFlags:--s}"
done
}
···
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[*]:-}
local i
for i in ${!stripCmds[@]}; do
···
if [[ "${dontStrip-}" || "${flag-}" ]] || ! type -f "${stripCmd-}" 2>/dev/null
then continue; fi
+
stripDirs "$stripCmd" "$ranlibCmd" "$debugDirList" "${stripDebugFlags[*]:--S}"
+
stripDirs "$stripCmd" "$ranlibCmd" "$allDirList" "${stripAllFlags[*]:--s}"
done
}
+1 -1
pkgs/build-support/setup-hooks/win-dll-link.sh
···
# prefix $PATH by currently-built outputs
local DLLPATH=""
local outName
-
for outName in $outputs; do
addToSearchPath DLLPATH "${!outName}/bin"
done
DLLPATH="$DLLPATH:$PATH"
···
# prefix $PATH by currently-built outputs
local DLLPATH=""
local outName
+
for outName in $(getAllOutputNames); do
addToSearchPath DLLPATH "${!outName}/bin"
done
DLLPATH="$DLLPATH:$PATH"
+1 -1
pkgs/build-support/testers/expect-failure.sh
···
# -----------------------------------------
# Write the build log to the default output
-
outs=( $outputs )
defOut=${outs[0]}
defOutPath=${!defOut}
···
# -----------------------------------------
# Write the build log to the default output
+
outs=( $(getAllOutputNames) )
defOut=${outs[0]}
defOutPath=${!defOut}
+1 -1
pkgs/data/icons/catppuccin-cursors/default.nix
···
installPhase = ''
runHook preInstall
-
for output in $outputs; do
if [ "$output" != "out" ]; then
local outputDir="''${!output}"
local iconsDir="$outputDir"/share/icons
···
installPhase = ''
runHook preInstall
+
for output in $(getAllOutputNames); do
if [ "$output" != "out" ]; then
local outputDir="''${!output}"
local iconsDir="$outputDir"/share/icons
+1 -1
pkgs/data/icons/comixcursors/default.nix
···
'';
installPhase = ''
-
for outputName in $outputs ; do
if [ $outputName != out ]; then
local outputDir=''${!outputName};
local iconsDir=$outputDir/share/icons
···
'';
installPhase = ''
+
for outputName in $(getAllOutputNames) ; do
if [ $outputName != out ]; then
local outputDir=''${!outputName};
local iconsDir=$outputDir/share/icons
+1 -1
pkgs/desktops/gnome/core/gdm/default.nix
···
# We use rsync to merge the directories.
rsync --archive "${DESTDIR}/etc" "$out"
rm --recursive "${DESTDIR}/etc"
-
for o in $outputs; do
if [[ "$o" = "debug" ]]; then continue; fi
rsync --archive "${DESTDIR}/''${!o}" "$(dirname "''${!o}")"
rm --recursive "${DESTDIR}/''${!o}"
···
# We use rsync to merge the directories.
rsync --archive "${DESTDIR}/etc" "$out"
rm --recursive "${DESTDIR}/etc"
+
for o in $(getAllOutputNames); do
if [[ "$o" = "debug" ]]; then continue; fi
rsync --archive "${DESTDIR}/''${!o}" "$(dirname "''${!o}")"
rm --recursive "${DESTDIR}/''${!o}"
+1
pkgs/desktops/gnustep/make/builder.sh
···
source $stdenv/setup
preConfigure() {
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
preConfigure() {
+1
pkgs/development/compilers/aspectj/builder.sh
···
source $stdenv/setup
export JAVA_HOME=$jre
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
export JAVA_HOME=$jre
+1
pkgs/development/compilers/chicken/4/fetchegg/builder.sh
···
source $stdenv/setup
header "exporting egg ${eggName} (version $version) into $out"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
header "exporting egg ${eggName} (version $version) into $out"
+1
pkgs/development/compilers/chicken/5/fetchegg/builder.sh
···
source $stdenv/setup
header "exporting egg ${eggName} (version $version) into $out"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
header "exporting egg ${eggName} (version $version) into $out"
+1
pkgs/development/compilers/fpc/binary-builder-darwin.sh
···
source $stdenv/setup
pkgdir=$(pwd)/pkg
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
pkgdir=$(pwd)/pkg
+1
pkgs/development/compilers/fpc/binary-builder.sh
···
source $stdenv/setup
tar xf $src
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
tar xf $src
+1
pkgs/development/compilers/gcc/builder.sh
···
source $stdenv/setup
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
+1
pkgs/development/compilers/ios-cross-compile/9.2_builder.sh
···
# -*- shell-script -*-
source $stdenv/setup
function extract
···
# -*- shell-script -*-
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
function extract
+1
pkgs/development/compilers/ocaml/builder.sh
···
source $stdenv/setup
configureFlags="-prefix $out $configureFlags"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
configureFlags="-prefix $out $configureFlags"
+2 -2
pkgs/development/compilers/openjdk/11.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/12.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/13.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/14.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/15.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/16.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/17.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/18.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/19.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+2 -2
pkgs/development/compilers/openjdk/8.nix
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
-
for output in $outputs; 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
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
···
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
+
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 $(getAllOutputNames); do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
+11 -9
pkgs/development/interpreters/python/cpython/default.nix
···
substituteInPlace "Lib/tkinter/tix.py" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'"
'';
-
CPPFLAGS = concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs);
-
LDFLAGS = concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs);
-
LIBS = "${optionalString (!stdenv.isDarwin) "-lcrypt"}";
-
NIX_LDFLAGS = lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isStatic) ({
-
"glibc" = "-lgcc_s";
-
"musl" = "-lgcc_eh";
-
}."${stdenv.hostPlatform.libc}" or "");
-
# Determinism: We fix the hashes of str, bytes and datetime objects.
-
PYTHONHASHSEED=0;
configureFlags = [
"--without-ensurepip"
···
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"}";
+
NIX_LDFLAGS = lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isStatic) ({
+
"glibc" = "-lgcc_s";
+
"musl" = "-lgcc_eh";
+
}."${stdenv.hostPlatform.libc}" or "");
+
# Determinism: We fix the hashes of str, bytes and datetime objects.
+
PYTHONHASHSEED=0;
+
};
configureFlags = [
"--without-ensurepip"
+3 -1
pkgs/development/interpreters/python/setup-hook.nix
···
hook = ./setup-hook.sh;
in runCommand "python-setup-hook.sh" {
strictDeps = true;
-
inherit sitePackages;
} ''
cp ${hook} hook.sh
substituteAllInPlace hook.sh
···
hook = ./setup-hook.sh;
in runCommand "python-setup-hook.sh" {
strictDeps = true;
+
env = {
+
inherit sitePackages;
+
};
} ''
cp ${hook} hook.sh
substituteAllInPlace hook.sh
+3 -1
pkgs/development/libraries/gettext/default.nix
···
../../../build-support/setup-hooks/role.bash
./gettext-setup-hook.sh
];
-
gettextNeedsLdflags = stdenv.hostPlatform.libc != "glibc" && !stdenv.hostPlatform.isMusl;
enableParallelBuilding = true;
enableParallelChecking = false; # fails sometimes
···
../../../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
+8 -7
pkgs/development/libraries/glibc/common.nix
···
stdenv.mkDerivation ({
version = version + patchSuffix;
-
linuxHeaders = if withLinuxHeaders then linuxHeaders else null;
-
-
inherit (stdenv) is64bit;
enableParallelBuilding = true;
···
nativeBuildInputs = [ bison python3Minimal ] ++ extraNativeBuildInputs;
buildInputs = [ linuxHeaders ] ++ lib.optionals withGd [ gd libpng ] ++ extraBuildInputs;
-
# 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; };
···
stdenv.mkDerivation ({
version = version + patchSuffix;
enableParallelBuilding = true;
···
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
pkgs/development/libraries/glibc/locales-builder.sh
···
# Glibc cannot have itself in its RPATH.
export NIX_NO_SELF_RPATH=1
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
# Glibc cannot have itself in its RPATH.
export NIX_NO_SELF_RPATH=1
+1
pkgs/development/libraries/gtk-sharp/builder.sh
···
source $stdenv/setup
genericBuild
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
genericBuild
+1 -1
pkgs/development/libraries/polkit/default.nix
···
rsync --archive "${DESTDIR}${system}"/* "$out"
rm --recursive "${DESTDIR}${system}"/*
rmdir --parents --ignore-fail-on-non-empty "${DESTDIR}${system}"
-
for o in $outputs; do
rsync --archive "${DESTDIR}/''${!o}" "$(dirname "''${!o}")"
rm --recursive "${DESTDIR}/''${!o}"
done
···
rsync --archive "${DESTDIR}${system}"/* "$out"
rm --recursive "${DESTDIR}${system}"/*
rmdir --parents --ignore-fail-on-non-empty "${DESTDIR}${system}"
+
for o in $(getAllOutputNames); do
rsync --archive "${DESTDIR}/''${!o}" "$(dirname "''${!o}")"
rm --recursive "${DESTDIR}/''${!o}"
done
+1
pkgs/development/libraries/wtk/builder.sh
···
source $stdenv/setup
mkdir unzipped
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
mkdir unzipped
+1 -1
pkgs/development/libraries/xapian/default.nix
···
nativeBuildInputs = [ autoreconfHook ];
doCheck = true;
-
AUTOMATED_TESTING = true; # https://trac.xapian.org/changeset/8be35f5e1/git
patches = lib.optionals stdenv.isDarwin [ ./skip-flaky-darwin-test.patch ];
···
nativeBuildInputs = [ autoreconfHook ];
doCheck = true;
+
env.AUTOMATED_TESTING = true; # https://trac.xapian.org/changeset/8be35f5e1/git
patches = lib.optionals stdenv.isDarwin [ ./skip-flaky-darwin-test.patch ];
+1
pkgs/development/nim-packages/fetch-nimble/builder.sh
···
source $stdenv/setup
export HOME=$NIX_BUILD_TOP
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
export HOME=$NIX_BUILD_TOP
+1
pkgs/development/perl-modules/generic/builder.sh
···
source $stdenv/setup
PERL5LIB="$PERL5LIB${PERL5LIB:+:}$out/lib/perl5/site_perl"
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
PERL5LIB="$PERL5LIB${PERL5LIB:+:}$out/lib/perl5/site_perl"
+6 -3
pkgs/development/perl-modules/generic/default.nix
···
# 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"
, ...
}@attrs:
···
buildInputs = buildInputs ++ [ perl ];
nativeBuildInputs = nativeBuildInputs ++ [ (perl.mini or perl) ];
-
fullperl = buildPerl;
-
inherit outputs src doCheck checkTarget enableParallelBuilding;
-
inherit PERL_AUTOINSTALL AUTOMATED_TESTING PERL_USE_UNSAFE_INC;
meta = defaultMeta // (attrs.meta or { });
});
···
# 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:
···
buildInputs = buildInputs ++ [ perl ];
nativeBuildInputs = nativeBuildInputs ++ [ (perl.mini or perl) ];
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
pkgs/development/tools/build-managers/apache-maven/builder.sh
···
source $stdenv/setup
unpackPhase
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
unpackPhase
+1
pkgs/development/tools/build-managers/boot/builder.sh
···
source $stdenv/setup
boot_bin=$out/bin/boot
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
boot_bin=$out/bin/boot
+1
pkgs/development/tools/misc/automake/builder.sh
···
source $stdenv/setup
# Wrap the given `aclocal' program, appending extra `-I' flags
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
# Wrap the given `aclocal' program, appending extra `-I' flags
+1
pkgs/development/tools/parsing/antlr/builder.sh
···
source $stdenv/setup
tar zxvf $src
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
tar zxvf $src
+1
pkgs/misc/cups/drivers/samsung/4.00.39/builder.sh
···
source $stdenv/setup
arch=$(uname -m)
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
arch=$(uname -m)
+1 -1
pkgs/os-specific/darwin/signing-utils/auto-sign-hook.sh
···
signDarwinBinariesInAllOutputs() {
local output
-
for output in $outputs; do
signDarwinBinariesIn "${!output}"
done
}
···
signDarwinBinariesInAllOutputs() {
local output
+
for output in $(getAllOutputNames); do
signDarwinBinariesIn "${!output}"
done
}
+1
pkgs/os-specific/linux/nvidia-x11/builder.sh
···
source $stdenv/setup
unpackManually() {
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
unpackManually() {
+1
pkgs/os-specific/linux/opengl/xorg-sys/builder.sh
···
source $stdenv/setup
mkdir -p $out/lib
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
mkdir -p $out/lib
+1
pkgs/servers/http/tomcat/axis2/builder.sh
···
source $stdenv/setup
unzip $src
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
source $stdenv/setup
unzip $src
+1 -1
pkgs/servers/monitoring/munin/default.nix
···
];
# needs to find a local perl module during build
-
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
···
];
# needs to find a local perl module during build
+
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
pkgs/servers/x11/xorg/builder.sh
···
# This is the builder for all X.org components.
source $stdenv/setup
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
# This is the builder for all X.org components.
source $stdenv/setup
+4 -3
pkgs/stdenv/darwin/default.nix
···
ln -s ${bootstrapTools}/bin/rewrite-tbd $out/bin
'';
-
binutils-unwrapped = { name = "bootstrap-stage0-binutils"; outPath = bootstrapTools; };
-
cctools = {
name = "bootstrap-stage0-cctools";
-
outPath = bootstrapTools;
targetPrefix = "";
};
···
ln -s ${bootstrapTools}/bin/rewrite-tbd $out/bin
'';
+
binutils-unwrapped = bootstrapTools // {
+
name = "bootstrap-stage0-binutils";
+
};
+
cctools = bootstrapTools // {
name = "bootstrap-stage0-cctools";
targetPrefix = "";
};
+4
pkgs/stdenv/generic/default-builder.sh
···
source $stdenv/setup
genericBuild
···
+
if [ -f .attrs.sh ]; then
+
. .attrs.sh
+
fi
+
source $stdenv/setup
genericBuild
+25 -6
pkgs/stdenv/generic/make-derivation.nix
···
(! attrs ? outputHash) # Fixed-output drvs can't be content addressed too
&& config.contentAddressedByDefault
, ... } @ attrs:
let
···
lib.unique (lib.concatMap (input: input.__propagatedImpureHostDeps or [])
(lib.concatLists propagatedDependencies));
derivationArg =
(removeAttrs attrs
-
["meta" "passthru" "pos"
"checkInputs" "installCheckInputs"
"__darwinAllowLocalNetworking"
"__impureHostDeps" "__propagatedImpureHostDeps"
-
"sandboxProfile" "propagatedSandboxProfile"])
// (lib.optionalAttrs (attrs ? name || (attrs ? pname && attrs ? version)) {
name =
let
···
then attrs.name + hostSuffix
else "${attrs.pname}${staticMarker}${hostSuffix}-${attrs.version}"
);
-
}) // {
builder = attrs.realBuilder or stdenv.shell;
args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)];
inherit stdenv;
···
userHook = config.stdenv.userHook or null;
__ignoreNulls = true;
-
-
inherit strictDeps;
depsBuildBuild = lib.elemAt (lib.elemAt dependencies 0) 0;
nativeBuildInputs = lib.elemAt (lib.elemAt dependencies 0) 1;
···
else true);
};
in
lib.extendDerivation
···
# should be made available to Nix expressions using the
# derivation (e.g., in assertions).
passthru)
-
(derivation derivationArg);
in
fnOrAttrs:
···
(! 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
···
lib.unique (lib.concatMap (input: input.__propagatedImpureHostDeps or [])
(lib.concatLists propagatedDependencies));
+
envIsExportable = lib.isAttrs env && !lib.isDerivation env;
+
derivationArg =
(removeAttrs attrs
+
(["meta" "passthru" "pos"
"checkInputs" "installCheckInputs"
"__darwinAllowLocalNetworking"
"__impureHostDeps" "__propagatedImpureHostDeps"
+
"sandboxProfile" "propagatedSandboxProfile"]
+
++ lib.optionals envIsExportable [ "env" ]))
// (lib.optionalAttrs (attrs ? name || (attrs ? pname && attrs ? version)) {
name =
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;
···
userHook = config.stdenv.userHook or null;
__ignoreNulls = true;
+
inherit __structuredAttrs strictDeps;
depsBuildBuild = lib.elemAt (lib.elemAt dependencies 0) 0;
nativeBuildInputs = lib.elemAt (lib.elemAt dependencies 0) 1;
···
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
···
# should be made available to Nix expressions using the
# derivation (e.g., in assertions).
passthru)
+
(derivation (derivationArg // lib.optionalAttrs envIsExportable checkedEnv));
in
fnOrAttrs:
+223 -53
pkgs/stdenv/generic/setup.sh
···
set -x
fi
-
: ${outputs:=out}
######################################################################
# Hook handling.
···
addToSearchPathWithCustomDelimiter ":" "$@"
}
# Add $1/lib* into rpaths.
# The function is used in multiple-outputs.sh hook,
# so it is defined here but tried after the hook.
···
######################################################################
# Initialisation.
# Set a fallback default value for SOURCE_DATE_EPOCH, used by some build tools
···
done
}
# Make sure all are at least defined as empty
: ${depsBuildBuild=} ${depsBuildBuildPropagated=}
: ${nativeBuildInputs=} ${propagatedNativeBuildInputs=} ${defaultNativeBuildInputs=}
···
: ${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
···
}
_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}"
···
srcs="$src"
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,
···
done
# Unpack all source archives.
-
for i in $srcs; do
unpackFile "$i"
done
···
patchPhase() {
runHook prePatch
-
for i in ${patches:-}; do
header "applying patch $i" 3
local uncompress=cat
case "$i" in
···
uncompress="lzma -d"
;;
esac
# "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}
done
runHook postPatch
···
# set to empty if unset
: ${configureScript=}
-
: ${configureFlags=}
if [[ -z "$configureScript" && -x ./configure ]]; then
configureScript=./configure
···
fi
if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then
-
configureFlags="${prefixKey:---prefix=}$prefix $configureFlags"
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"
fi
fi
# By default, disable static builds.
if [ -z "${dontDisableStatic:-}" ]; then
if grep -q enable-static "$configureScript"; then
-
configureFlags="--disable-static $configureFlags"
fi
fi
fi
if [ -n "$configureScript" ]; then
-
# Old bash empty array hack
-
# shellcheck disable=SC2086
-
local flagsArray=(
-
$configureFlags "${configureFlagsArray[@]}"
-
)
echoCmd 'configure flags' "${flagsArray[@]}"
# shellcheck disable=SC2086
$configureScript "${flagsArray[@]}"
···
buildPhase() {
runHook preBuild
-
# set to empty if unset
-
: ${makeFlags=}
-
-
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[@]}"
)
echoCmd 'build flags' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
local flagsArray=(
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
SHELL=$SHELL
-
$makeFlags "${makeFlagsArray[@]}"
-
${checkFlags:-VERBOSE=y} "${checkFlagsArray[@]}"
-
${checkTarget}
)
echoCmd 'check flags' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
mkdir -p "$prefix"
fi
-
# Old bash empty array hack
# shellcheck disable=SC2086
local flagsArray=(
SHELL=$SHELL
-
$makeFlags "${makeFlagsArray[@]}"
-
$installFlags "${installFlagsArray[@]}"
-
${installTargets:-install}
)
echoCmd 'install flags' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
fixupPhase() {
# Make sure everything is writable so "strip" et al. work.
local output
-
for output in $outputs; do
if [ -e "${!output}" ]; then chmod -R u+w "${!output}"; fi
done
···
# Apply fixup to each output.
local output
-
for output in $outputs; do
prefix="${!output}" runHook fixupOutput
done
···
if [ -n "${setupHooks:-}" ]; then
mkdir -p "${!outputDev}/nix-support"
local hook
-
for hook in $setupHooks; do
local content
consumeEntire content < "$hook"
substituteAllStream content "file '$hook'" >> "${!outputDev}/nix-support/setup-hook"
···
local flagsArray=(
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
SHELL=$SHELL
-
$makeFlags "${makeFlagsArray[@]}"
-
$installCheckFlags "${installCheckFlagsArray[@]}"
-
${installCheckTarget:-installcheck}
)
echoCmd 'installcheck flags' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
distPhase() {
runHook preDist
-
# Old bash empty array hack
-
# shellcheck disable=SC2086
-
local flagsArray=(
-
$distFlags "${distFlagsArray[@]}" ${distTarget:-dist}
-
)
echo 'dist flags: %q' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
# Note: don't quote $tarballs, since we explicitly permit
# wildcards in there.
# shellcheck disable=SC2086
-
cp -pvd ${tarballs:-*.tar.gz} "$out/tarballs"
fi
runHook postDist
···
return
fi
-
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
if [[ "$curPhase" = unpackPhase && -n "${dontUnpack:-}" ]]; then continue; fi
if [[ "$curPhase" = patchPhase && -n "${dontPatch:-}" ]]; then continue; fi
if [[ "$curPhase" = configurePhase && -n "${dontConfigure:-}" ]]; then continue; fi
···
dumpVars
# Restore the original options for nix-shell
[[ $__nixpkgs_setup_set_original == *e* ]] || set +e
···
set -x
fi
+
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.
···
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.
···
######################################################################
# 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
···
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=}
···
: ${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
···
}
_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}"
···
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,
···
done
# Unpack all source archives.
+
for i in "${srcsArray[@]}"; do
unpackFile "$i"
done
···
patchPhase() {
runHook prePatch
+
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
···
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 "${flagsArray[@]}"
done
runHook postPatch
···
# set to empty if unset
: ${configureScript=}
if [[ -z "$configureScript" && -x ./configure ]]; then
configureScript=./configure
···
fi
if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then
+
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
+
prependToVar configureFlags --disable-dependency-tracking
fi
fi
# By default, disable static builds.
if [ -z "${dontDisableStatic:-}" ]; then
if grep -q enable-static "$configureScript"; then
+
prependToVar configureFlags --disable-static
fi
fi
fi
if [ -n "$configureScript" ]; then
+
local -a flagsArray
+
_accumFlagsArray configureFlags configureFlagsArray
+
echoCmd 'configure flags' "${flagsArray[@]}"
# shellcheck disable=SC2086
$configureScript "${flagsArray[@]}"
···
buildPhase() {
runHook preBuild
+
if [[ -z "${makeFlags-}" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then
echo "no Makefile, doing nothing"
else
foundMakefile=1
# shellcheck disable=SC2086
local flagsArray=(
${enableParallelBuilding:+-j${NIX_BUILD_CORES}}
SHELL=$SHELL
)
+
_accumFlagsArray makeFlags makeFlagsArray buildFlags buildFlagsArray
echoCmd 'build flags' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
local flagsArray=(
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
SHELL=$SHELL
)
+
_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[@]}"
···
mkdir -p "$prefix"
fi
# shellcheck disable=SC2086
local flagsArray=(
SHELL=$SHELL
)
+
_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[@]}"
···
fixupPhase() {
# Make sure everything is writable so "strip" et al. work.
local output
+
for output in $(getAllOutputNames); do
if [ -e "${!output}" ]; then chmod -R u+w "${!output}"; fi
done
···
# Apply fixup to each output.
local output
+
for output in $(getAllOutputNames); do
prefix="${!output}" runHook fixupOutput
done
···
if [ -n "${setupHooks:-}" ]; then
mkdir -p "${!outputDev}/nix-support"
local hook
+
# 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"
···
local flagsArray=(
${enableParallelChecking:+-j${NIX_BUILD_CORES}}
SHELL=$SHELL
)
+
+
_accumFlagsArray makeFlags makeFlagsArray \
+
installCheckFlags installCheckFlagsArray
+
flagsArray+=( ${installCheckTarget:-installcheck} )
echoCmd 'installcheck flags' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
distPhase() {
runHook preDist
+
local flagsArray=()
+
_accumFlagsArray distFlags distFlagsArray
+
flagsArray+=( ${distTarget:-dist} )
echo 'dist flags: %q' "${flagsArray[@]}"
make ${makefile:+-f $makefile} "${flagsArray[@]}"
···
# Note: don't quote $tarballs, since we explicitly permit
# wildcards in there.
# shellcheck disable=SC2086
+
cp -pvd ${tarballs[*]:-*.tar.gz} "$out/tarballs"
fi
runHook postDist
···
return
fi
+
if [ -z "${phases[*]:-}" ]; then
+
phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \
+
configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \
+
${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \
+
${preDistPhases[*]:-} distPhase ${postPhases[*]:-}";
fi
+
# 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
···
dumpVars
+
# Restore the original options for nix-shell
[[ $__nixpkgs_setup_set_original == *e* ]] || set +e
+1 -1
pkgs/stdenv/linux/default.nix
···
# 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";
});
libidn2 = super.libidn2.overrideAttrs (attrs: {
postFixup = attrs.postFixup or "" + ''
···
# 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.
+
env = attrs.env or {} // { am_cv_func_iconv_works = "yes"; };
});
libidn2 = super.libidn2.overrideAttrs (attrs: {
postFixup = attrs.postFixup or "" + ''
+1
pkgs/test/default.nix
···
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 { };
config = callPackage ./config.nix { };
···
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
pkgs/test/simple/builder.sh
···
set -x
export NIX_DEBUG=1
···
+
if [ -e .attrs.sh ]; then source .attrs.sh; fi
set -x
export NIX_DEBUG=1
+159
pkgs/test/stdenv/default.nix
···
···
+
# 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
pkgs/tools/typesetting/lout/builder.sh
···
# Prepare a makefile specifying the appropriate output directories.
#
# Written by Ludovic Courtès <ludo@gnu.org>.
source "$stdenv/setup" || exit 1
···
# 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
+1 -1
pkgs/tools/typesetting/tex/texlive/bin.nix
···
"xetex"
];
postInstall = ''
-
for output in $outputs; do
mkdir -p "''${!output}/bin"
done
···
"xetex"
];
postInstall = ''
+
for output in $(getAllOutputNames); do
mkdir -p "''${!output}/bin"
done
+5 -3
pkgs/top-level/all-packages.nix
···
wrapNonDeterministicGcc = stdenv: ccWrapper:
if ccWrapper.isGNU then ccWrapper.overrideAttrs(old: {
-
cc = old.cc.override {
-
reproducibleBuild = false;
-
profiledCompiler = with stdenv; (!isDarwin && hostPlatform.isx86);
};
}) else ccWrapper;
···
wrapNonDeterministicGcc = stdenv: ccWrapper:
if ccWrapper.isGNU then ccWrapper.overrideAttrs(old: {
+
env = old.env // {
+
cc = old.env.cc.override {
+
reproducibleBuild = false;
+
profiledCompiler = with stdenv; (!isDarwin && hostPlatform.isx86);
+
};
};
}) else ccWrapper;
+4
pkgs/top-level/config.nix
···
feature = "set `strictDeps` to true by default";
};
enableParallelBuildingByDefault = mkMassRebuild {
feature = "set `enableParallelBuilding` to true by default";
};
···
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";
};
+2 -2
pkgs/top-level/perl-packages.nix
···
# For some crazy reason Makefile.PL doesn't generate a Makefile if
# AUTOMATED_TESTING is set.
-
AUTOMATED_TESTING = false;
# Makefile.PL looks for ncurses in Glibc's prefix.
preConfigure =
···
hash = "sha256-gxxY8549/ebS3QORjSs8IgdBs2aD05Tu+9Bn70gu7gQ=";
})
];
-
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 ];
···
# For some crazy reason Makefile.PL doesn't generate a Makefile if
# AUTOMATED_TESTING is set.
+
env.AUTOMATED_TESTING = false;
# Makefile.PL looks for ncurses in Glibc's prefix.
preConfigure =
···
hash = "sha256-gxxY8549/ebS3QORjSs8IgdBs2aD05Tu+9Bn70gu7gQ=";
})
];
+
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 ];