Merge branch 'staging'

This commit is contained in:
Vladimír Čunát 2017-12-19 10:27:13 +01:00
commit 4a2340ff6b
No known key found for this signature in database
GPG Key ID: E747DF1F9575A3AA
68 changed files with 1043 additions and 373 deletions

View File

@ -1357,33 +1357,64 @@ someVar=$(stripHash $name)
<variablelist> <variablelist>
<varlistentry>
<term>Bintools Wrapper</term>
<listitem>
<para>
Bintools Wrapper wraps the binary utilities for a bunch of miscellaneous purposes.
These are GNU Binutils when targetting Linux, and a mix of cctools and GNU binutils for Darwin.
[The "Bintools" name is supposed to be a compromise between "Binutils" and "cctools" not denoting any specific implementation.]
Specifically, the underlying bintools package, and a C standard library (glibc or Darwin's libSystem, just for the dynamic loader) are all fed in, and dependency finding, hardening (see below), and purity checks for each are handled by Bintools Wrapper.
Packages typically depend on CC Wrapper, which in turn (at run time) depends on Bintools Wrapper.
</para>
<para>
Bintools Wrapper was only just recently split off from CC Wrapper, so the division of labor is still being worked out.
For example, it shouldn't care about about the C standard library, but just take a derivation with the dynamic loader (which happens to be the glibc on linux).
Dependency finding however is a task both wrappers will continue to need to share, and probably the most important to understand.
It is currently accomplished by collecting directories of host-platform dependencies (i.e. <varname>buildInputs</varname> and <varname>nativeBuildInputs</varname>) in environment variables.
Bintools Wrapper's setup hook causes any <filename>lib</filename> and <filename>lib64</filename> subdirectories to be added to <envar>NIX_LDFLAGS</envar>.
Since CC Wrapper and Bintools Wrapper use the same strategy, most of the Bintools Wrapper code is sparsely commented and refers to CC Wrapper.
But CC Wrapper's code, by contrast, has quite lengthy comments.
Bintools Wrapper merely cites those, rather than repeating them, to avoid falling out of sync.
</para>
<para>
A final task of the setup hook is defining a number of standard environment variables to tell build systems which executables full-fill which purpose.
They are defined to just be the base name of the tools, under the assumption that Bintools Wrapper's binaries will be on the path.
Firstly, this helps poorly-written packages, e.g. ones that look for just <command>gcc</command> when <envar>CC</envar> isn't defined yet <command>clang</command> is to be used.
Secondly, this helps packages not get confused when cross-compiling, in which case multiple Bintools Wrappers may simultaneously be in use.
<footnote><para>
Each wrapper targets a single platform, so if binaries for multiple platforms are needed, the underlying binaries must be wrapped multiple times.
As this is a property of the wrapper itself, the multiple wrappings are needed whether or not the same underlying binaries can target multiple platforms.
</para></footnote>
<envar>BUILD_</envar>- and <envar>TARGET_</envar>-prefixed versions of the normal environment variable are defined for the additional Bintools Wrappers, properly disambiguating them.
</para>
<para>
A problem with this final task is that Bintools Wrapper is honest and defines <envar>LD</envar> as <command>ld</command>.
Most packages, however, firstly use the C compiler for linking, secondly use <envar>LD</envar> anyways, defining it as the C compiler, and thirdly, only so define <envar>LD</envar> when it is undefined as a fallback.
This triple-threat means Bintools Wrapper will break those packages, as LD is already defined as the actual linker which the package won't override yet doesn't want to use.
The workaround is to define, just for the problematic package, <envar>LD</envar> as the C compiler.
A good way to do this would be <command>preConfigure = "LD=$CC"</command>.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term>CC Wrapper</term> <term>CC Wrapper</term>
<listitem> <listitem>
<para> <para>
CC Wrapper wraps a C toolchain for a bunch of miscellaneous purposes. CC Wrapper wraps a C toolchain for a bunch of miscellaneous purposes.
Specifically, a C compiler (GCC or Clang), Binutils (or the CCTools + binutils mashup when targetting Darwin), and a C standard library (glibc or Darwin's libSystem) are all fed in, and dependency finding, hardening (see below), and purity checks for each are handled by CC Wrapper. Specifically, a C compiler (GCC or Clang), wrapped binary tools, and a C standard library (glibc or Darwin's libSystem, just for the dynamic loader) are all fed in, and dependency finding, hardening (see below), and purity checks for each are handled by CC Wrapper.
Packages typically depend on only CC Wrapper, instead of those 3 inputs directly. Packages typically depend on CC Wrapper, which in turn (at run time) depends on Bintools Wrapper.
</para> </para>
<para> <para>
Dependency finding is undoubtedly the main task of CC wrapper. Dependency finding is undoubtedly the main task of CC Wrapper.
It is currently accomplished by collecting directories of host-platform dependencies (i.e. <varname>buildInputs</varname> and <varname>nativeBuildInputs</varname>) in environment variables. This works just like Bintools Wrapper, except that any <filename>include</filename> subdirectory of any relevant dependency is added to <envar>NIX_CFLAGS_COMPILE</envar>.
CC wrapper's setup hook causes any <filename>include</filename> subdirectory of such a dependency to be added to <envar>NIX_CFLAGS_COMPILE</envar>, and any <filename>lib</filename> and <filename>lib64</filename> subdirectories to <envar>NIX_LDFLAGS</envar>.
The setup hook itself contains some lengthy comments describing the exact convoluted mechanism by which this is accomplished. The setup hook itself contains some lengthy comments describing the exact convoluted mechanism by which this is accomplished.
</para> </para>
<para> <para>
A final task of the setup hook is defining a number of standard environment variables to tell build systems which executables full-fill which purpose. CC Wrapper also like Bintools Wrapper defines standard environment variables with the names of the tools it wraps, for the same reasons described above.
They are defined to just be the base name of the tools, under the assumption that CC Wrapper's binaries will be on the path. Importantly, while it includes a <command>cc</command> symlink to the c compiler for portability, the <envar>CC</envar> will be defined using the compiler's "real name" (i.e. <command>gcc</command> or <command>clang</command>).
Firstly, this helps poorly-written packages, e.g. ones that look for just <command>gcc</command> when <envar>CC</envar> isn't defined yet <command>clang</command> is to be used. This helps lousy build systems that inspect on the name of the compiler rather than run it.
Secondly, this helps packages not get confused when cross-compiling, in which case multiple CC wrappers may be simultaneous in use (targeting different platforms).
<envar>BUILD_</envar>- and <envar>TARGET_</envar>-prefixed versions of the normal environment variable are defined for the additional CC Wrappers, properly disambiguating them.
</para>
<para>
A problem with this final task is that CC Wrapper is honest and defines <envar>LD</envar> as <command>ld</command>.
Most packages, however, firstly use the C compiler for linking, secondly use <envar>LD</envar> anyways, defining it as the C compiler, and thirdly, only so define <envar>LD</envar> when it is undefined as a fallback.
This triple-threat means CC Wrapper will break those packages, as LD is already defined as the actually linker which the package won't override yet doesn't want to use.
The workaround is to define, just for the problematic package, <envar>LD</envar> as the C compiler.
A good way to do this would be <command>preConfigure = "LD=$CC"</command>.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -1,4 +1,4 @@
{ stdenv, fetchurl, fetchFromGitHub, makeWrapper { stdenv, fetchurl, fetchFromGitHub, fetchpatch, makeWrapper
, docutils, perl, pkgconfig, python3, which, ffmpeg , docutils, perl, pkgconfig, python3, which, ffmpeg
, freefont_ttf, freetype, libass, libpthreadstubs , freefont_ttf, freetype, libass, libpthreadstubs
, lua, lua5_sockets, libuchardet, libiconv ? null, darwin , lua, lua5_sockets, libuchardet, libiconv ? null, darwin
@ -90,7 +90,14 @@ in stdenv.mkDerivation rec {
sha256 = "0746kmsg69675y5c70vn8imcr9d1zpjz97f27xr1vx00yjpd518v"; sha256 = "0746kmsg69675y5c70vn8imcr9d1zpjz97f27xr1vx00yjpd518v";
}; };
patchPhase = '' patches = [
(fetchpatch {
url = "https://github.com/mpv-player/mpv/commit/2ecf240b1cd20875991a5b18efafbe799864ff7f.patch";
sha256 = "1sr0770rvhsgz8d7ysr9qqp4g9gwdhgj8g3rgnz90wl49lgrykhb";
})
];
postPatch = ''
patchShebangs ./TOOLS/ patchShebangs ./TOOLS/
''; '';

View File

@ -0,0 +1,40 @@
# See cc-wrapper for comments.
var_templates_list=(
NIX+IGNORE_LD_THROUGH_GCC
NIX+LDFLAGS
NIX+LDFLAGS_BEFORE
NIX+LDFLAGS_AFTER
NIX+LDFLAGS_HARDEN
)
var_templates_bool=(
NIX+SET_BUILD_ID
NIX+DONT_SET_RPATH
)
declare -a role_infixes=()
if [ "${NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_BUILD:-}" ]; then
role_infixes+=(_BUILD_)
fi
if [ "${NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_HOST:-}" ]; then
role_infixes+=(_)
fi
if [ "${NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_TARGET:-}" ]; then
role_infixes+=(_TARGET_)
fi
for var in "${var_templates_list[@]}"; do
mangleVarList "$var" "${role_infixes[@]}"
done
for var in "${var_templates_bool[@]}"; do
mangleVarBool "$var" "${role_infixes[@]}"
done
if [ -e @out@/nix-support/libc-ldflags ]; then
NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/libc-ldflags)"
fi
if [ -e @out@/nix-support/libc-ldflags-before ]; then
NIX_@infixSalt@_LDFLAGS_BEFORE="$(< @out@/nix-support/libc-ldflags-before) $NIX_@infixSalt@_LDFLAGS_BEFORE"
fi
export NIX_BINTOOLS_WRAPPER_@infixSalt@_FLAGS_SET=1

View File

@ -0,0 +1,53 @@
hardeningFlags=(relro bindnow)
# Intentionally word-split in case 'hardeningEnable' is defined in
# Nix. Also, our bootstrap tools version of bash is old enough that
# undefined arrays trip `set -u`.
if [[ -v hardeningEnable[@] ]]; then
hardeningFlags+=(${hardeningEnable[@]})
fi
hardeningLDFlags=()
declare -A hardeningDisableMap
# Intentionally word-split in case 'hardeningDisable' is defined in Nix.
for flag in ${hardeningDisable[@]:-IGNORED_KEY} @hardening_unsupported_flags@
do
hardeningDisableMap[$flag]=1
done
if (( "${NIX_DEBUG:-0}" >= 1 )); then
printf 'HARDENING: disabled flags:' >&2
(( "${#hardeningDisableMap[@]}" )) && printf ' %q' "${!hardeningDisableMap[@]}" >&2
echo >&2
fi
if [[ -z "${hardeningDisableMap[all]:-}" ]]; then
if (( "${NIX_DEBUG:-0}" >= 1 )); then
echo 'HARDENING: Is active (not completely disabled with "all" flag)' >&2;
fi
for flag in "${hardeningFlags[@]}"
do
if [[ -z "${hardeningDisableMap[$flag]:-}" ]]; then
case $flag in
pie)
if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then
if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi
hardeningLDFlags+=('-pie')
fi
;;
relro)
if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi
hardeningLDFlags+=('-z' 'relro')
;;
bindnow)
if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi
hardeningLDFlags+=('-z' 'now')
;;
*)
# Ignore unsupported. Checked in Nix that at least *some*
# tool supports each flag.
;;
esac
fi
done
fi

View File

@ -0,0 +1,292 @@
# The Nixpkgs CC is not directly usable, since it doesn't know where
# the C library and standard header files are. Therefore the compiler
# produced by that package cannot be installed directly in a user
# environment and used from the command line. So we use a wrapper
# script that sets up the right environment variables so that the
# compiler and the linker just "work".
{ name ? "", stdenvNoCC, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? ""
, bintools ? null, libc ? null
, coreutils ? null, shell ? stdenvNoCC.shell, gnugrep ? null
, extraPackages ? [], extraBuildCommands ? ""
, buildPackages ? {}
, useMacosReexportHack ? false
}:
with stdenvNoCC.lib;
assert nativeTools -> nativePrefix != "";
assert !nativeTools ->
bintools != null && coreutils != null && gnugrep != null;
assert !(nativeLibc && noLibc);
assert (noLibc || nativeLibc) == (libc == null);
let
stdenv = stdenvNoCC;
inherit (stdenv) hostPlatform targetPlatform;
# Prefix for binaries. Customarily ends with a dash separator.
#
# TODO(@Ericson2314) Make unconditional, or optional but always true by
# default.
targetPrefix = stdenv.lib.optionalString (targetPlatform != hostPlatform)
(targetPlatform.config + "-");
bintoolsVersion = (builtins.parseDrvName bintools.name).version;
bintoolsName = (builtins.parseDrvName bintools.name).name;
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;
dashlessTarget = stdenv.lib.replaceStrings ["-"] ["_"] targetPlatform.config;
# See description in cc-wrapper.
infixSalt = dashlessTarget;
# The dynamic linker has different names on different platforms. This is a
# shell glob that ought to match it.
dynamicLinker =
/**/ if libc == null then null
else if targetPlatform.system == "i686-linux" then "${libc_lib}/lib/ld-linux.so.2"
else if targetPlatform.system == "x86_64-linux" then "${libc_lib}/lib/ld-linux-x86-64.so.2"
# ARM with a wildcard, which can be "" or "-armhf".
else if (with targetPlatform; isArm && isLinux) then "${libc_lib}/lib/ld-linux*.so.3"
else if targetPlatform.system == "aarch64-linux" then "${libc_lib}/lib/ld-linux-aarch64.so.1"
else if targetPlatform.system == "powerpc-linux" then "${libc_lib}/lib/ld.so.1"
else if targetPlatform.system == "mips64el-linux" then "${libc_lib}/lib/ld.so.1"
else if targetPlatform.isDarwin then "/usr/lib/dyld"
else if stdenv.lib.hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1"
else null;
expand-response-params =
if buildPackages.stdenv.cc or null != null && buildPackages.stdenv.cc != "/dev/null"
then import ../expand-response-params { inherit (buildPackages) stdenv; }
else "";
in
stdenv.mkDerivation {
name = targetPrefix
+ (if name != "" then name else "${bintoolsName}-wrapper")
+ (stdenv.lib.optionalString (bintools != null && bintoolsVersion != "") "-${bintoolsVersion}");
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 infixSalt;
outputs = [ "out" "info" "man" ];
passthru = {
inherit bintools libc nativeTools nativeLibc nativePrefix;
emacsBufferSetup = pkgs: ''
; We should handle propagation here too
(mapc
(lambda (arg)
(when (file-directory-p (concat arg "/lib"))
(setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib")))
(when (file-directory-p (concat arg "/lib64"))
(setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib64"))))
'(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)}))
'';
};
dontBuild = true;
dontConfigure = true;
unpackPhase = ''
src=$PWD
'';
installPhase =
''
set -u
mkdir -p $out/bin {$out,$info,$man}/nix-support
wrap() {
local dst="$1"
local wrapper="$2"
export prog="$3"
set +u
substituteAll "$wrapper" "$out/bin/$dst"
set -u
chmod +x "$out/bin/$dst"
}
''
+ (if nativeTools then ''
echo ${nativePrefix} > $out/nix-support/orig-bintools
ldPath="${nativePrefix}/bin"
'' else ''
echo $bintools_bin > $out/nix-support/orig-bintools
ldPath="${bintools_bin}/bin"
''
+ optionalString (targetPlatform.isSunOS && nativePrefix != "") ''
# Solaris needs an additional ld wrapper.
ldPath="${nativePrefix}/bin"
exec="$ldPath/${targetPrefix}ld"
wrap ld-solaris ${./ld-solaris-wrapper.sh}
'')
+ ''
# Create a symlink to as (the assembler).
if [ -e $ldPath/${targetPrefix}as ]; then
ln -s $ldPath/${targetPrefix}as $out/bin/${targetPrefix}as
fi
'' + (if !useMacosReexportHack then ''
wrap ${targetPrefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${targetPrefix}ld}
'' else ''
ldInner="${targetPrefix}ld-reexport-delegate"
wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${targetPrefix}ld}
wrap "${targetPrefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner"
unset ldInner
'') + ''
for variant in ld.gold ld.bfd ld.lld; do
local underlying=$ldPath/${targetPrefix}$variant
[[ -e "$underlying" ]] || continue
wrap ${targetPrefix}$variant ${./ld-wrapper.sh} $underlying
done
set +u
'';
propagatedBuildInputs = extraPackages;
setupHook = ./setup-hook.sh;
postFixup =
''
set -u
''
+ optionalString (libc != null) (''
##
## General libc support
##
echo "-L${libc_lib}/lib" > $out/nix-support/libc-ldflags
echo "${libc_lib}" > $out/nix-support/orig-libc
echo "${libc_dev}" > $out/nix-support/orig-libc-dev
##
## Dynamic linker support
##
if [[ -z ''${dynamicLinker+x} ]]; then
echo "Don't know the name of the dynamic linker for platform '${targetPlatform.config}', so guessing instead." >&2
local dynamicLinker="${libc_lib}/lib/ld*.so.?"
fi
# Expand globs to fill array of options
dynamicLinker=($dynamicLinker)
case ''${#dynamicLinker[@]} in
0) echo "No dynamic linker found for platform '${targetPlatform.config}'." >&2;;
1) echo "Using dynamic linker: '$dynamicLinker'" >&2;;
*) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'." >&2;;
esac
if [ -n "''${dynamicLinker:-}" ]; then
echo $dynamicLinker > $out/nix-support/dynamic-linker
'' + (if targetPlatform.isDarwin then ''
printf "export LD_DYLD_PATH=%q\n" "$dynamicLinker" >> $out/nix-support/setup-hook
'' else ''
if [ -e ${libc_lib}/lib/32/ld-linux.so.2 ]; then
echo ${libc_lib}/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32
fi
local ldflagsBefore=(-dynamic-linker "$dynamicLinker")
'') + ''
fi
# The dynamic linker is passed in `ldflagsBefore' to allow
# explicit overrides of the dynamic linker by callers to ld
# (the *last* value counts, so ours should come first).
printWords "''${ldflagsBefore[@]}" > $out/nix-support/libc-ldflags-before
'')
+ optionalString (!nativeTools) ''
##
## User env support
##
# Propagate the underling unwrapped bintools so that if you
# install the wrapper, you get tools like objdump, the manpages,
# etc. as well (same for any binaries of libc).
printWords ${bintools_bin} ${if libc == null then "" else libc_bin} > $out/nix-support/propagated-user-env-packages
##
## Man page and info support
##
printWords ${bintools.info or ""} \
>> $info/nix-support/propagated-build-inputs
printWords ${bintools.man or ""} \
>> $man/nix-support/propagated-build-inputs
''
+ ''
##
## Hardening support
##
# some linkers on some platforms don't support specific -z flags
export hardening_unsupported_flags=""
if [[ "$($ldPath/${targetPrefix}ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
hardening_unsupported_flags+=" bindnow"
fi
if [[ "$($ldPath/${targetPrefix}ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
hardening_unsupported_flags+=" relro"
fi
''
+ optionalString hostPlatform.isCygwin ''
hardening_unsupported_flags+=" pic"
''
+ ''
set +u
substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh
substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh
substituteAll ${../cc-wrapper/utils.sh} $out/nix-support/utils.sh
##
## Extra custom steps
##
''
+ extraBuildCommands;
inherit dynamicLinker expand-response-params;
# for substitution in utils.sh
expandResponseParams = "${expand-response-params}/bin/expand-response-params";
meta =
let bintools_ = if bintools != null then bintools else {}; in
(if bintools_ ? meta then removeAttrs bintools.meta ["priority"] else {}) //
{ description =
stdenv.lib.attrByPath ["meta" "description"] "System binary utilities" bintools_
+ " (wrapper script)";
} // optionalAttrs useMacosReexportHack {
platforms = stdenv.lib.platforms.darwin;
};
}

View File

@ -14,12 +14,12 @@ if [ -n "@coreutils_bin@" ]; then
PATH="@coreutils_bin@/bin" PATH="@coreutils_bin@/bin"
fi fi
if [ -z "${NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then source @out@/nix-support/utils.sh
if [ -z "${NIX_BINTOOLS_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then
source @out@/nix-support/add-flags.sh source @out@/nix-support/add-flags.sh
fi fi
source @out@/nix-support/utils.sh
# Optionally filter out paths not refering to the store. # Optionally filter out paths not refering to the store.
expandResponseParams "$@" expandResponseParams "$@"

View File

@ -81,8 +81,10 @@ else
symbolBloatObject=$outputNameLibless-symbol-hack.o symbolBloatObject=$outputNameLibless-symbol-hack.o
if [[ ! -e $symbolBloatObject ]]; then if [[ ! -e $symbolBloatObject ]]; then
# `-Q` means use GNU Assembler rather than Clang, avoiding an awkward
# dependency cycle.
printf '.private_extern _______child_hack_foo\nchild_hack_foo:\n' \ printf '.private_extern _______child_hack_foo\nchild_hack_foo:\n' \
| @targetPrefix@as -- -o $symbolBloatObject | @targetPrefix@as -Q -- -o $symbolBloatObject
fi fi
# first half of libs # first half of libs

View File

@ -0,0 +1,67 @@
# Binutils Wrapper hygiene
#
# See comments in cc-wrapper's setup hook. This works exactly the same way.
bintoolsWrapper_addLDVars () {
case $depOffset in
-1) local role='BUILD_' ;;
0) local role='' ;;
1) local role='TARGET_' ;;
*) echo "bintools-wrapper: Error: Cannot be used with $depOffset-offset deps, " >2;
return 1 ;;
esac
if [[ -d "$1/lib64" && ! -L "$1/lib64" ]]; then
export NIX_${role}LDFLAGS+=" -L$1/lib64"
fi
if [[ -d "$1/lib" ]]; then
export NIX_${role}LDFLAGS+=" -L$1/lib"
fi
}
if [ -n "${crossConfig:-}" ]; then
export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_BUILD=1
role_pre='BUILD_'
role_post='_FOR_BUILD'
else
export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_HOST=1
role_pre=""
role_post=''
fi
envHooks+=(bintoolsWrapper_addLDVars)
# shellcheck disable=SC2157
if [ -n "@bintools_bin@" ]; then
addToSearchPath _PATH @bintools_bin@/bin
fi
# shellcheck disable=SC2157
if [ -n "@libc_bin@" ]; then
addToSearchPath _PATH @libc_bin@/bin
fi
# shellcheck disable=SC2157
if [ -n "@coreutils_bin@" ]; then
addToSearchPath _PATH @coreutils_bin@/bin
fi
# Export tool environment variables so various build systems use the right ones.
export NIX_${role_pre}BINTOOLS=@out@
for cmd in \
ar as ld nm objcopy objdump readelf ranlib strip strings size windres
do
if
PATH=$_PATH type -p "@targetPrefix@${cmd}" > /dev/null
then
upper_case="$(echo "$cmd" | tr "[:lower:]" "[:upper:]")"
export "${role_pre}${upper_case}=@targetPrefix@${cmd}";
export "${upper_case}${role_post}=@targetPrefix@${cmd}";
fi
done
# No local scope in sourced file
unset -v role_pre role_post cmd upper_case

View File

@ -4,19 +4,14 @@
# that case, it is cheaper/better to not repeat this step and let the forked # that case, it is cheaper/better to not repeat this step and let the forked
# wrapped binary just inherit the work of the forker's wrapper script. # wrapped binary just inherit the work of the forker's wrapper script.
var_templates=( var_templates_list=(
NIX+CFLAGS_COMPILE NIX+CFLAGS_COMPILE
NIX+CFLAGS_LINK NIX+CFLAGS_LINK
NIX+CXXSTDLIB_COMPILE NIX+CXXSTDLIB_COMPILE
NIX+CXXSTDLIB_LINK NIX+CXXSTDLIB_LINK
NIX+GNATFLAGS_COMPILE NIX+GNATFLAGS_COMPILE
NIX+IGNORE_LD_THROUGH_GCC )
NIX+LDFLAGS var_templates_bool=(
NIX+LDFLAGS_BEFORE
NIX+LDFLAGS_AFTER
NIX+SET_BUILD_ID
NIX+DONT_SET_RPATH
NIX+ENFORCE_NO_NATIVE NIX+ENFORCE_NO_NATIVE
) )
@ -35,17 +30,11 @@ fi
# We need to mangle names for hygiene, but also take parameters/overrides # We need to mangle names for hygiene, but also take parameters/overrides
# from the environment. # from the environment.
for var in "${var_templates[@]}"; do for var in "${var_templates_list[@]}"; do
outputVar="${var/+/_@infixSalt@_}" mangleVarList "$var" "${role_infixes[@]}"
export ${outputVar}+='' done
# For each role we serve, we accumulate the input parameters into our own for var in "${var_templates_bool[@]}"; do
# cc-wrapper-derivation-specific environment variables. mangleVarBool "$var" "${role_infixes[@]}"
for infix in "${role_infixes[@]}"; do
inputVar="${var/+/${infix}}"
if [ -v "$inputVar" ]; then
export ${outputVar}+="${!outputVar:+ }${!inputVar}"
fi
done
done done
# `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld. # `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld.
@ -66,17 +55,9 @@ if [ -e @out@/nix-support/gnat-cflags ]; then
NIX_@infixSalt@_GNATFLAGS_COMPILE="$(< @out@/nix-support/gnat-cflags) $NIX_@infixSalt@_GNATFLAGS_COMPILE" NIX_@infixSalt@_GNATFLAGS_COMPILE="$(< @out@/nix-support/gnat-cflags) $NIX_@infixSalt@_GNATFLAGS_COMPILE"
fi fi
if [ -e @out@/nix-support/libc-ldflags ]; then
NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/libc-ldflags)"
fi
if [ -e @out@/nix-support/cc-ldflags ]; then if [ -e @out@/nix-support/cc-ldflags ]; then
NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/cc-ldflags)" NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/cc-ldflags)"
fi fi
if [ -e @out@/nix-support/libc-ldflags-before ]; then
NIX_@infixSalt@_LDFLAGS_BEFORE="$(< @out@/nix-support/libc-ldflags-before) $NIX_@infixSalt@_LDFLAGS_BEFORE"
fi
# That way forked processes will not extend these environment variables again. # That way forked processes will not extend these environment variables again.
export NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET=1 export NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET=1

View File

@ -6,7 +6,6 @@ if [[ -v hardeningEnable[@] ]]; then
hardeningFlags+=(${hardeningEnable[@]}) hardeningFlags+=(${hardeningEnable[@]})
fi fi
hardeningCFlags=() hardeningCFlags=()
hardeningLDFlags=()
declare -A hardeningDisableMap declare -A hardeningDisableMap
@ -44,7 +43,6 @@ if [[ -z "${hardeningDisableMap[all]:-}" ]]; then
if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then
if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi
hardeningCFlags+=('-pie') hardeningCFlags+=('-pie')
hardeningLDFlags+=('-pie')
fi fi
;; ;;
pic) pic)
@ -59,14 +57,6 @@ if [[ -z "${hardeningDisableMap[all]:-}" ]]; then
if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling format >&2; fi if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling format >&2; fi
hardeningCFlags+=('-Wformat' '-Wformat-security' '-Werror=format-security') hardeningCFlags+=('-Wformat' '-Wformat-security' '-Werror=format-security')
;; ;;
relro)
if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi
hardeningLDFlags+=('-z' 'relro')
;;
bindnow)
if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi
hardeningLDFlags+=('-z' 'now')
;;
*) *)
# Ignore unsupported. Checked in Nix that at least *some* # Ignore unsupported. Checked in Nix that at least *some*
# tool supports each flag. # tool supports each flag.

View File

@ -15,12 +15,18 @@ if [[ -n "@coreutils_bin@" && -n "@gnugrep_bin@" ]]; then
PATH="@coreutils_bin@/bin:@gnugrep_bin@/bin" PATH="@coreutils_bin@/bin:@gnugrep_bin@/bin"
fi fi
source @out@/nix-support/utils.sh
# Flirting with a layer violation here.
if [ -z "${NIX_BINTOOLS_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then
source @bintools@/nix-support/add-flags.sh
fi
# Put this one second so libc ldflags take priority.
if [ -z "${NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then if [ -z "${NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then
source @out@/nix-support/add-flags.sh source @out@/nix-support/add-flags.sh
fi fi
source @out@/nix-support/utils.sh
# Parse command line options and set several variables. # Parse command line options and set several variables.
# For instance, figure out if linker flags should be passed. # For instance, figure out if linker flags should be passed.
@ -59,7 +65,8 @@ while (( "$n" < "$nParams" )); do
cppInclude=0 cppInclude=0
elif [ "$p" = -nostdinc++ ]; then elif [ "$p" = -nostdinc++ ]; then
cppInclude=0 cppInclude=0
elif [ "${p:0:1}" != - ]; then elif [[ "$p" != -?* ]]; then
# A dash alone signifies standard input; it is not a flag
nonFlagArgs=1 nonFlagArgs=1
fi fi
n+=1 n+=1

View File

@ -6,18 +6,17 @@
# compiler and the linker just "work". # compiler and the linker just "work".
{ name ? "", stdenvNoCC, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? "" { name ? "", stdenvNoCC, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? ""
, cc ? null, libc ? null, binutils ? null, coreutils ? null, shell ? stdenvNoCC.shell , cc ? null, libc ? null, bintools, coreutils ? null, shell ? stdenvNoCC.shell
, zlib ? null, extraPackages ? [], extraBuildCommands ? "" , zlib ? null, extraPackages ? [], extraBuildCommands ? ""
, isGNU ? false, isClang ? cc.isClang or false, gnugrep ? null , isGNU ? false, isClang ? cc.isClang or false, gnugrep ? null
, buildPackages ? {} , buildPackages ? {}
, useMacosReexportHack ? false
}: }:
with stdenvNoCC.lib; with stdenvNoCC.lib;
assert nativeTools -> nativePrefix != ""; assert nativeTools -> nativePrefix != "";
assert !nativeTools -> assert !nativeTools ->
cc != null && binutils != null && coreutils != null && gnugrep != null; cc != null && coreutils != null && gnugrep != null;
assert !(nativeLibc && noLibc); assert !(nativeLibc && noLibc);
assert (noLibc || nativeLibc) == (libc == null); assert (noLibc || nativeLibc) == (libc == null);
@ -42,7 +41,6 @@ let
libc_dev = if libc == null then null else getDev libc; libc_dev = if libc == null then null else getDev libc;
libc_lib = if libc == null then null else getLib libc; libc_lib = if libc == null then null else getLib libc;
cc_solib = getLib cc; cc_solib = getLib cc;
binutils_bin = if nativeTools then "" else getBin binutils;
# The wrapper scripts use 'cat' and 'grep', so we may need coreutils. # The wrapper scripts use 'cat' and 'grep', so we may need coreutils.
coreutils_bin = if nativeTools then "" else getBin coreutils; coreutils_bin = if nativeTools then "" else getBin coreutils;
@ -58,21 +56,6 @@ let
# unstable implementation detail, however. # unstable implementation detail, however.
infixSalt = dashlessTarget; infixSalt = dashlessTarget;
# The dynamic linker has different names on different platforms. This is a
# shell glob that ought to match it.
dynamicLinker =
/**/ if libc == null then null
else if targetPlatform.system == "i686-linux" then "${libc_lib}/lib/ld-linux.so.2"
else if targetPlatform.system == "x86_64-linux" then "${libc_lib}/lib/ld-linux-x86-64.so.2"
# ARM with a wildcard, which can be "" or "-armhf".
else if (with targetPlatform; isArm && isLinux) then "${libc_lib}/lib/ld-linux*.so.3"
else if targetPlatform.system == "aarch64-linux" then "${libc_lib}/lib/ld-linux-aarch64.so.1"
else if targetPlatform.system == "powerpc-linux" then "${libc_lib}/lib/ld.so.1"
else if targetPlatform.system == "mips64el-linux" then "${libc_lib}/lib/ld.so.1"
else if targetPlatform.isDarwin then "/usr/lib/dyld"
else if stdenv.lib.hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1"
else null;
expand-response-params = expand-response-params =
if buildPackages.stdenv.cc or null != null && buildPackages.stdenv.cc != "/dev/null" if buildPackages.stdenv.cc or null != null && buildPackages.stdenv.cc != "/dev/null"
then import ../expand-response-params { inherit (buildPackages) stdenv; } then import ../expand-response-params { inherit (buildPackages) stdenv; }
@ -80,6 +63,14 @@ let
in in
# Ensure bintools matches
assert libc_bin == bintools.libc_bin;
assert libc_dev == bintools.libc_dev;
assert libc_lib == bintools.libc_lib;
assert nativeTools == bintools.nativeTools;
assert nativeLibc == bintools.nativeLibc;
assert nativePrefix == bintools.nativePrefix;
stdenv.mkDerivation { stdenv.mkDerivation {
name = targetPrefix name = targetPrefix
+ (if name != "" then name else "${ccName}-wrapper") + (if name != "" then name else "${ccName}-wrapper")
@ -87,8 +78,8 @@ stdenv.mkDerivation {
preferLocalBuild = true; preferLocalBuild = true;
inherit cc libc_bin libc_dev libc_lib binutils_bin coreutils_bin; inherit cc libc_bin libc_dev libc_lib bintools coreutils_bin;
shell = getBin shell + shell.shellPath or ""; shell = getBin shell + stdenv.lib.optionalString (stdenv ? shellPath) stdenv.shellPath;
gnugrep_bin = if nativeTools then "" else gnugrep; gnugrep_bin = if nativeTools then "" else gnugrep;
inherit targetPrefix infixSalt; inherit targetPrefix infixSalt;
@ -98,20 +89,18 @@ stdenv.mkDerivation {
passthru = { passthru = {
# "cc" is the generic name for a C compiler, but there is no one for package # "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 # providing the linker and related tools. The two we use now are GNU
# Binutils, and Apple's "cctools"; "binutils" as an attempt to find an # Binutils, and Apple's "cctools"; "bintools" as an attempt to find an
# unused middle-ground name that evokes both. # unused middle-ground name that evokes both.
bintools = binutils_bin; inherit bintools;
inherit libc nativeTools nativeLibc nativePrefix isGNU isClang default_cxx_stdlib_compile; inherit libc nativeTools nativeLibc nativePrefix isGNU isClang default_cxx_stdlib_compile;
emacsBufferSetup = pkgs: '' emacsBufferSetup = pkgs: ''
; We should handle propagation here too ; We should handle propagation here too
(mapc (lambda (arg) (mapc
(lambda (arg)
(when (file-directory-p (concat arg "/include")) (when (file-directory-p (concat arg "/include"))
(setenv "NIX_${infixSalt}_CFLAGS_COMPILE" (concat (getenv "NIX_${infixSalt}_CFLAGS_COMPILE") " -isystem " arg "/include"))) (setenv "NIX_${infixSalt}_CFLAGS_COMPILE" (concat (getenv "NIX_${infixSalt}_CFLAGS_COMPILE") " -isystem " arg "/include"))))
(when (file-directory-p (concat arg "/lib")) '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)}))
(setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib")))
(when (file-directory-p (concat arg "/lib64"))
(setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib64")))) '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)}))
''; '';
}; };
@ -141,45 +130,18 @@ stdenv.mkDerivation {
echo ${if targetPlatform.isDarwin then cc else nativePrefix} > $out/nix-support/orig-cc echo ${if targetPlatform.isDarwin then cc else nativePrefix} > $out/nix-support/orig-cc
ccPath="${if targetPlatform.isDarwin then cc else nativePrefix}/bin" ccPath="${if targetPlatform.isDarwin then cc else nativePrefix}/bin"
ldPath="${nativePrefix}/bin"
'' else '' '' else ''
echo $cc > $out/nix-support/orig-cc echo $cc > $out/nix-support/orig-cc
ccPath="${cc}/bin" ccPath="${cc}/bin"
ldPath="${binutils_bin}/bin"
''
+ optionalString (targetPlatform.isSunOS && nativePrefix != "") ''
# Solaris needs an additional ld wrapper.
ldPath="${nativePrefix}/bin"
exec="$ldPath/${targetPrefix}ld"
wrap ld-solaris ${./ld-solaris-wrapper.sh}
'') '')
+ '' + ''
# Create a symlink to as (the assembler). This is useful when a # Create symlinks to everything in the bintools wrapper.
# cc-wrapper is installed in a user environment, as it ensures that for bbin in $bintools/bin/*; do
# the right assembler is called. mkdir -p "$out/bin"
if [ -e $ldPath/${targetPrefix}as ]; then ln -s "$bbin" "$out/bin/$(basename $bbin)"
ln -s $ldPath/${targetPrefix}as $out/bin/${targetPrefix}as done
fi
'' + (if !useMacosReexportHack then ''
wrap ${targetPrefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${targetPrefix}ld}
'' else ''
ldInner="${targetPrefix}ld-reexport-delegate"
wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${targetPrefix}ld}
wrap "${targetPrefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner"
unset ldInner
'') + ''
if [ -e ${binutils_bin}/bin/${targetPrefix}ld.gold ]; then
wrap ${targetPrefix}ld.gold ${./ld-wrapper.sh} ${binutils_bin}/bin/${targetPrefix}ld.gold
fi
if [ -e ${binutils_bin}/bin/ld.bfd ]; then
wrap ${targetPrefix}ld.bfd ${./ld-wrapper.sh} ${binutils_bin}/bin/${targetPrefix}ld.bfd
fi
# We export environment variables pointing to the wrapped nonstandard # We export environment variables pointing to the wrapped nonstandard
# cmds, lest some lousy configure script use those to guess compiler # cmds, lest some lousy configure script use those to guess compiler
@ -239,16 +201,28 @@ stdenv.mkDerivation {
ln -s $ccPath/${targetPrefix}ghdl $out/bin/${targetPrefix}ghdl ln -s $ccPath/${targetPrefix}ghdl $out/bin/${targetPrefix}ghdl
''; '';
propagatedBuildInputs = extraPackages; propagatedBuildInputs = [ bintools ] ++ extraPackages;
setupHook = ./setup-hook.sh; setupHook = ./setup-hook.sh;
postFixup = postFixup =
'' ''
set -u set -u
# Backwards compatability for packages expecting this file, e.g. with
# `$NIX_CC/nix-support/dynamic-linker`.
#
# TODO(@Ericson2314): Remove this after stable release and force
# everyone to refer to bintools-wrapper directly.
if [[ -f "$bintools/nix-support/dynamic-linker" ]]; then
ln -s "$bintools/nix-support/dynamic-linker" "$out/nix-support"
fi
if [[ -f "$bintools/nix-support/dynamic-linker-m32" ]]; then
ln -s "$bintools/nix-support/dynamic-linker-m32" "$out/nix-support"
fi
'' ''
+ optionalString (libc != null) ('' + optionalString (libc != null) ''
## ##
## General libc support ## General libc support
## ##
@ -264,50 +238,11 @@ stdenv.mkDerivation {
# compile, because it uses "#include_next <limits.h>" to find the # compile, because it uses "#include_next <limits.h>" to find the
# limits.h file in ../includes-fixed. To remedy the problem, # limits.h file in ../includes-fixed. To remedy the problem,
# another -idirafter is necessary to add that directory again. # another -idirafter is necessary to add that directory again.
echo "-B${libc_lib}/lib/ -idirafter ${libc_dev}/include -idirafter ${cc}/lib/gcc/*/*/include-fixed" > $out/nix-support/libc-cflags echo "-B${libc_lib}/lib/ -idirafter ${libc_dev}/include ${optionalString isGNU "-idirafter ${cc}/lib/gcc/*/*/include-fixed"}" > $out/nix-support/libc-cflags
echo "-L${libc_lib}/lib" > $out/nix-support/libc-ldflags
echo "${libc_lib}" > $out/nix-support/orig-libc echo "${libc_lib}" > $out/nix-support/orig-libc
echo "${libc_dev}" > $out/nix-support/orig-libc-dev echo "${libc_dev}" > $out/nix-support/orig-libc-dev
''
##
## Dynamic linker support
##
if [[ -z ''${dynamicLinker+x} ]]; then
echo "Don't know the name of the dynamic linker for platform '${targetPlatform.config}', so guessing instead." >&2
local dynamicLinker="${libc_lib}/lib/ld*.so.?"
fi
# Expand globs to fill array of options
dynamicLinker=($dynamicLinker)
case ''${#dynamicLinker[@]} in
0) echo "No dynamic linker found for platform '${targetPlatform.config}'." >&2;;
1) echo "Using dynamic linker: '$dynamicLinker'" >&2;;
*) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'." >&2;;
esac
if [ -n "''${dynamicLinker:-}" ]; then
echo $dynamicLinker > $out/nix-support/dynamic-linker
'' + (if targetPlatform.isDarwin then ''
printf "export LD_DYLD_PATH=%q\n" "$dynamicLinker" >> $out/nix-support/setup-hook
'' else ''
if [ -e ${libc_lib}/lib/32/ld-linux.so.2 ]; then
echo ${libc_lib}/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32
fi
local ldflagsBefore=(-dynamic-linker "$dynamicLinker")
'') + ''
fi
# The dynamic linker is passed in `ldflagsBefore' to allow
# explicit overrides of the dynamic linker by callers to gcc/ld
# (the *last* value counts, so ours should come first).
printWords "''${ldflagsBefore[@]}" > $out/nix-support/libc-ldflags-before
'')
+ optionalString (!nativeTools) '' + optionalString (!nativeTools) ''
@ -348,7 +283,6 @@ stdenv.mkDerivation {
# Propagate the wrapped cc so that if you install the wrapper, # Propagate the wrapped cc so that if you install the wrapper,
# you get tools like gcov, the manpages, etc. as well (including # you get tools like gcov, the manpages, etc. as well (including
# for binutils and Glibc). # for binutils and Glibc).
printWords ${cc} ${binutils_bin} ${if libc == null then "" else libc_bin} > $out/nix-support/propagated-user-env-packages
printWords ${cc.man or ""} > $man/nix-support/propagated-user-env-packages printWords ${cc.man or ""} > $man/nix-support/propagated-user-env-packages
'' ''
@ -358,14 +292,7 @@ stdenv.mkDerivation {
## Hardening support ## Hardening support
## ##
# some linkers on some platforms don't support specific -z flags
export hardening_unsupported_flags="" export hardening_unsupported_flags=""
if [[ "$($ldPath/${targetPrefix}ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
hardening_unsupported_flags+=" bindnow"
fi
if [[ "$($ldPath/${targetPrefix}ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
hardening_unsupported_flags+=" relro"
fi
'' ''
+ optionalString hostPlatform.isCygwin '' + optionalString hostPlatform.isCygwin ''
@ -384,7 +311,7 @@ stdenv.mkDerivation {
'' ''
+ extraBuildCommands; + extraBuildCommands;
inherit dynamicLinker expand-response-params; inherit expand-response-params;
# for substitution in utils.sh # for substitution in utils.sh
expandResponseParams = "${expand-response-params}/bin/expand-response-params"; expandResponseParams = "${expand-response-params}/bin/expand-response-params";
@ -395,7 +322,5 @@ stdenv.mkDerivation {
{ description = { description =
stdenv.lib.attrByPath ["meta" "description"] "System C compiler" cc_ stdenv.lib.attrByPath ["meta" "description"] "System C compiler" cc_
+ " (wrapper script)"; + " (wrapper script)";
} // optionalAttrs useMacosReexportHack {
platforms = stdenv.lib.platforms.darwin;
}; };
} }

View File

@ -17,12 +17,12 @@ if [ -n "@coreutils_bin@" ]; then
PATH="@coreutils_bin@/bin" PATH="@coreutils_bin@/bin"
fi fi
source @out@/nix-support/utils.sh
if [ -z "${NIX_@infixSalt@_GNAT_WRAPPER_FLAGS_SET:-}" ]; then if [ -z "${NIX_@infixSalt@_GNAT_WRAPPER_FLAGS_SET:-}" ]; then
source @out@/nix-support/add-flags.sh source @out@/nix-support/add-flags.sh
fi fi
source @out@/nix-support/utils.sh
# Figure out if linker flags should be passed. GCC prints annoying # Figure out if linker flags should be passed. GCC prints annoying
# warnings when they are not needed. # warnings when they are not needed.
@ -36,10 +36,6 @@ for i in "$@"; do
dontLink=1 dontLink=1
elif [ "${i:0:1}" != - ]; then elif [ "${i:0:1}" != - ]; then
nonFlagArgs=1 nonFlagArgs=1
elif [ "$i" = -m32 ]; then
if [ -e @out@/nix-support/dynamic-linker-m32 ]; then
NIX_@infixSalt@_LDFLAGS+=" -dynamic-linker $(< @out@/nix-support/dynamic-linker-m32)"
fi
fi fi
done done

View File

@ -74,14 +74,6 @@ ccWrapper_addCVars () {
export NIX_${role}CFLAGS_COMPILE+=" ${ccIncludeFlag:--isystem} $1/include" export NIX_${role}CFLAGS_COMPILE+=" ${ccIncludeFlag:--isystem} $1/include"
fi fi
if [[ -d "$1/lib64" && ! -L "$1/lib64" ]]; then
export NIX_${role}LDFLAGS+=" -L$1/lib64"
fi
if [[ -d "$1/lib" ]]; then
export NIX_${role}LDFLAGS+=" -L$1/lib"
fi
if [[ -d "$1/Library/Frameworks" ]]; then if [[ -d "$1/Library/Frameworks" ]]; then
export NIX_${role}CFLAGS_COMPILE+=" -F$1/Library/Frameworks" export NIX_${role}CFLAGS_COMPILE+=" -F$1/Library/Frameworks"
fi fi
@ -118,11 +110,6 @@ if [ -n "@cc@" ]; then
addToSearchPath _PATH @cc@/bin addToSearchPath _PATH @cc@/bin
fi fi
# shellcheck disable=SC2157
if [ -n "@binutils_bin@" ]; then
addToSearchPath _PATH @binutils_bin@/bin
fi
# shellcheck disable=SC2157 # shellcheck disable=SC2157
if [ -n "@libc_bin@" ]; then if [ -n "@libc_bin@" ]; then
addToSearchPath _PATH @libc_bin@/bin addToSearchPath _PATH @libc_bin@/bin
@ -142,17 +129,5 @@ export ${role_pre}CXX=@named_cxx@
export CC${role_post}=@named_cc@ export CC${role_post}=@named_cc@
export CXX${role_post}=@named_cxx@ export CXX${role_post}=@named_cxx@
for cmd in \
ar as ld nm objcopy objdump readelf ranlib strip strings size windres
do
if
PATH=$_PATH type -p "@targetPrefix@${cmd}" > /dev/null
then
upper_case="$(echo "$cmd" | tr "[:lower:]" "[:upper:]")"
export "${role_pre}${upper_case}=@targetPrefix@${cmd}";
export "${upper_case}${role_post}=@targetPrefix@${cmd}";
fi
done
# No local scope in sourced file # No local scope in sourced file
unset -v role_pre role_post cmd upper_case unset -v role_pre role_post

View File

@ -1,3 +1,35 @@
mangleVarList() {
local var="$1"
shift
local -a role_infixes=("$@")
local outputVar="${var/+/_@infixSalt@_}"
declare -gx ${outputVar}+=''
# For each role we serve, we accumulate the input parameters into our own
# cc-wrapper-derivation-specific environment variables.
for infix in "${role_infixes[@]}"; do
local inputVar="${var/+/${infix}}"
if [ -v "$inputVar" ]; then
export ${outputVar}+="${!outputVar:+ }${!inputVar}"
fi
done
}
mangleVarBool() {
local var="$1"
shift
local -a role_infixes=("$@")
local outputVar="${var/+/_@infixSalt@_}"
declare -gxi ${outputVar}+=0
for infix in "${role_infixes[@]}"; do
local inputVar="${var/+/${infix}}"
if [ -v "$inputVar" ]; then
let "${outputVar} |= ${!inputVar}"
fi
done
}
skip () { skip () {
if (( "${NIX_DEBUG:-0}" >= 1 )); then if (( "${NIX_DEBUG:-0}" >= 1 )); then
echo "skipping impure path $1" >&2 echo "skipping impure path $1" >&2

View File

@ -0,0 +1,5 @@
ld-is-cc-hook() {
LD=$CC
}
preConfigureHooks+=(ld-is-cc-hook)

View File

@ -19,7 +19,7 @@ _separateDebugInfo() {
if ! isELF "$i"; then continue; fi if ! isELF "$i"; then continue; fi
# Extract the Build ID. FIXME: there's probably a cleaner way. # Extract the Build ID. FIXME: there's probably a cleaner way.
local id="$(readelf -n "$i" | sed 's/.*Build ID: \([0-9a-f]*\).*/\1/; t; d')" local id="$($READELF -n "$i" | sed 's/.*Build ID: \([0-9a-f]*\).*/\1/; t; d')"
if [ "${#id}" != 40 ]; then if [ "${#id}" != 40 ]; then
echo "could not find build ID of $i, skipping" >&2 echo "could not find build ID of $i, skipping" >&2
continue continue
@ -28,8 +28,8 @@ _separateDebugInfo() {
# Extract the debug info. # Extract the debug info.
header "separating debug info from $i (build ID $id)" header "separating debug info from $i (build ID $id)"
mkdir -p "$dst/${id:0:2}" mkdir -p "$dst/${id:0:2}"
objcopy --only-keep-debug "$i" "$dst/${id:0:2}/${id:2}.debug" $OBJCOPY --only-keep-debug "$i" "$dst/${id:0:2}/${id:2}.debug"
strip --strip-debug "$i" $STRIP --strip-debug "$i"
# Also a create a symlink <original-name>.debug. # Also a create a symlink <original-name>.debug.
ln -sfn ".build-id/${id:0:2}/${id:2}.debug" "$dst/../$(basename "$i")" ln -sfn ".build-id/${id:0:2}/${id:2}.debug" "$dst/../$(basename "$i")"

View File

@ -30,7 +30,7 @@ stripDirs() {
if [ -n "${dirs}" ]; then if [ -n "${dirs}" ]; then
header "stripping (with flags $stripFlags) in$dirs" header "stripping (with flags $stripFlags) in$dirs"
find $dirs -type f -print0 | xargs -0 ${xargsFlags:--r} strip $commonStripFlags $stripFlags 2>/dev/null || true find $dirs -type f -print0 | xargs -0 ${xargsFlags:--r} $STRIP $commonStripFlags $stripFlags 2>/dev/null || true
stopNest stopNest
fi fi
} }

View File

@ -25,7 +25,7 @@ _linkDLLs() {
linkCount=0 linkCount=0
# Iterate over any DLL that we depend on. # Iterate over any DLL that we depend on.
local dll local dll
for dll in $(objdump -p *.{exe,dll} | sed -n 's/.*DLL Name: \(.*\)/\1/p' | sort -u); do for dll in $($OBJDUMP -p *.{exe,dll} | sed -n 's/.*DLL Name: \(.*\)/\1/p' | sort -u); do
if [ -e "./$dll" ]; then continue; fi if [ -e "./$dll" ]; then continue; fi
# Locate the DLL - it should be an *executable* file on $DLLPATH. # Locate the DLL - it should be an *executable* file on $DLLPATH.
local dllPath="$(PATH="$DLLPATH" type -P "$dll")" local dllPath="$(PATH="$DLLPATH" type -P "$dll")"

View File

@ -95,8 +95,8 @@ rec {
# Make a package that just contains a setup hook with the given contents. # Make a package that just contains a setup hook with the given contents.
makeSetupHook = { deps ? [], substitutions ? {} }: script: makeSetupHook = { name ? "hook", deps ? [], substitutions ? {} }: script:
runCommand "hook" substitutions runCommand name substitutions
('' (''
mkdir -p $out/nix-support mkdir -p $out/nix-support
cp ${script} $out/nix-support/setup-hook cp ${script} $out/nix-support/setup-hook

View File

@ -1,4 +1,4 @@
{ newScope, stdenv, wrapCC, wrapCCWith, symlinkJoin }: { newScope, stdenv, binutils-raw, wrapCCWith, symlinkJoin }:
let let
callPackage = newScope (self // {inherit stdenv;}); callPackage = newScope (self // {inherit stdenv;});
@ -6,6 +6,8 @@ let
emscriptenfastcomp-unwrapped = callPackage ./emscripten-fastcomp.nix {}; emscriptenfastcomp-unwrapped = callPackage ./emscripten-fastcomp.nix {};
emscriptenfastcomp-wrapped = wrapCCWith { emscriptenfastcomp-wrapped = wrapCCWith {
cc = self.emscriptenfastcomp-unwrapped; cc = self.emscriptenfastcomp-unwrapped;
# Never want Apple's cctools for WASM target
bintools = binutils-raw;
libc = stdenv.cc.libc; libc = stdenv.cc.libc;
extraBuildCommands = '' extraBuildCommands = ''
# hardening flags break WASM support # hardening flags break WASM support

View File

@ -356,6 +356,7 @@ stdenv.mkDerivation ({
dontStrip = true; dontStrip = true;
}; };
NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools;
NIX_BUILD_CC = buildPackages.stdenv.cc; NIX_BUILD_CC = buildPackages.stdenv.cc;
# Needed for the cross compilation to work # Needed for the cross compilation to work

View File

@ -444,6 +444,7 @@ stdenv.mkDerivation ({
buildFlags = ""; buildFlags = "";
}; };
NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools;
NIX_BUILD_CC = buildPackages.stdenv.cc; NIX_BUILD_CC = buildPackages.stdenv.cc;
# Needed for the cross compilation to work # Needed for the cross compilation to work

View File

@ -442,6 +442,7 @@ stdenv.mkDerivation ({
buildFlags = ""; buildFlags = "";
}; };
NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools;
NIX_BUILD_CC = buildPackages.stdenv.cc; NIX_BUILD_CC = buildPackages.stdenv.cc;
# Needed for the cross compilation to work # Needed for the cross compilation to work

View File

@ -451,6 +451,7 @@ stdenv.mkDerivation ({
buildFlags = ""; buildFlags = "";
}; };
NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools;
NIX_BUILD_CC = buildPackages.stdenv.cc; NIX_BUILD_CC = buildPackages.stdenv.cc;
# Needed for the cross compilation to work # Needed for the cross compilation to work

View File

@ -452,6 +452,7 @@ stdenv.mkDerivation ({
buildFlags = ""; buildFlags = "";
}; };
NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools;
NIX_BUILD_CC = buildPackages.stdenv.cc; NIX_BUILD_CC = buildPackages.stdenv.cc;
# Needed for the cross compilation to work # Needed for the cross compilation to work

View File

@ -446,6 +446,7 @@ stdenv.mkDerivation ({
buildFlags = ""; buildFlags = "";
}; };
NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools;
NIX_BUILD_CC = buildPackages.stdenv.cc; NIX_BUILD_CC = buildPackages.stdenv.cc;
# Needed for the cross compilation to work # Needed for the cross compilation to work

View File

@ -12,7 +12,7 @@ mkdir "$NIX_FIXINC_DUMMY"
if test "$staticCompiler" = "1"; then if test "$staticCompiler" = "1"; then
EXTRA_LDFLAGS="-static" EXTRA_LDFLAGS="-static"
else else
EXTRA_LDFLAGS="-Wl,-rpath,$lib/lib" EXTRA_LDFLAGS="-Wl,-rpath,${!outputLib}/lib"
fi fi
@ -28,37 +28,55 @@ if test "$noSysDirs" = "1"; then
EXTRA_BUILD_FLAGS EXTRA_FLAGS EXTRA_TARGET_FLAGS \ EXTRA_BUILD_FLAGS EXTRA_FLAGS EXTRA_TARGET_FLAGS \
EXTRA_BUILD_LDFLAGS EXTRA_TARGET_LDFLAGS EXTRA_BUILD_LDFLAGS EXTRA_TARGET_LDFLAGS
# Extract flags from Bintools Wrappers
for pre in 'BUILD_' ''; do
curBintools="NIX_${pre}BINTOOLS"
declare -a extraLDFlags=()
if [[ -e "${!curBintools}/nix-support/orig-libc" ]]; then
# Figure out what extra flags when linking to pass to the gcc
# compilers being generated to make sure that they use our libc.
extraLDFlags=($(< "${!curBintools}/nix-support/libc-ldflags") $(< "${!curBintools}/nix-support/libc-ldflags-before" || true))
# The path to the Libc binaries such as `crti.o'.
libc_libdir="$(< "${!curBintools}/nix-support/orig-libc")/lib"
else
# Hack: support impure environments.
extraLDFlags=("-L/usr/lib64" "-L/usr/lib")
libc_libdir="/usr/lib"
fi
extraLDFlags=("-L$libc_libdir" "-rpath" "$libc_libdir"
"${extraLDFlags[@]}")
for i in "${extraLDFlags[@]}"; do
declare EXTRA_${pre}LDFLAGS+=" -Wl,$i"
done
done
# Extract flags from CC Wrappers
for pre in 'BUILD_' ''; do for pre in 'BUILD_' ''; do
curCC="NIX_${pre}CC" curCC="NIX_${pre}CC"
curFIXINC="NIX_${pre}FIXINC_DUMMY" curFIXINC="NIX_${pre}FIXINC_DUMMY"
declare -a extraFlags=() extraLDFlags=() declare -a extraFlags=()
if [[ -e "${!curCC}/nix-support/orig-libc" ]]; then if [[ -e "${!curCC}/nix-support/orig-libc" ]]; then
# Figure out what extra flags to pass to the gcc compilers being # Figure out what extra compiling flags to pass to the gcc compilers
# generated to make sure that they use our glibc. # being generated to make sure that they use our libc.
extraFlags=($(cat "${!curCC}/nix-support/libc-cflags")) extraFlags=($(< "${!curCC}/nix-support/libc-cflags"))
extraLDFlags=($(cat "${!curCC}/nix-support/libc-ldflags") $(cat "${!curCC}/nix-support/libc-ldflags-before" || true))
# The path to the Glibc binaries such as `crti.o'. # The path to the Libc headers
glibc_libdir="$(cat "${!curCC}/nix-support/orig-libc")/lib" libc_devdir="$(< "${!curCC}/nix-support/orig-libc-dev")"
glibc_devdir="$(cat "${!curCC}/nix-support/orig-libc-dev")"
# Use *real* header files, otherwise a limits.h is generated that # Use *real* header files, otherwise a limits.h is generated that
# does not include Glibc's limits.h (notably missing SSIZE_MAX, # does not include Libc's limits.h (notably missing SSIZE_MAX,
# which breaks the build). # which breaks the build).
declare NIX_${pre}FIXINC_DUMMY="$glibc_devdir/include" declare NIX_${pre}FIXINC_DUMMY="$libc_devdir/include"
else else
# Hack: support impure environments. # Hack: support impure environments.
extraFlags=("-isystem" "/usr/include") extraFlags=("-isystem" "/usr/include")
extraLDFlags=("-L/usr/lib64" "-L/usr/lib")
glibc_libdir="/usr/lib"
declare NIX_${pre}FIXINC_DUMMY=/usr/include declare NIX_${pre}FIXINC_DUMMY=/usr/include
fi fi
extraFlags=("-I${!curFIXINC}" extraFlags=("-I${!curFIXINC}" "${extraFlags[@]}")
"${extraFlags[@]}")
extraLDFlags=("-L$glibc_libdir" "-rpath" "$glibc_libdir"
"${extraLDFlags[@]}")
# BOOT_CFLAGS defaults to `-g -O2'; since we override it below, make # BOOT_CFLAGS defaults to `-g -O2'; since we override it below, make
# sure to explictly add them so that files compiled with the bootstrap # sure to explictly add them so that files compiled with the bootstrap
@ -72,9 +90,6 @@ if test "$noSysDirs" = "1"; then
fi fi
declare EXTRA_${pre}FLAGS="${extraFlags[*]}" declare EXTRA_${pre}FLAGS="${extraFlags[*]}"
for i in "${extraLDFlags[@]}"; do
declare EXTRA_${pre}LDFLAGS+=" -Wl,$i"
done
done done
if test -z "${targetConfig-}"; then if test -z "${targetConfig-}"; then

View File

@ -433,6 +433,7 @@ stdenv.mkDerivation ({
buildFlags = ""; buildFlags = "";
}; };
NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools;
NIX_BUILD_CC = buildPackages.stdenv.cc; NIX_BUILD_CC = buildPackages.stdenv.cc;
# Needed for the cross compilation to work # Needed for the cross compilation to work

View File

@ -30,14 +30,14 @@ let
libstdcxxClang = ccWrapperFun { libstdcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ libstdcxxHook ]; extraPackages = [ libstdcxxHook ];
}; };
libcxxClang = ccWrapperFun { libcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ self.libcxx self.libcxxabi ]; extraPackages = [ self.libcxx self.libcxxabi ];
}; };

View File

@ -27,14 +27,14 @@ let
libstdcxxClang = ccWrapperFun { libstdcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ libstdcxxHook ]; extraPackages = [ libstdcxxHook ];
}; };
libcxxClang = ccWrapperFun { libcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ self.libcxx self.libcxxabi ]; extraPackages = [ self.libcxx self.libcxxabi ];
}; };

View File

@ -27,14 +27,14 @@ let
libstdcxxClang = ccWrapperFun { libstdcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ libstdcxxHook ]; extraPackages = [ libstdcxxHook ];
}; };
libcxxClang = ccWrapperFun { libcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ self.libcxx self.libcxxabi ]; extraPackages = [ self.libcxx self.libcxxabi ];
}; };

View File

@ -42,14 +42,14 @@ let
libstdcxxClang = ccWrapperFun { libstdcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ libstdcxxHook ]; extraPackages = [ libstdcxxHook ];
}; };
libcxxClang = ccWrapperFun { libcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ self.libcxx self.libcxxabi ]; extraPackages = [ self.libcxx self.libcxxabi ];
}; };

View File

@ -42,14 +42,14 @@ let
libstdcxxClang = ccWrapperFun { libstdcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ libstdcxxHook ]; extraPackages = [ libstdcxxHook ];
}; };
libcxxClang = ccWrapperFun { libcxxClang = ccWrapperFun {
cc = self.clang-unwrapped; cc = self.clang-unwrapped;
/* FIXME is this right? */ /* FIXME is this right? */
inherit (stdenv.cc) libc nativeTools nativeLibc; inherit (stdenv.cc) bintools libc nativeTools nativeLibc;
extraPackages = [ self.libcxx self.libcxxabi ]; extraPackages = [ self.libcxx self.libcxxabi ];
}; };

View File

@ -0,0 +1,48 @@
{ runCommand,
clang,
gcc64,
gcc32,
glibc_multi
}:
let
combine = basegcc: runCommand "combine-gcc-libc" {} ''
mkdir -p $out
cp -r ${basegcc.cc}/lib $out/lib
chmod u+rw -R $out/lib
cp -r ${basegcc.libc}/lib/* $(ls -d $out/lib/gcc/*/*)
'';
gcc_multi_sysroot = runCommand "gcc-multi-sysroot" {} ''
mkdir -p $out/lib/gcc
ln -s ${combine gcc64}/lib/gcc/* $out/lib/gcc/
ln -s ${combine gcc32}/lib/gcc/* $out/lib/gcc/
# XXX: This shouldn't be needed, clang just doesn't look for "i686-unknown"
ln -s $out/lib/gcc/i686-unknown-linux-gnu $out/lib/gcc/i686-pc-linux-gnu
# includes
ln -s ${glibc_multi.dev}/include $out/
# dynamic linkers
mkdir -p $out/lib/32
ln -s ${glibc_multi.out}/lib/ld-linux* $out/lib
ln -s ${glibc_multi.out}/lib/32/ld-linux* $out/lib/32/
'';
clangMulti = clang.override {
# Only used for providing expected structure re:dynamic linkers, AFAIK
# Most of the magic is done by setting the --gcc-toolchain option below
libc = gcc_multi_sysroot;
bintools = clang.bintools.override {
libc = gcc_multi_sysroot;
};
extraBuildCommands = ''
sed -e '$a --gcc-toolchain=${gcc_multi_sysroot}' -i $out/nix-support/libc-cflags
'';
};
in clangMulti

View File

@ -7,7 +7,7 @@
, setuptools , setuptools
, unzip , unzip
, ensureNewerSourcesHook , ensureNewerSourcesHook
, pythonModule , toPythonModule
, namePrefix , namePrefix
, bootstrapped-pip , bootstrapped-pip
, flit , flit
@ -19,7 +19,7 @@ let
wheel-specific = import ./build-python-package-wheel.nix { }; wheel-specific = import ./build-python-package-wheel.nix { };
common = import ./build-python-package-common.nix { inherit python bootstrapped-pip; }; common = import ./build-python-package-common.nix { inherit python bootstrapped-pip; };
mkPythonDerivation = import ./mk-python-derivation.nix { mkPythonDerivation = import ./mk-python-derivation.nix {
inherit lib python wrapPython setuptools unzip ensureNewerSourcesHook pythonModule namePrefix; inherit lib python wrapPython setuptools unzip ensureNewerSourcesHook toPythonModule namePrefix;
}; };
in in

View File

@ -7,7 +7,7 @@
, unzip , unzip
, ensureNewerSourcesHook , ensureNewerSourcesHook
# Whether the derivation provides a Python module or not. # Whether the derivation provides a Python module or not.
, pythonModule , toPythonModule
, namePrefix , namePrefix
}: }:
@ -40,6 +40,12 @@
# Skip wrapping of python programs altogether # Skip wrapping of python programs altogether
, dontWrapPythonPrograms ? false , dontWrapPythonPrograms ? false
# Remove bytecode from bin folder.
# When a Python script has the extension `.py`, bytecode is generated
# Typically, executables in bin have no extension, so no bytecode is generated.
# However, some packages do provide executables with extensions, and thus bytecode is generated.
, removeBinBytecode ? true
, meta ? {} , meta ? {}
, passthru ? {} , passthru ? {}
@ -54,7 +60,7 @@ if disabled
then throw "${name} not supported for interpreter ${python.executable}" then throw "${name} not supported for interpreter ${python.executable}"
else else
python.stdenv.mkDerivation (builtins.removeAttrs attrs [ toPythonModule (python.stdenv.mkDerivation (builtins.removeAttrs attrs [
"disabled" "checkInputs" "doCheck" "doInstallCheck" "dontWrapPythonPrograms" "catchConflicts" "disabled" "checkInputs" "doCheck" "doInstallCheck" "dontWrapPythonPrograms" "catchConflicts"
] // { ] // {
@ -77,6 +83,11 @@ python.stdenv.mkDerivation (builtins.removeAttrs attrs [
postFixup = lib.optionalString (!dontWrapPythonPrograms) '' postFixup = lib.optionalString (!dontWrapPythonPrograms) ''
wrapPythonPrograms wrapPythonPrograms
'' + lib.optionalString removeBinBytecode ''
if [ -d "$out/bin" ]; then
rm -rf "$out/bin/__pycache__" # Python 3
find "$out/bin" -type f -name "*.pyc" -delete # Python 2
fi
'' + lib.optionalString catchConflicts '' '' + lib.optionalString catchConflicts ''
# Check if we have two packages with the same name in the closure and fail. # Check if we have two packages with the same name in the closure and fail.
# If this happens, something went wrong with the dependencies specs. # If this happens, something went wrong with the dependencies specs.
@ -84,14 +95,9 @@ python.stdenv.mkDerivation (builtins.removeAttrs attrs [
${python.interpreter} ${./catch_conflicts}/catch_conflicts.py ${python.interpreter} ${./catch_conflicts}/catch_conflicts.py
'' + attrs.postFixup or ''''; '' + attrs.postFixup or '''';
passthru = {
inherit python; # The python interpreter
inherit pythonModule;
} // passthru;
meta = { meta = {
# default to python's platforms # default to python's platforms
platforms = python.meta.platforms; platforms = python.meta.platforms;
isBuildPythonPackage = python.meta.platforms; isBuildPythonPackage = python.meta.platforms;
} // meta; } // meta;
}) }))

View File

@ -9,4 +9,6 @@ callPackage ./generic.nix (args // rec {
sha256 = "9807a5d16566c57fd74fb522764e0b134a8bbe6b6e8967b83afefd30dcd3be81"; sha256 = "9807a5d16566c57fd74fb522764e0b134a8bbe6b6e8967b83afefd30dcd3be81";
}; };
enableNumpy = true;
}) })

View File

@ -10,7 +10,7 @@
, enablePIC ? false , enablePIC ? false
, enableExceptions ? false , enableExceptions ? false
, enablePython ? hostPlatform == buildPlatform , enablePython ? hostPlatform == buildPlatform
, enableNumpy ? false, numpy ? null , enableNumpy ? false
, taggedLayout ? ((enableRelease && enableDebug) || (enableSingleThreaded && enableMultiThreaded) || (enableShared && enableStatic)) , taggedLayout ? ((enableRelease && enableDebug) || (enableSingleThreaded && enableMultiThreaded) || (enableShared && enableStatic))
, patches ? null , patches ? null
, mpi ? null , mpi ? null
@ -156,7 +156,7 @@ stdenv.mkDerivation {
++ optional (hostPlatform == buildPlatform) icu ++ optional (hostPlatform == buildPlatform) icu
++ optional stdenv.isDarwin fixDarwinDylibNames ++ optional stdenv.isDarwin fixDarwinDylibNames
++ optional enablePython python ++ optional enablePython python
++ optional enableNumpy numpy; ++ optional enableNumpy python.pkgs.numpy;
configureScript = "./bootstrap.sh"; configureScript = "./bootstrap.sh";
configureFlags = commonConfigureFlags configureFlags = commonConfigureFlags

View File

@ -1,22 +1,26 @@
{stdenv, fetchurl}: { stdenv, fetchFromGitHub, autoreconfHook, pkgconfig }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "fribidi-${version}"; name = "fribidi-${version}";
version = "0.19.7"; version = "0.19.7";
src = fetchurl { src = fetchFromGitHub {
url = "http://fribidi.org/download/${name}.tar.bz2"; owner = "fribidi";
sha256 = "13jsb5qadlhsaxkbrb49nqslmbh904vvzhsm5mm2ghmv29i2l8h8"; repo = "fribidi";
rev = version;
sha256 = "10q5jfch5qzrj2w4fbkr086ank66plx8hp7ra9a01irj80pbk96d";
}; };
hardeningDisable = [ "format" ]; nativeBuildInputs = [ autoreconfHook pkgconfig ];
# Configure script checks for glib, but it is only used for tests.
outputs = [ "out" "devdoc" ]; outputs = [ "out" "devdoc" ];
meta = with stdenv.lib; { meta = with stdenv.lib; {
homepage = http://fribidi.org/; homepage = https://github.com/fribidi/fribidi;
description = "GNU implementation of the Unicode Bidirectional Algorithm (bidi)"; description = "GNU implementation of the Unicode Bidirectional Algorithm (bidi)";
license = licenses.gpl2; license = licenses.lgpl21;
platforms = platforms.unix; platforms = platforms.unix;
}; };
} }

View File

@ -5,11 +5,11 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "gst-vaapi-${version}"; name = "gst-vaapi-${version}";
version = "1.12.3"; version = "1.12.4";
src = fetchurl { src = fetchurl {
url = "${meta.homepage}/src/gstreamer-vaapi/gstreamer-vaapi-${version}.tar.xz"; url = "${meta.homepage}/src/gstreamer-vaapi/gstreamer-vaapi-${version}.tar.xz";
sha256 = "0kbl2c4zv004qwhm9mc0jlhz2pc3dqrng2vwj68a81lnzpcazkgl"; sha256 = "1jg9nvc8000yi2bcl3wn2yh2hwl7yvlwldj6778w8c0z5qj7fb8w";
}; };
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];

View File

@ -5,11 +5,11 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "libbfd-${version}"; name = "libbfd-${version}";
inherit (binutils-raw) version src; inherit (binutils-raw.bintools) version src;
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];
patches = binutils-raw.patches ++ [ patches = binutils-raw.bintools.patches ++ [
../../tools/misc/binutils/build-components-separately.patch ../../tools/misc/binutils/build-components-separately.patch
]; ];

View File

@ -4,11 +4,11 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "libjpeg-turbo-${version}"; name = "libjpeg-turbo-${version}";
version = "1.5.2"; version = "1.5.3";
src = fetchurl { src = fetchurl {
url = "mirror://sourceforge/libjpeg-turbo/${name}.tar.gz"; url = "mirror://sourceforge/libjpeg-turbo/${name}.tar.gz";
sha256 = "0a5m0psfp5952y5vrcs0nbdz1y9wqzg2ms0xwrx752034wxr964h"; sha256 = "08r5b5mywwrxv4axvq80dm31cklz81grczlzlxr2xqa6pgi90j5j";
}; # github releases still need autotools, surprisingly }; # github releases still need autotools, surprisingly
patches = patches =

View File

@ -5,11 +5,11 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "libopcodes-${version}"; name = "libopcodes-${version}";
inherit (binutils-raw) version src; inherit (binutils-raw.bintools) version src;
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];
patches = binutils-raw.patches ++ [ patches = binutils-raw.bintools.patches ++ [
../../tools/misc/binutils/build-components-separately.patch ../../tools/misc/binutils/build-components-separately.patch
]; ];

View File

@ -64,7 +64,7 @@ stdenv.mkDerivation rec {
# being generated to make sure that they use our glibc. # being generated to make sure that they use our glibc.
EXTRA_FLAGS="-I$NIX_FIXINC_DUMMY $(cat $NIX_CC/nix-support/libc-cflags) -O2" EXTRA_FLAGS="-I$NIX_FIXINC_DUMMY $(cat $NIX_CC/nix-support/libc-cflags) -O2"
extraLDFlags="-L$glibc_libdir -rpath $glibc_libdir $(cat $NIX_CC/nix-support/libc-ldflags) $(cat $NIX_CC/nix-support/libc-ldflags-before)" extraLDFlags="-L$glibc_libdir -rpath $glibc_libdir $(cat $NIX_BINTOOLS/nix-support/libc-ldflags) $(cat $NIX_BINTOOLS/nix-support/libc-ldflags-before)"
for i in $extraLDFlags; do for i in $extraLDFlags; do
EXTRA_FLAGS="$EXTRA_FLAGS -Wl,$i" EXTRA_FLAGS="$EXTRA_FLAGS -Wl,$i"
done done

View File

@ -2,14 +2,14 @@
, ApplicationServices, CoreServices }: , ApplicationServices, CoreServices }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "1.16.1"; version = "1.18.0";
name = "libuv-${version}"; name = "libuv-${version}";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "libuv"; owner = "libuv";
repo = "libuv"; repo = "libuv";
rev = "v${version}"; rev = "v${version}";
sha256 = "06p3xy276spqbr9xzbs7qlpdk34qsn87s2qmp6xn4j7v3bnqja7z"; sha256 = "0s71c2y4ll3vp463hsdk74q4hr7wprkxc2a4agw3za2hhzcb95pd";
}; };
postPatch = let postPatch = let

View File

@ -0,0 +1,29 @@
{ stdenv, lib, fetchFromGitHub, autoreconfHook, pkgconfig
, libdrm, libva
}:
stdenv.mkDerivation rec {
name = "libva-utils-${version}";
inherit (libva) version;
src = fetchFromGitHub {
owner = "01org";
repo = "libva-utils";
rev = version;
sha256 = "02n51cvp8bzzjk4fargwvgh7z71y8spg24hqgaawbp3p3ahh7xxi";
};
nativeBuildInputs = [ autoreconfHook pkgconfig ];
buildInputs = [ libdrm libva ];
enableParallelBuilding = true;
meta = with stdenv.lib; {
description = "VAAPI tools: Video Acceleration API";
homepage = http://www.freedesktop.org/wiki/Software/vaapi;
license = licenses.mit;
maintainers = with maintainers; [ garbas ];
platforms = platforms.unix;
};
}

View File

@ -1,36 +1,43 @@
{ stdenv, lib, fetchurl, libX11, pkgconfig, libXext, libdrm, libXfixes, wayland, libffi { stdenv, lib, fetchFromGitHub, autoreconfHook, pkgconfig
, libXext, libdrm, libXfixes, wayland, libffi, libX11
, mesa_noglu , mesa_noglu
, minimal ? true, libva , minimal ? true, libva
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "libva-${version}"; name = "libva-${lib.optionalString (!minimal) "full-"}${version}";
version = "1.7.3"; version = "2.0.0";
src = fetchurl { src = fetchFromGitHub {
url = "http://www.freedesktop.org/software/vaapi/releases/libva/${name}.tar.bz2"; owner = "01org";
sha256 = "1ndrf136rlw03xag7j1xpmf9015d1h0dpnv6v587jnh6k2a17g12"; repo = "libva";
rev = version;
sha256 = "1x8rlmv5wfqjz3j87byrxb4d9vp5b4lrrin2fx254nwl3aqy15hy";
}; };
outputs = [ "bin" "dev" "out" ]; outputs = [ "dev" "out" ];
nativeBuildInputs = [ pkgconfig ]; nativeBuildInputs = [ autoreconfHook pkgconfig ];
buildInputs = [ libdrm ] buildInputs = [ libdrm ]
++ lib.optionals (!minimal) [ libva libX11 libXext libXfixes wayland libffi mesa_noglu ]; ++ lib.optionals (!minimal) [ libva libX11 libXext libXfixes wayland libffi mesa_noglu ];
# TODO: share libs between minimal and !minimal - perhaps just symlink them # TODO: share libs between minimal and !minimal - perhaps just symlink them
configureFlags = enableParallelBuilding = true;
[ "--with-drivers-path=${mesa_noglu.driverLink}/lib/dri" ] ++
lib.optionals (!minimal) [ "--enable-glx" ];
installFlags = [ "dummy_drv_video_ladir=$(out)/lib/dri" ]; configureFlags = [
"--with-drivers-path=${mesa_noglu.driverLink}/lib/dri"
] ++ lib.optionals (!minimal) [ "--enable-glx" ];
installFlags = [
"dummy_drv_video_ladir=$(out)/lib/dri"
];
meta = with stdenv.lib; { meta = with stdenv.lib; {
description = "VAAPI library: Video Acceleration API";
homepage = http://www.freedesktop.org/wiki/Software/vaapi; homepage = http://www.freedesktop.org/wiki/Software/vaapi;
license = licenses.mit; license = licenses.mit;
description = "VAAPI library: Video Acceleration API";
platforms = platforms.unix;
maintainers = with maintainers; [ garbas ]; maintainers = with maintainers; [ garbas ];
platforms = platforms.unix;
}; };
} }

View File

@ -66,7 +66,7 @@ let
in in
let let
version = "17.2.6"; version = "17.2.7";
branch = head (splitString "." version); branch = head (splitString "." version);
driverLink = "/run/opengl-driver" + optionalString stdenv.isi686 "-32"; driverLink = "/run/opengl-driver" + optionalString stdenv.isi686 "-32";
in in
@ -81,7 +81,7 @@ stdenv.mkDerivation {
"ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz" "ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz"
"https://mesa.freedesktop.org/archive/mesa-${version}.tar.xz" "https://mesa.freedesktop.org/archive/mesa-${version}.tar.xz"
]; ];
sha256 = "1pihiymglf3bf6w2vphac65v64hv71wgrj38mckbwc03c8j55n3a"; sha256 = "0s3slgjxnx482yw0knn4a6alsy2cq28rah6hnjbmf12mvyldxksh";
}; };
prePatch = "patchShebangs ."; prePatch = "patchShebangs .";

View File

@ -1,14 +1,16 @@
{ stdenv, fetchurl, gnum4, pkgconfig, python2 { stdenv, fetchFromGitHub, autoreconfHook, gnum4, pkgconfig, python2
, intel-gpu-tools, libdrm, libva, libX11, mesa_noglu, wayland, libXext , intel-gpu-tools, libdrm, libva, libX11, mesa_noglu, wayland, libXext
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "intel-vaapi-driver-${version}"; name = "intel-vaapi-driver-${version}";
version = "1.8.2"; inherit (libva) version;
src = fetchurl { src = fetchFromGitHub {
url = "http://www.freedesktop.org/software/vaapi/releases/libva-intel-driver/${name}.tar.bz2"; owner = "01org";
sha256 = "00mpcvininwr5c4wyhp16s4bddg7vclxxjm2sfq5h7lifjcxyv46"; repo = "libva-intel-driver";
rev = version;
sha256 = "1832nnva3d33wv52bj59bv62q7a807sdxjqqq0my7l9x7a4qdkzz";
}; };
patchPhase = '' patchPhase = ''
@ -25,10 +27,12 @@ stdenv.mkDerivation rec {
"--enable-wayland" "--enable-wayland"
]; ];
nativeBuildInputs = [ gnum4 pkgconfig python2 ]; nativeBuildInputs = [ autoreconfHook gnum4 pkgconfig python2 ];
buildInputs = [ intel-gpu-tools libdrm libva libX11 libXext mesa_noglu wayland ]; buildInputs = [ intel-gpu-tools libdrm libva libX11 libXext mesa_noglu wayland ];
enableParallelBuilding = true;
meta = with stdenv.lib; { meta = with stdenv.lib; {
homepage = http://cgit.freedesktop.org/vaapi/intel-driver/; homepage = http://cgit.freedesktop.org/vaapi/intel-driver/;
license = licenses.mit; license = licenses.mit;

View File

@ -17,10 +17,7 @@ preConfigure() {
first=$(dd if="$fn" count=2 bs=1 2> /dev/null) first=$(dd if="$fn" count=2 bs=1 2> /dev/null)
if test "$first" = "#!"; then if test "$first" = "#!"; then
echo "patching $fn..." echo "patching $fn..."
sed < "$fn" > "$fn".tmp \ sed -i "$fn" -e "s|^#\!\(.*[ /]perl.*\)$|#\!\1$perlFlags|"
-e "s|^#\!\(.*/perl.*\)$|#\! \1$perlFlags|"
if test -x "$fn"; then chmod +x "$fn".tmp; fi
mv "$fn".tmp "$fn"
fi fi
fi fi
done done

View File

@ -19,7 +19,7 @@ stdenv.mkDerivation rec {
preConfigure = '' preConfigure = ''
substituteInPlace src/bloaty.cc \ substituteInPlace src/bloaty.cc \
--replace "c++filt" \ --replace "c++filt" \
"${stdenv.lib.getBin binutils}/bin/c++filt" "${binutils.bintools}/bin/c++filt"
''; '';
doCheck = true; doCheck = true;

View File

@ -1,12 +1,12 @@
{ lib, python3Packages }: { lib, python3Packages }:
python3Packages.buildPythonApplication rec { python3Packages.buildPythonApplication rec {
version = "0.43.0"; version = "0.44.0";
pname = "meson"; pname = "meson";
name = "${pname}-${version}"; name = "${pname}-${version}";
src = python3Packages.fetchPypi { src = python3Packages.fetchPypi {
inherit pname version; inherit pname version;
sha256 = "0qn5hyzvam3rimn7g3671s1igj7fbkwdnf5nc8jr4d5swy25mq61"; sha256 = "1rpqp9iwbvr4xvfdh3iyfh1ha274hbb66jbgw3pa5a73x4d4ilqn";
}; };
postFixup = '' postFixup = ''

View File

@ -55,7 +55,7 @@ stdenv.mkDerivation rec {
./disambiguate-arm-targets.patch ./disambiguate-arm-targets.patch
]; ];
outputs = [ "out" "info" ]; outputs = [ "out" "info" "man" ];
nativeBuildInputs = [ bison buildPackages.stdenv.cc ]; nativeBuildInputs = [ bison buildPackages.stdenv.cc ];
buildInputs = [ zlib ]; buildInputs = [ zlib ];

View File

@ -5,7 +5,7 @@ let
in in
buildNodejs { buildNodejs {
inherit enableNpm; inherit enableNpm;
version = "9.2.0"; version = "9.3.0";
sha256 = "1hmvwfbavk2axqz9kin8b5zsld25gznhvlz55h3yl6nwx9iz5jk4"; sha256 = "1kap1hi4am5advfp6yb3bd5nhd2wx2j72cjq8qqg7yh95xg0g25j";
patches = lib.optionals stdenv.isDarwin [ ./no-xcode-v7.patch ]; patches = lib.optionals stdenv.isDarwin [ ./no-xcode-v7.patch ];
} }

View File

@ -17,10 +17,11 @@ in
# TODO loop over targetPrefixed binaries too # TODO loop over targetPrefixed binaries too
stdenv.mkDerivation { stdenv.mkDerivation {
name = "${targetPrefix}cctools-binutils-darwin"; name = "${targetPrefix}cctools-binutils-darwin";
outputs = [ "out" "info" "man" ];
buildCommand = '' buildCommand = ''
mkdir -p $out/bin $out/include mkdir -p $out/bin $out/include
ln -s ${binutils-raw.out}/bin/${targetPrefix}c++filt $out/bin/${targetPrefix}c++filt ln -s ${binutils-raw.bintools.out}/bin/${targetPrefix}c++filt $out/bin/${targetPrefix}c++filt
# We specifically need: # We specifically need:
# - ld: binutils doesn't provide it on darwin # - ld: binutils doesn't provide it on darwin
@ -37,10 +38,16 @@ stdenv.mkDerivation {
ln -sf "${cctools}/bin/$i" "$out/bin/$i" ln -sf "${cctools}/bin/$i" "$out/bin/$i"
done done
# FIXME: this will give us incorrect man pages for bits of cctools ln -s ${binutils-raw.bintools.out}/share $out/share
ln -s ${binutils-raw.out}/share $out/share
ln -s ${cctools}/libexec $out/libexec ln -s ${cctools}/libexec $out/libexec
mkdir -p "$info/nix-support" "$man/nix-support"
printWords ${binutils-raw.bintools.info} \
>> $info/nix-support/propagated-build-inputs
# FIXME: cctools missing man pages
printWords ${binutils-raw.bintools.man} \
>> $man/nix-support/propagated-build-inputs
''; '';
passthru = { passthru = {

View File

@ -60,10 +60,40 @@ in rec {
extraBuildInputs, extraBuildInputs,
allowedRequisites ? null}: allowedRequisites ? null}:
let let
buildPackages = lib.optionalAttrs (last ? stdenv) {
inherit (last) stdenv;
};
coreutils = { name = "coreutils-9.9.9"; outPath = bootstrapTools; };
gnugrep = { name = "gnugrep-9.9.9"; outPath = bootstrapTools; };
bintools = import ../../build-support/bintools-wrapper {
inherit shell;
inherit (last) stdenvNoCC;
nativeTools = false;
nativeLibc = false;
inherit buildPackages coreutils gnugrep;
libc = last.pkgs.darwin.Libsystem;
bintools = { name = "binutils-9.9.9"; outPath = bootstrapTools; };
};
cc = if isNull last then "/dev/null" else import ../../build-support/cc-wrapper {
inherit shell;
inherit (last) stdenvNoCC;
nativeTools = false;
nativeLibc = false;
inherit buildPackages coreutils gnugrep bintools;
libc = last.pkgs.darwin.Libsystem;
isClang = true;
cc = { name = "clang-9.9.9"; outPath = bootstrapTools; };
};
thisStdenv = import ../generic { thisStdenv = import ../generic {
inherit config shell extraNativeBuildInputs extraBuildInputs; inherit config shell extraNativeBuildInputs extraBuildInputs;
allowedRequisites = if allowedRequisites == null then null else allowedRequisites ++ [ allowedRequisites = if allowedRequisites == null then null else allowedRequisites ++ [
thisStdenv.cc.expand-response-params cc.expand-response-params cc.bintools
]; ];
name = "stdenv-darwin-boot-${toString step}"; name = "stdenv-darwin-boot-${toString step}";
@ -72,24 +102,9 @@ in rec {
hostPlatform = localSystem; hostPlatform = localSystem;
targetPlatform = localSystem; targetPlatform = localSystem;
cc = if isNull last then "/dev/null" else import ../../build-support/cc-wrapper { inherit cc;
inherit shell;
inherit (last) stdenvNoCC;
nativeTools = false; preHook = lib.optionalString (shell == "${bootstrapTools}/bin/bash") ''
nativeLibc = false;
buildPackages = lib.optionalAttrs (last ? stdenv) {
inherit (last) stdenv;
};
libc = last.pkgs.darwin.Libsystem;
isClang = true;
cc = { name = "clang-9.9.9"; outPath = bootstrapTools; };
binutils = { name = "binutils-9.9.9"; outPath = bootstrapTools; };
coreutils = { name = "coreutils-9.9.9"; outPath = bootstrapTools; };
gnugrep = { name = "gnugrep-9.9.9"; outPath = bootstrapTools; };
};
preHook = stage0.stdenv.lib.optionalString (shell == "${bootstrapTools}/bin/bash") ''
# Don't patch #!/interpreter because it leads to retained # Don't patch #!/interpreter because it leads to retained
# dependencies on the bootstrapTools in the final stdenv. # dependencies on the bootstrapTools in the final stdenv.
dontPatchShebangs=1 dontPatchShebangs=1
@ -328,8 +343,9 @@ in rec {
buildPackages = { buildPackages = {
inherit (prevStage) stdenv; inherit (prevStage) stdenv;
}; };
inherit (pkgs) coreutils binutils gnugrep; inherit (pkgs) coreutils gnugrep;
cc = pkgs.llvmPackages.clang-unwrapped; cc = pkgs.llvmPackages.clang-unwrapped;
bintools = pkgs.darwin.binutils;
libc = pkgs.darwin.Libsystem; libc = pkgs.darwin.Libsystem;
}; };
@ -349,8 +365,8 @@ in rec {
xz.out xz.bin libcxx libcxxabi gmp.out gnumake findutils bzip2.out xz.out xz.bin libcxx libcxxabi gmp.out gnumake findutils bzip2.out
bzip2.bin llvmPackages.llvm llvmPackages.llvm.lib zlib.out zlib.dev libffi.out coreutils ed diffutils gnutar bzip2.bin llvmPackages.llvm llvmPackages.llvm.lib zlib.out zlib.dev libffi.out coreutils ed diffutils gnutar
gzip ncurses.out ncurses.dev ncurses.man gnused bash gawk gzip ncurses.out ncurses.dev ncurses.man gnused bash gawk
gnugrep llvmPackages.clang-unwrapped patch pcre.out binutils-raw.out gnugrep llvmPackages.clang-unwrapped patch pcre.out gettext
binutils gettext binutils-raw.bintools binutils binutils.bintools
cc.expand-response-params cc.expand-response-params
]) ++ (with pkgs.darwin; [ ]) ++ (with pkgs.darwin; [
dyld Libsystem CF cctools ICU libiconv locale dyld Libsystem CF cctools ICU libiconv locale

View File

@ -80,9 +80,10 @@ let
inherit (prevStage) stdenv; inherit (prevStage) stdenv;
}; };
cc = prevStage.gcc-unwrapped; cc = prevStage.gcc-unwrapped;
bintools = prevStage.binutils;
isGNU = true; isGNU = true;
libc = prevStage.glibc; libc = prevStage.glibc;
inherit (prevStage) binutils coreutils gnugrep; inherit (prevStage) coreutils gnugrep;
name = name; name = name;
stdenvNoCC = prevStage.ccWrapperStdenv; stdenvNoCC = prevStage.ccWrapperStdenv;
}; };
@ -143,7 +144,15 @@ in
''; '';
}; };
gcc-unwrapped = bootstrapTools; gcc-unwrapped = bootstrapTools;
binutils = bootstrapTools; binutils = import ../../build-support/bintools-wrapper {
nativeTools = false;
nativeLibc = false;
buildPackages = { };
libc = self.glibc;
inherit (self) stdenvNoCC coreutils gnugrep;
bintools = bootstrapTools;
name = "bootstrap-binutils-wrapper";
};
coreutils = bootstrapTools; coreutils = bootstrapTools;
gnugrep = bootstrapTools; gnugrep = bootstrapTools;
}; };
@ -165,7 +174,7 @@ in
# Rebuild binutils to use from stage2 onwards. # Rebuild binutils to use from stage2 onwards.
overrides = self: super: { overrides = self: super: {
binutils = super.binutils.override { gold = false; }; binutils = super.binutils_nogold;
inherit (prevStage) inherit (prevStage)
ccWrapperStdenv ccWrapperStdenv
glibc gcc-unwrapped coreutils gnugrep; glibc gcc-unwrapped coreutils gnugrep;
@ -188,9 +197,14 @@ in
overrides = self: super: { overrides = self: super: {
inherit (prevStage) inherit (prevStage)
ccWrapperStdenv ccWrapperStdenv
binutils gcc-unwrapped coreutils gnugrep gcc-unwrapped coreutils gnugrep
perl paxctl gnum4 bison; perl paxctl gnum4 bison;
# This also contains the full, dynamically linked, final Glibc. # This also contains the full, dynamically linked, final Glibc.
binutils = prevStage.binutils.override {
# Rewrap the binutils with the new glibc, so both the next
# stage's wrappers use it.
libc = self.glibc;
};
}; };
}) })
@ -235,6 +249,15 @@ in
# other purposes (binutils and top-level pkgs) too. # other purposes (binutils and top-level pkgs) too.
inherit (prevStage) gettext gnum4 bison gmp perl glibc zlib linuxHeaders; inherit (prevStage) gettext gnum4 bison gmp perl glibc zlib linuxHeaders;
binutils = super.binutils.override {
# Don't use stdenv's shell but our own
shell = self.bash + "/bin/bash";
# Build expand-response-params with last stage like below
buildPackages = {
inherit (prevStage) stdenv;
};
};
gcc = lib.makeOverridable (import ../../build-support/cc-wrapper) { gcc = lib.makeOverridable (import ../../build-support/cc-wrapper) {
nativeTools = false; nativeTools = false;
nativeLibc = false; nativeLibc = false;
@ -243,8 +266,9 @@ in
inherit (prevStage) stdenv; inherit (prevStage) stdenv;
}; };
cc = prevStage.gcc-unwrapped; cc = prevStage.gcc-unwrapped;
bintools = self.binutils;
libc = self.glibc; libc = self.glibc;
inherit (self) stdenvNoCC binutils coreutils gnugrep; inherit (self) stdenvNoCC coreutils gnugrep;
name = ""; name = "";
shell = self.bash + "/bin/bash"; shell = self.bash + "/bin/bash";
}; };
@ -299,8 +323,8 @@ in
allowedRequisites = with prevStage; with lib; allowedRequisites = with prevStage; with lib;
# Simple executable tools # Simple executable tools
concatMap (p: [ (getBin p) (getLib p) ]) concatMap (p: [ (getBin p) (getLib p) ])
[ gzip bzip2 xz bash binutils coreutils diffutils findutils gawk [ gzip bzip2 xz bash binutils.bintools coreutils diffutils findutils
gnumake gnused gnutar gnugrep gnupatch patchelf ed paxctl gawk gnumake gnused gnutar gnugrep gnupatch patchelf ed paxctl
] ]
# Library dependencies # Library dependencies
++ map getLib ( ++ map getLib (
@ -310,7 +334,7 @@ in
# More complicated cases # More complicated cases
++ [ ++ [
glibc.out glibc.dev glibc.bin/*propagated from .dev*/ linuxHeaders glibc.out glibc.dev glibc.bin/*propagated from .dev*/ linuxHeaders
gcc gcc.cc gcc.cc.lib gcc.expand-response-params binutils gcc gcc.cc gcc.cc.lib gcc.expand-response-params
] ]
++ lib.optionals localSystem.isAarch64 ++ lib.optionals localSystem.isAarch64
[ prevStage.updateAutotoolsGnuConfigScriptsHook prevStage.gnu-config ]; [ prevStage.updateAutotoolsGnuConfigScriptsHook prevStage.gnu-config ];
@ -322,7 +346,7 @@ in
attr acl paxctl zlib pcre; attr acl paxctl zlib pcre;
} // lib.optionalAttrs (super.targetPlatform == localSystem) { } // lib.optionalAttrs (super.targetPlatform == localSystem) {
# Need to get rid of these when cross-compiling. # Need to get rid of these when cross-compiling.
inherit (prevStage) binutils; inherit (prevStage) binutils binutils-raw;
gcc = cc; gcc = cc;
}; };
}; };

View File

@ -177,7 +177,7 @@ rec {
# Copy binutils. # Copy binutils.
for i in as ld ar ranlib nm strip readelf objdump; do for i in as ld ar ranlib nm strip readelf objdump; do
cp ${binutils.out}/bin/$i $out/bin cp ${binutils.bintools.out}/bin/$i $out/bin
done done
chmod -R u+w $out chmod -R u+w $out

View File

@ -126,7 +126,7 @@ rec {
# Copy binutils. # Copy binutils.
for i in as ld ar ranlib nm strip readelf objdump; do for i in as ld ar ranlib nm strip readelf objdump; do
cp ${binutils.out}/bin/$i $out/bin cp ${binutils.bintools.out}/bin/$i $out/bin
done done
chmod -R u+w $out chmod -R u+w $out

View File

@ -0,0 +1,37 @@
{ stdenv }:
stdenv.mkDerivation {
name = "cc-multilib-test";
# XXX: "depend" on cc-wrapper test?
# TODO: Have tests report pointer size or something; ensure they are what we asked for
buildCommand = ''
NIX_DEBUG=1 $CC -v
NIX_DEBUG=1 $CXX -v
printf "checking whether compiler builds valid C binaries... " >&2
$CC -o cc-check ${./cc-main.c}
./cc-check
printf "checking whether compiler builds valid 32bit C binaries... " >&2
$CC -m32 -o c32-check ${./cc-main.c}
./c32-check
printf "checking whether compiler builds valid 64bit C binaries... " >&2
$CC -m64 -o c64-check ${./cc-main.c}
./c64-check
printf "checking whether compiler builds valid 32bit C++ binaries... " >&2
$CXX -m32 -o cxx32-check ${./cxx-main.cc}
./cxx32-check
printf "checking whether compiler builds valid 64bit C++ binaries... " >&2
$CXX -m64 -o cxx64-check ${./cxx-main.cc}
./cxx64-check
touch $out
'';
meta.platforms = stdenv.lib.platforms.x86_64;
}

View File

@ -32,10 +32,6 @@ buildPerlModule rec {
# Tests depend on the precise Unicode-Collate version (expects 1.19, but we have 1.25) # Tests depend on the precise Unicode-Collate version (expects 1.19, but we have 1.25)
doCheck = false; doCheck = false;
postUnpack = ''
sed '1s/env perl/perl/' -i */bin/biber
'';
meta = { meta = {
description = "Backend for BibLaTeX"; description = "Backend for BibLaTeX";
license = with stdenv.lib.licenses; [ artistic1 gpl1Plus ]; license = with stdenv.lib.licenses; [ artistic1 gpl1Plus ];

View File

@ -287,6 +287,9 @@ with pkgs;
inherit url; inherit url;
}; };
ld-is-cc-hook = makeSetupHook { name = "ld-is-cc-hook"; }
../build-support/setup-hooks/ld-is-cc-hook.sh;
libredirect = callPackage ../build-support/libredirect { }; libredirect = callPackage ../build-support/libredirect { };
madonctl = callPackage ../applications/misc/madonctl { }; madonctl = callPackage ../applications/misc/madonctl { };
@ -5505,8 +5508,10 @@ with pkgs;
clang-sierraHack = clang.override { clang-sierraHack = clang.override {
name = "clang-wrapper-with-reexport-hack"; name = "clang-wrapper-with-reexport-hack";
bintools = clang.bintools.override {
useMacosReexportHack = true; useMacosReexportHack = true;
}; };
};
clang_5 = llvmPackages_5.clang; clang_5 = llvmPackages_5.clang;
clang_4 = llvmPackages_4.clang; clang_4 = llvmPackages_4.clang;
@ -5534,7 +5539,7 @@ with pkgs;
cc = build; cc = build;
isClang = true; isClang = true;
inherit stdenvNoCC; inherit stdenvNoCC;
libc = glibc; inherit (targetPackages.stdenv.cc) bintools libc;
extraPackages = [ libcxx libcxxabi ]; extraPackages = [ libcxx libcxxabi ];
nativeTools = false; nativeTools = false;
nativeLibc = false; nativeLibc = false;
@ -5606,24 +5611,42 @@ with pkgs;
}; };
wrapCCMulti = cc: wrapCCMulti = cc:
if system == "x86_64-linux" then lowPrio (wrapCCWith { if system == "x86_64-linux" then let
# Binutils with glibc multi
bintools = cc.bintools.override {
libc = glibc_multi;
};
in lowPrio (wrapCCWith {
cc = cc.cc.override { cc = cc.cc.override {
stdenv = overrideCC stdenv (wrapCCWith { stdenv = overrideCC stdenv (wrapCCWith {
cc = cc.cc; cc = cc.cc;
inherit bintools;
libc = glibc_multi; libc = glibc_multi;
}); });
profiledCompiler = false; profiledCompiler = false;
enableMultilib = true; enableMultilib = true;
}; };
libc = glibc_multi; libc = glibc_multi;
inherit bintools;
extraBuildCommands = '' extraBuildCommands = ''
echo "dontMoveLib64=1" >> $out/nix-support/setup-hook echo "dontMoveLib64=1" >> $out/nix-support/setup-hook
''; '';
}) else throw "Multilib ${cc.name} not supported on ${system}"; }) else throw "Multilib ${cc.name} not supported on ${system}";
wrapClangMulti = clang:
if system == "x86_64-linux" then
callPackage ../development/compilers/llvm/multi.nix {
inherit clang;
gcc32 = pkgsi686Linux.gcc;
gcc64 = pkgs.gcc;
}
else throw "Multilib ${clang.cc.name} not supported on '${system}'";
gcc_multi = wrapCCMulti gcc; gcc_multi = wrapCCMulti gcc;
clang_multi = wrapClangMulti clang;
gccMultiStdenv = overrideCC stdenv gcc_multi;
clangMultiStdenv = overrideCC stdenv clang_multi;
gcc_debug = lowPrio (wrapCC (gcc.cc.override { gcc_debug = lowPrio (wrapCC (gcc.cc.override {
stripped = false; stripped = false;
@ -5650,6 +5673,10 @@ with pkgs;
if targetPlatform.libc == "msvcrt" then targetPackages.windows.mingw_w64_headers if targetPlatform.libc == "msvcrt" then targetPackages.windows.mingw_w64_headers
else if targetPlatform.libc == "libSystem" then darwin.xcode else if targetPlatform.libc == "libSystem" then darwin.xcode
else null; else null;
binutils1 = wrapBintoolsWith {
bintools = binutils-unwrapped;
libc = libcCross1;
};
in wrapCCWith { in wrapCCWith {
name = "gcc-cross-wrapper"; name = "gcc-cross-wrapper";
cc = gccFun { cc = gccFun {
@ -5663,8 +5690,10 @@ with pkgs;
crossStageStatic = true; crossStageStatic = true;
langCC = false; langCC = false;
libcCross = libcCross1; libcCross = libcCross1;
targetPackages.stdenv.cc.bintools = binutils1;
enableShared = false; enableShared = false;
}; };
bintools = binutils1;
libc = libcCross1; libc = libcCross1;
}; };
@ -5673,6 +5702,7 @@ with pkgs;
name = "gcc-cross-wrapper"; name = "gcc-cross-wrapper";
cc = gccCrossStageStatic.gcc; cc = gccCrossStageStatic.gcc;
libc = windows.mingw_headers2; libc = windows.mingw_headers2;
inherit binutils;
}; };
gcc45 = lowPrio (wrapCC (callPackage ../development/compilers/gcc/4.5 { gcc45 = lowPrio (wrapCC (callPackage ../development/compilers/gcc/4.5 {
@ -6435,7 +6465,8 @@ with pkgs;
wla-dx = callPackage ../development/compilers/wla-dx { }; wla-dx = callPackage ../development/compilers/wla-dx { };
wrapCCWith = { name ? "", cc, libc, extraBuildCommands ? "" }: ccWrapperFun rec { wrapCCWith = { name ? "", cc, bintools, libc, extraBuildCommands ? "" }:
ccWrapperFun rec {
nativeTools = targetPlatform == hostPlatform && stdenv.cc.nativeTools or false; nativeTools = targetPlatform == hostPlatform && stdenv.cc.nativeTools or false;
nativeLibc = targetPlatform == hostPlatform && stdenv.cc.nativeLibc or false; nativeLibc = targetPlatform == hostPlatform && stdenv.cc.nativeLibc or false;
nativePrefix = stdenv.cc.nativePrefix or ""; nativePrefix = stdenv.cc.nativePrefix or "";
@ -6444,14 +6475,20 @@ with pkgs;
isGNU = cc.isGNU or false; isGNU = cc.isGNU or false;
isClang = cc.isClang or false; isClang = cc.isClang or false;
inherit name cc libc extraBuildCommands; inherit name cc bintools libc extraBuildCommands;
}; };
ccWrapperFun = callPackage ../build-support/cc-wrapper; ccWrapperFun = callPackage ../build-support/cc-wrapper;
bintoolsWrapperFun = callPackage ../build-support/bintools-wrapper;
wrapCC = cc: wrapCCWith { wrapCC = cc: wrapCCWith {
name = lib.optionalString (targetPlatform != hostPlatform) "gcc-cross-wrapper"; name = lib.optionalString (targetPlatform != hostPlatform) "gcc-cross-wrapper";
inherit cc; inherit cc;
# This should be the only bintools runtime dep with this sort of logic. The
# Others should instead delegate to the next stage's choice with
# `targetPackages.stdenv.cc.bintools`. This one is different just to
# provide the default choice, avoiding infinite recursion.
bintools = if targetPlatform.isDarwin then darwin.binutils else binutils;
libc = if targetPlatform != hostPlatform then libcCross else stdenv.cc.libc; libc = if targetPlatform != hostPlatform then libcCross else stdenv.cc.libc;
}; };
# legacy version, used for gnat bootstrapping # legacy version, used for gnat bootstrapping
@ -6463,6 +6500,17 @@ with pkgs;
libc = glibc; libc = glibc;
}; };
wrapBintoolsWith = { bintools, libc }: bintoolsWrapperFun {
nativeTools = targetPlatform == hostPlatform && stdenv.cc.nativeTools or false;
nativeLibc = targetPlatform == hostPlatform && stdenv.cc.nativeLibc or false;
nativePrefix = stdenv.cc.nativePrefix or "";
noLibc = (libc == null);
inherit bintools libc;
extraBuildCommands = "";
};
# prolog # prolog
yap = callPackage ../development/compilers/yap { }; yap = callPackage ../development/compilers/yap { };
@ -7044,13 +7092,19 @@ with pkgs;
then darwin.binutils then darwin.binutils
else binutils-raw; else binutils-raw;
binutils-raw = callPackage ../development/tools/misc/binutils { binutils-unwrapped = callPackage ../development/tools/misc/binutils {
# FHS sys dirs presumably only have stuff for the build platform # FHS sys dirs presumably only have stuff for the build platform
noSysDirs = (targetPlatform != buildPlatform) || noSysDirs; noSysDirs = (targetPlatform != buildPlatform) || noSysDirs;
}; };
binutils-raw = wrapBintoolsWith {
libc = if targetPlatform != hostPlatform then libcCross else stdenv.cc.libc;
bintools = binutils-unwrapped;
};
binutils_nogold = lowPrio (binutils-raw.override { binutils_nogold = lowPrio (binutils-raw.override {
bintools = binutils-raw.bintools.override {
gold = false; gold = false;
};
}); });
bison2 = callPackage ../development/tools/parsing/bison/2.x.nix { }; bison2 = callPackage ../development/tools/parsing/bison/2.x.nix { };
@ -9787,6 +9841,7 @@ with pkgs;
libva = callPackage ../development/libraries/libva { }; libva = callPackage ../development/libraries/libva { };
libva-full = libva.override { minimal = false; }; libva-full = libva.override { minimal = false; };
libva-utils = callPackage ../development/libraries/libva-utils { };
libvdpau = callPackage ../development/libraries/libvdpau { }; libvdpau = callPackage ../development/libraries/libvdpau { };
@ -20034,6 +20089,9 @@ with pkgs;
cc-wrapper-libcxx-5 = callPackage ../test/cc-wrapper { stdenv = llvmPackages_5.libcxxStdenv; }; cc-wrapper-libcxx-5 = callPackage ../test/cc-wrapper { stdenv = llvmPackages_5.libcxxStdenv; };
stdenv-inputs = callPackage ../test/stdenv-inputs { }; stdenv-inputs = callPackage ../test/stdenv-inputs { };
cc-multilib-gcc = callPackage ../test/cc-wrapper/multilib.nix { stdenv = gccMultiStdenv; };
cc-multilib-clang = callPackage ../test/cc-wrapper/multilib.nix { stdenv = clangMultiStdenv; };
macOSSierraShared = callPackage ../test/macos-sierra-shared {}; macOSSierraShared = callPackage ../test/macos-sierra-shared {};
}; };

View File

@ -10,9 +10,15 @@ in
apple_sdk = callPackage ../os-specific/darwin/apple-sdk { }; apple_sdk = callPackage ../os-specific/darwin/apple-sdk { };
binutils = callPackage ../os-specific/darwin/binutils { binutils = pkgs.wrapBintoolsWith {
libc =
if pkgs.targetPlatform != pkgs.hostPlatform
then pkgs.libcCross
else pkgs.stdenv.cc.libc;
bintools = callPackage ../os-specific/darwin/binutils {
inherit (darwin) cctools; inherit (darwin) cctools;
}; };
};
cctools = callPackage ../os-specific/darwin/cctools/port.nix { cctools = callPackage ../os-specific/darwin/cctools/port.nix {
inherit (darwin) libobjc maloader; inherit (darwin) libobjc maloader;

View File

@ -4849,6 +4849,7 @@ let self = _self // overrides; _self = with self; {
url = "mirror://cpan/authors/id/J/JG/JGMYERS/${name}.tar.gz"; url = "mirror://cpan/authors/id/J/JG/JGMYERS/${name}.tar.gz";
sha256 = "834d893aa7db6ce3f158afbd0e432d6ed15a276e0940db0a74be13fd9c4bbbf1"; sha256 = "834d893aa7db6ce3f158afbd0e432d6ed15a276e0940db0a74be13fd9c4bbbf1";
}; };
nativeBuildInputs = [ pkgs.ld-is-cc-hook ];
propagatedBuildInputs = [ ModuleBuild ]; propagatedBuildInputs = [ ModuleBuild ];
meta = { meta = {
description = "An Encode::Encoding subclass that detects the encoding of data"; description = "An Encode::Encoding subclass that detects the encoding of data";
@ -5162,6 +5163,7 @@ let self = _self // overrides; _self = with self; {
url = "mirror://cpan/modules/by-module/ExtUtils/${name}.tar.gz"; url = "mirror://cpan/modules/by-module/ExtUtils/${name}.tar.gz";
sha256 = "1a77hxf2pa8ia9na72rijv1yhpn2bjrdsybwk2dj2l938pl3xn0w"; sha256 = "1a77hxf2pa8ia9na72rijv1yhpn2bjrdsybwk2dj2l938pl3xn0w";
}; };
nativeBuildInputs = [ pkgs.ld-is-cc-hook ];
propagatedBuildInputs = [ CaptureTiny ]; propagatedBuildInputs = [ CaptureTiny ];
}; };
@ -8488,6 +8490,7 @@ let self = _self // overrides; _self = with self; {
url = "mirror://cpan/modules/by-module/Math/${name}.tar.gz"; url = "mirror://cpan/modules/by-module/Math/${name}.tar.gz";
sha256 = "0i9wzvig7ayijc9nvh5x5rryk1jrcj1hcvfmlcj449rnnxx24dav"; sha256 = "0i9wzvig7ayijc9nvh5x5rryk1jrcj1hcvfmlcj449rnnxx24dav";
}; };
nativeBuildInputs = [ pkgs.ld-is-cc-hook ];
propagatedBuildInputs = [ ModuleBuildWithXSpp ExtUtilsXSpp ExtUtilsTypemapsDefault TestDeep ]; propagatedBuildInputs = [ ModuleBuildWithXSpp ExtUtilsXSpp ExtUtilsTypemapsDefault TestDeep ];
}; };

View File

@ -56,14 +56,14 @@ let
flit = self.flit; flit = self.flit;
# We want Python libraries to be named like e.g. "python3.6-${name}" # We want Python libraries to be named like e.g. "python3.6-${name}"
inherit namePrefix; inherit namePrefix;
pythonModule = python; inherit toPythonModule;
})); }));
buildPythonApplication = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix { buildPythonApplication = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix {
inherit bootstrapped-pip; inherit bootstrapped-pip;
flit = self.flit; flit = self.flit;
namePrefix = ""; namePrefix = "";
pythonModule = false; toPythonModule = x: x; # Application does not provide modules.
})); }));
graphiteVersion = "1.0.2"; graphiteVersion = "1.0.2";
@ -87,15 +87,12 @@ let
in fetcher (builtins.removeAttrs attrs ["format"]) ); in fetcher (builtins.removeAttrs attrs ["format"]) );
# Check whether a derivation provides a Python module. # Check whether a derivation provides a Python module.
hasPythonModule = drv: (hasAttr "pythonModule" drv) && ( (getAttr "pythonModule" drv) == python); hasPythonModule = drv: drv?pythonModule && drv.pythonModule == python;
# Get list of required Python modules given a list of derivations. # Get list of required Python modules given a list of derivations.
requiredPythonModules = drvs: let requiredPythonModules = drvs: let
filterNull = list: filter (x: !isNull x) list; modules = filter hasPythonModule drvs;
conditionalGetRecurse = attr: condition: drv: let f = conditionalGetRecurse attr condition; in in unique ([python] ++ modules ++ concatLists (catAttrs "requiredPythonModules" modules));
(if (condition drv) then unique [drv]++(concatMap f (filterNull(getAttr attr drv))) else []);
_required = drv: conditionalGetRecurse "propagatedBuildInputs" hasPythonModule drv;
in [python] ++ (unique (concatMap _required (filterNull drvs)));
# Create a PYTHONPATH from a list of derivations. This function recurses into the items to find derivations # Create a PYTHONPATH from a list of derivations. This function recurses into the items to find derivations
# providing Python modules. # providing Python modules.
@ -106,9 +103,9 @@ let
drv.overrideAttrs( oldAttrs: { drv.overrideAttrs( oldAttrs: {
# Use passthru in order to prevent rebuilds when possible. # Use passthru in order to prevent rebuilds when possible.
passthru = (oldAttrs.passthru or {})// { passthru = (oldAttrs.passthru or {})// {
name = namePrefix + oldAttrs.name;
pythonModule = python; pythonModule = python;
pythonPath = [ ]; # Deprecated, for compatibility. pythonPath = [ ]; # Deprecated, for compatibility.
requiredPythonModules = requiredPythonModules drv.propagatedBuildInputs;
}; };
}); });
@ -129,7 +126,7 @@ in {
recursivePthLoader = callPackage ../development/python-modules/recursive-pth-loader { }; recursivePthLoader = callPackage ../development/python-modules/recursive-pth-loader { };
setuptools = callPackage ../development/python-modules/setuptools { }; setuptools = toPythonModule (callPackage ../development/python-modules/setuptools { });
vowpalwabbit = callPackage ../development/python-modules/vowpalwabbit { vowpalwabbit = callPackage ../development/python-modules/vowpalwabbit {
pythonPackages = self; pythonPackages = self;

View File

@ -112,6 +112,8 @@ let
jobs.tests.cc-wrapper-clang-39.x86_64-darwin jobs.tests.cc-wrapper-clang-39.x86_64-darwin
jobs.tests.cc-wrapper-libcxx-39.x86_64-linux jobs.tests.cc-wrapper-libcxx-39.x86_64-linux
jobs.tests.cc-wrapper-libcxx-39.x86_64-darwin jobs.tests.cc-wrapper-libcxx-39.x86_64-darwin
jobs.tests.cc-multilib-gcc.x86_64-linux
jobs.tests.cc-multilib-clang.x86_64-linux
jobs.tests.stdenv-inputs.x86_64-linux jobs.tests.stdenv-inputs.x86_64-linux
jobs.tests.stdenv-inputs.x86_64-darwin jobs.tests.stdenv-inputs.x86_64-darwin
jobs.tests.macOSSierraShared.x86_64-darwin jobs.tests.macOSSierraShared.x86_64-darwin