Merge some merged cross-compilation PRs into into staging
This commit is contained in:
@@ -5,11 +5,13 @@
|
||||
# script that sets up the right environment variables so that the
|
||||
# compiler and the linker just "work".
|
||||
|
||||
{ name ? "", stdenv, nativeTools, nativeLibc, nativePrefix ? ""
|
||||
{ name ? "", stdenv, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? ""
|
||||
, cc ? null, libc ? null, binutils ? null, coreutils ? null, shell ? stdenv.shell
|
||||
, zlib ? null, extraPackages ? [], extraBuildCommands ? ""
|
||||
, dyld ? null # TODO: should this be a setup-hook on dyld?
|
||||
, isGNU ? false, isClang ? cc.isClang or false, gnugrep ? null
|
||||
, hostPlatform, targetPlatform
|
||||
, runCommand ? null
|
||||
}:
|
||||
|
||||
with stdenv.lib;
|
||||
@@ -17,32 +19,113 @@ with stdenv.lib;
|
||||
assert nativeTools -> nativePrefix != "";
|
||||
assert !nativeTools ->
|
||||
cc != null && binutils != null && coreutils != null && gnugrep != null;
|
||||
assert !nativeLibc -> libc != null;
|
||||
assert !(nativeLibc && noLibc);
|
||||
assert (noLibc || nativeLibc) == (libc == null);
|
||||
|
||||
assert targetPlatform != hostPlatform -> runCommand != null;
|
||||
|
||||
# For ghdl (the vhdl language provider to gcc) we need zlib in the wrapper.
|
||||
assert cc.langVhdl or false -> zlib != null;
|
||||
|
||||
let
|
||||
# Prefix for binaries. Customarily ends with a dash separator.
|
||||
#
|
||||
# TODO(@Ericson2314) Make unconditional, or optional but always true by
|
||||
# default.
|
||||
prefix = stdenv.lib.optionalString (targetPlatform != hostPlatform)
|
||||
(targetPlatform.config + "-");
|
||||
|
||||
ccVersion = (builtins.parseDrvName cc.name).version;
|
||||
ccName = (builtins.parseDrvName cc.name).name;
|
||||
|
||||
libc_bin = if nativeLibc then null else getBin libc;
|
||||
libc_dev = if nativeLibc then null else getDev libc;
|
||||
libc_lib = if nativeLibc then null else getLib libc;
|
||||
libc_bin = if libc == null then null else getBin libc;
|
||||
libc_dev = if libc == null then null else getDev libc;
|
||||
libc_lib = if libc == null then null else getLib libc;
|
||||
cc_solib = getLib cc;
|
||||
binutils_bin = if nativeTools then "" else getBin binutils;
|
||||
# The wrapper scripts use 'cat' and 'grep', so we may need coreutils.
|
||||
coreutils_bin = if nativeTools then "" else getBin coreutils;
|
||||
|
||||
default_cxx_stdlib_compile=optionalString (stdenv.isLinux && !(cc.isGNU or false))
|
||||
default_cxx_stdlib_compile=optionalString (targetPlatform.isLinux && !(cc.isGNU or false))
|
||||
"-isystem $(echo -n ${cc.gcc}/include/c++/*) -isystem $(echo -n ${cc.gcc}/include/c++/*)/$(${cc.gcc}/bin/gcc -dumpmachine)";
|
||||
|
||||
dashlessTarget = stdenv.lib.replaceStrings ["-"] ["_"] targetPlatform.config;
|
||||
# TODO(@Ericson2314) Make unconditional
|
||||
infixSalt = stdenv.lib.optionalString (targetPlatform != hostPlatform) dashlessTarget;
|
||||
infixSalt_ = stdenv.lib.optionalString (targetPlatform != hostPlatform) (dashlessTarget + "_");
|
||||
_infixSalt = stdenv.lib.optionalString (targetPlatform != hostPlatform) ("_" + dashlessTarget);
|
||||
|
||||
# We want to prefix all NIX_ flags with the target triple
|
||||
preWrap = textFile:
|
||||
# TODO: Do even when not cross on next mass-rebuild
|
||||
# TODO: use @target_tripple@ for consistency
|
||||
if targetPlatform == hostPlatform
|
||||
then textFile
|
||||
else runCommand "sed-nix-env-vars" {} (''
|
||||
cp --no-preserve=mode ${textFile} $out
|
||||
|
||||
sed -i $out \
|
||||
-e 's^NIX_^NIX_${infixSalt_}^g' \
|
||||
-e 's^addCVars^addCVars${_infixSalt}^g' \
|
||||
-e 's^\[ -z "\$crossConfig" \]^\[\[ "${builtins.toString (targetPlatform != hostPlatform)}" || -z "$crossConfig" \]\]^g'
|
||||
|
||||
'' + stdenv.lib.optionalString (textFile == ./setup-hook.sh) ''
|
||||
cat << 'EOF' >> $out
|
||||
for CMD in ar as nm objcopy ranlib strip strings size ld
|
||||
do
|
||||
# which is not part of stdenv, but compgen will do for now
|
||||
if
|
||||
PATH=$_PATH type -p ${prefix}$CMD > /dev/null
|
||||
then
|
||||
export ''$(echo "$CMD" | tr "[:lower:]" "[:upper:]")=${prefix}''${CMD};
|
||||
fi
|
||||
done
|
||||
EOF
|
||||
|
||||
sed -i $out -e 's_envHooks_crossEnvHooks_g'
|
||||
'' + ''
|
||||
|
||||
# NIX_ things which we don't both use and define, we revert them
|
||||
#asymmetric=$(
|
||||
# for pre in "" "\\$"
|
||||
# do
|
||||
# grep -E -ho $pre'NIX_[a-zA-Z_]*' ./* | sed 's/\$//' | sort | uniq
|
||||
# done | sort | uniq -c | sort -nr | sed -n 's/^1 NIX_//gp')
|
||||
|
||||
# hard-code for now
|
||||
asymmetric=("CXXSTDLIB_COMPILE" "CC")
|
||||
|
||||
# The ([^a-zA-Z_]|$) bussiness is to ensure environment variables that
|
||||
# begin with `NIX_CC` don't also get blacklisted.
|
||||
for var in "''${asymmetric[@]}"
|
||||
do
|
||||
sed -i $out -E -e "s~NIX_${infixSalt_}$var([^a-zA-Z_]|$)~NIX_$var\1~g"
|
||||
done
|
||||
'');
|
||||
|
||||
# The dynamic linker has different names on different platforms.
|
||||
dynamicLinker =
|
||||
if !nativeLibc then
|
||||
(if targetPlatform.system == "i686-linux" then "ld-linux.so.2" else
|
||||
if targetPlatform.system == "x86_64-linux" then "ld-linux-x86-64.so.2" else
|
||||
# ARM with a wildcard, which can be "" or "-armhf".
|
||||
if targetPlatform.isArm32 then "ld-linux*.so.3" else
|
||||
if targetPlatform.system == "aarch64-linux" then "ld-linux-aarch64.so.1" else
|
||||
if targetPlatform.system == "powerpc-linux" then "ld.so.1" else
|
||||
if targetPlatform.system == "mips64el-linux" then "ld.so.1" else
|
||||
if targetPlatform.system == "x86_64-darwin" then "/usr/lib/dyld" else
|
||||
if stdenv.lib.hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1" else
|
||||
builtins.trace
|
||||
"Don't know the name of the dynamic linker for platform ${targetPlatform.config}, so guessing instead."
|
||||
null)
|
||||
else "";
|
||||
|
||||
in
|
||||
|
||||
stdenv.mkDerivation {
|
||||
name =
|
||||
(if name != "" then name else ccName + "-wrapper") +
|
||||
(if cc != null && ccVersion != "" then "-" + ccVersion else "");
|
||||
name = prefix
|
||||
+ (if name != "" then name else "${ccName}-wrapper")
|
||||
+ (stdenv.lib.optionalString (cc != null && ccVersion != "") "-${ccVersion}");
|
||||
|
||||
preferLocalBuild = true;
|
||||
|
||||
@@ -51,17 +134,18 @@ stdenv.mkDerivation {
|
||||
|
||||
|
||||
passthru = {
|
||||
inherit libc nativeTools nativeLibc nativePrefix isGNU isClang default_cxx_stdlib_compile;
|
||||
inherit libc nativeTools nativeLibc nativePrefix isGNU isClang default_cxx_stdlib_compile
|
||||
prefix infixSalt infixSalt_ _infixSalt;
|
||||
|
||||
emacsBufferSetup = pkgs: ''
|
||||
; We should handle propagation here too
|
||||
(mapc (lambda (arg)
|
||||
(when (file-directory-p (concat arg "/include"))
|
||||
(setenv "NIX_CFLAGS_COMPILE" (concat (getenv "NIX_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"))
|
||||
(setenv "NIX_LDFLAGS" (concat (getenv "NIX_LDFLAGS") " -L" arg "/lib")))
|
||||
(setenv "NIX_${infixSalt_}LDFLAGS" (concat (getenv "NIX_${infixSalt_}LDFLAGS") " -L" arg "/lib")))
|
||||
(when (file-directory-p (concat arg "/lib64"))
|
||||
(setenv "NIX_LDFLAGS" (concat (getenv "NIX_LDFLAGS") " -L" arg "/lib64")))) '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)}))
|
||||
(setenv "NIX_${infixSalt_}LDFLAGS" (concat (getenv "NIX_${infixSalt_}LDFLAGS") " -L" arg "/lib64")))) '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)}))
|
||||
'';
|
||||
};
|
||||
|
||||
@@ -78,7 +162,12 @@ stdenv.mkDerivation {
|
||||
}
|
||||
''
|
||||
|
||||
+ optionalString (!nativeLibc) (if (!stdenv.isDarwin) then ''
|
||||
# TODO(@Ericson2314): Unify logic next hash break
|
||||
+ optionalString (libc != null) (if (targetPlatform.isDarwin) then ''
|
||||
echo $dynamicLinker > $out/nix-support/dynamic-linker
|
||||
|
||||
echo "export LD_DYLD_PATH=\"$dynamicLinker\"" >> $out/nix-support/setup-hook
|
||||
'' else if dynamicLinker != null then ''
|
||||
dynamicLinker="${libc_lib}/lib/$dynamicLinker"
|
||||
echo $dynamicLinker > $out/nix-support/dynamic-linker
|
||||
|
||||
@@ -91,12 +180,24 @@ stdenv.mkDerivation {
|
||||
# (the *last* value counts, so ours should come first).
|
||||
echo "-dynamic-linker" $dynamicLinker > $out/nix-support/libc-ldflags-before
|
||||
'' else ''
|
||||
echo $dynamicLinker > $out/nix-support/dynamic-linker
|
||||
dynamicLinker=`eval 'echo $libc/lib/ld*.so.?'`
|
||||
if [ -n "$dynamicLinker" ]; then
|
||||
echo $dynamicLinker > $out/nix-support/dynamic-linker
|
||||
|
||||
echo "export LD_DYLD_PATH=\"$dynamicLinker\"" >> $out/nix-support/setup-hook
|
||||
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
|
||||
|
||||
ldflagsBefore="-dynamic-linker $dlinker"
|
||||
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).
|
||||
echo "$ldflagsBefore" > $out/nix-support/libc-ldflags-before
|
||||
'')
|
||||
|
||||
+ optionalString (!nativeLibc) ''
|
||||
+ optionalString (libc != null) ''
|
||||
# The "-B${libc_lib}/lib/" flag is a quick hack to force gcc to link
|
||||
# against the crt1.o from our own glibc, rather than the one in
|
||||
# /usr/lib. (This is only an issue when using an `impure'
|
||||
@@ -117,7 +218,7 @@ stdenv.mkDerivation {
|
||||
''
|
||||
|
||||
+ (if nativeTools then ''
|
||||
ccPath="${if stdenv.isDarwin then cc else nativePrefix}/bin"
|
||||
ccPath="${if targetPlatform.isDarwin then cc else nativePrefix}/bin"
|
||||
ldPath="${nativePrefix}/bin"
|
||||
'' else ''
|
||||
echo $cc > $out/nix-support/orig-cc
|
||||
@@ -161,136 +262,114 @@ stdenv.mkDerivation {
|
||||
# Propagate the wrapped cc so that if you install the wrapper,
|
||||
# you get tools like gcov, the manpages, etc. as well (including
|
||||
# for binutils and Glibc).
|
||||
echo ${cc} ${cc.man or ""} ${binutils_bin} ${libc_bin} > $out/nix-support/propagated-user-env-packages
|
||||
echo ${cc} ${cc.man or ""} ${binutils_bin} ${if libc == null then "" else libc_bin} > $out/nix-support/propagated-user-env-packages
|
||||
|
||||
echo ${toString extraPackages} > $out/nix-support/propagated-native-build-inputs
|
||||
''
|
||||
|
||||
+ optionalString (stdenv.isSunOS && nativePrefix != "") ''
|
||||
+ optionalString (targetPlatform.isSunOS && nativePrefix != "") ''
|
||||
# Solaris needs an additional ld wrapper.
|
||||
ldPath="${nativePrefix}/bin"
|
||||
exec="$ldPath/ld"
|
||||
wrap ld-solaris ${./ld-solaris-wrapper.sh}
|
||||
exec="$ldPath/${prefix}ld"
|
||||
wrap ld-solaris ${preWrap ./ld-solaris-wrapper.sh}
|
||||
'')
|
||||
|
||||
+ ''
|
||||
# Create a symlink to as (the assembler). This is useful when a
|
||||
# cc-wrapper is installed in a user environment, as it ensures that
|
||||
# the right assembler is called.
|
||||
if [ -e $ldPath/as ]; then
|
||||
ln -s $ldPath/as $out/bin/as
|
||||
if [ -e $ldPath/${prefix}as ]; then
|
||||
ln -s $ldPath/${prefix}as $out/bin/${prefix}as
|
||||
fi
|
||||
|
||||
wrap ld ${./ld-wrapper.sh} ''${ld:-$ldPath/ld}
|
||||
wrap ${prefix}ld ${preWrap ./ld-wrapper.sh} ''${ld:-$ldPath/${prefix}ld}
|
||||
|
||||
if [ -e ${binutils_bin}/bin/ld.gold ]; then
|
||||
wrap ld.gold ${./ld-wrapper.sh} ${binutils_bin}/bin/ld.gold
|
||||
if [ -e ${binutils_bin}/bin/${prefix}ld.gold ]; then
|
||||
wrap ${prefix}ld.gold ${preWrap ./ld-wrapper.sh} ${binutils_bin}/bin/${prefix}ld.gold
|
||||
fi
|
||||
|
||||
if [ -e ${binutils_bin}/bin/ld.bfd ]; then
|
||||
wrap ld.bfd ${./ld-wrapper.sh} ${binutils_bin}/bin/ld.bfd
|
||||
wrap ${prefix}ld.bfd ${preWrap ./ld-wrapper.sh} ${binutils_bin}/bin/${prefix}ld.bfd
|
||||
fi
|
||||
|
||||
export real_cc=cc
|
||||
export real_cxx=c++
|
||||
export real_cc=${prefix}cc
|
||||
export real_cxx=${prefix}c++
|
||||
export default_cxx_stdlib_compile="${default_cxx_stdlib_compile}"
|
||||
|
||||
if [ -e $ccPath/gcc ]; then
|
||||
wrap gcc ${./cc-wrapper.sh} $ccPath/gcc
|
||||
ln -s gcc $out/bin/cc
|
||||
export real_cc=gcc
|
||||
export real_cxx=g++
|
||||
if [ -e $ccPath/${prefix}gcc ]; then
|
||||
wrap ${prefix}gcc ${preWrap ./cc-wrapper.sh} $ccPath/${prefix}gcc
|
||||
ln -s ${prefix}gcc $out/bin/${prefix}cc
|
||||
export real_cc=${prefix}gcc
|
||||
export real_cxx=${prefix}g++
|
||||
elif [ -e $ccPath/clang ]; then
|
||||
wrap clang ${./cc-wrapper.sh} $ccPath/clang
|
||||
ln -s clang $out/bin/cc
|
||||
wrap ${prefix}clang ${preWrap ./cc-wrapper.sh} $ccPath/clang
|
||||
ln -s ${prefix}clang $out/bin/${prefix}cc
|
||||
export real_cc=clang
|
||||
export real_cxx=clang++
|
||||
fi
|
||||
|
||||
if [ -e $ccPath/g++ ]; then
|
||||
wrap g++ ${./cc-wrapper.sh} $ccPath/g++
|
||||
ln -s g++ $out/bin/c++
|
||||
if [ -e $ccPath/${prefix}g++ ]; then
|
||||
wrap ${prefix}g++ ${preWrap ./cc-wrapper.sh} $ccPath/${prefix}g++
|
||||
ln -s ${prefix}g++ $out/bin/${prefix}c++
|
||||
elif [ -e $ccPath/clang++ ]; then
|
||||
wrap clang++ ${./cc-wrapper.sh} $ccPath/clang++
|
||||
ln -s clang++ $out/bin/c++
|
||||
wrap ${prefix}clang++ ${preWrap ./cc-wrapper.sh} $ccPath/clang++
|
||||
ln -s ${prefix}clang++ $out/bin/${prefix}c++
|
||||
fi
|
||||
|
||||
if [ -e $ccPath/cpp ]; then
|
||||
wrap cpp ${./cc-wrapper.sh} $ccPath/cpp
|
||||
wrap ${prefix}cpp ${preWrap ./cc-wrapper.sh} $ccPath/cpp
|
||||
fi
|
||||
''
|
||||
|
||||
+ optionalString cc.langFortran or false ''
|
||||
wrap gfortran ${./cc-wrapper.sh} $ccPath/gfortran
|
||||
ln -sv gfortran $out/bin/g77
|
||||
ln -sv gfortran $out/bin/f77
|
||||
wrap ${prefix}gfortran ${preWrap ./cc-wrapper.sh} $ccPath/${prefix}gfortran
|
||||
ln -sv ${prefix}gfortran $out/bin/${prefix}g77
|
||||
ln -sv ${prefix}gfortran $out/bin/${prefix}f77
|
||||
''
|
||||
|
||||
+ optionalString cc.langJava or false ''
|
||||
wrap gcj ${./cc-wrapper.sh} $ccPath/gcj
|
||||
wrap ${prefix}gcj ${preWrap ./cc-wrapper.sh} $ccPath/${prefix}gcj
|
||||
''
|
||||
|
||||
+ optionalString cc.langGo or false ''
|
||||
wrap gccgo ${./cc-wrapper.sh} $ccPath/gccgo
|
||||
wrap ${prefix}gccgo ${preWrap ./cc-wrapper.sh} $ccPath/${prefix}gccgo
|
||||
''
|
||||
|
||||
+ optionalString cc.langAda or false ''
|
||||
wrap gnatgcc ${./cc-wrapper.sh} $ccPath/gnatgcc
|
||||
wrap gnatmake ${./gnat-wrapper.sh} $ccPath/gnatmake
|
||||
wrap gnatbind ${./gnat-wrapper.sh} $ccPath/gnatbind
|
||||
wrap gnatlink ${./gnatlink-wrapper.sh} $ccPath/gnatlink
|
||||
wrap ${prefix}gnatgcc ${preWrap ./cc-wrapper.sh} $ccPath/${prefix}gnatgcc
|
||||
wrap ${prefix}gnatmake ${preWrap ./gnat-wrapper.sh} $ccPath/${prefix}gnatmake
|
||||
wrap ${prefix}gnatbind ${preWrap ./gnat-wrapper.sh} $ccPath/${prefix}gnatbind
|
||||
wrap ${prefix}gnatlink ${preWrap ./gnatlink-wrapper.sh} $ccPath/${prefix}gnatlink
|
||||
''
|
||||
|
||||
+ optionalString cc.langVhdl or false ''
|
||||
ln -s $ccPath/ghdl $out/bin/ghdl
|
||||
ln -s $ccPath/${prefix}ghdl $out/bin/${prefix}ghdl
|
||||
''
|
||||
|
||||
+ ''
|
||||
substituteAll ${./setup-hook.sh} $out/nix-support/setup-hook.tmp
|
||||
substituteAll ${preWrap ./setup-hook.sh} $out/nix-support/setup-hook.tmp
|
||||
cat $out/nix-support/setup-hook.tmp >> $out/nix-support/setup-hook
|
||||
rm $out/nix-support/setup-hook.tmp
|
||||
|
||||
# some linkers on some platforms don't support specific -z flags
|
||||
hardening_unsupported_flags=""
|
||||
if [[ "$($ldPath/ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
|
||||
if [[ "$($ldPath/${prefix}ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
|
||||
hardening_unsupported_flags+=" bindnow"
|
||||
fi
|
||||
if [[ "$($ldPath/ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
|
||||
if [[ "$($ldPath/${prefix}ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then
|
||||
hardening_unsupported_flags+=" relro"
|
||||
fi
|
||||
|
||||
substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh
|
||||
substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh
|
||||
cp -p ${./utils.sh} $out/nix-support/utils.sh
|
||||
substituteAll ${preWrap ./add-flags.sh} $out/nix-support/add-flags.sh
|
||||
substituteAll ${preWrap ./add-hardening.sh} $out/nix-support/add-hardening.sh
|
||||
cp -p ${preWrap ./utils.sh} $out/nix-support/utils.sh
|
||||
''
|
||||
+ extraBuildCommands;
|
||||
|
||||
# The dynamic linker has different names on different Linux platforms.
|
||||
dynamicLinker =
|
||||
if !nativeLibc then
|
||||
(if stdenv.system == "i686-linux" then "ld-linux.so.2" else
|
||||
if stdenv.system == "x86_64-linux" then "ld-linux-x86-64.so.2" else
|
||||
# ARM with a wildcard, which can be "" or "-armhf".
|
||||
if stdenv.isArm then "ld-linux*.so.3" else
|
||||
if stdenv.system == "aarch64-linux" then "ld-linux-aarch64.so.1" else
|
||||
if stdenv.system == "powerpc-linux" then "ld.so.1" else
|
||||
if stdenv.system == "mips64el-linux" then "ld.so.1" else
|
||||
if stdenv.system == "x86_64-darwin" then "/usr/lib/dyld" else
|
||||
abort "Don't know the name of the dynamic linker for this platform.")
|
||||
else "";
|
||||
inherit dynamicLinker;
|
||||
|
||||
crossAttrs = {
|
||||
shell = shell.crossDrv + shell.crossDrv.shellPath;
|
||||
libc = stdenv.ccCross.libc;
|
||||
#
|
||||
# This is not the best way to do this. I think the reference should be
|
||||
# the style in the gcc-cross-wrapper, but to keep a stable stdenv now I
|
||||
# do this sufficient if/else.
|
||||
dynamicLinker =
|
||||
(if stdenv.cross.arch == "arm" then "ld-linux.so.3" else
|
||||
if stdenv.cross.arch == "mips" then "ld.so.1" else
|
||||
if stdenv.lib.hasSuffix "pc-gnu" stdenv.cross.config then "ld.so.1" else
|
||||
abort "don't know the name of the dynamic linker for this platform");
|
||||
};
|
||||
|
||||
meta =
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
export NIX_CROSS_CFLAGS_COMPILE="@cflagsCompile@ $NIX_CROSS_CFLAGS_COMPILE"
|
||||
export NIX_CROSS_CFLAGS_LINK="@cflagsLink@ $NIX_CROSS_CFLAGS_LINK"
|
||||
export NIX_CROSS_LDFLAGS="@ldflags@ $NIX_CROSS_LDFLAGS"
|
||||
export NIX_CROSS_LDFLAGS_BEFORE="@ldflagsBefore@ $NIX_CROSS_LDFLAGS_BEFORE"
|
||||
export NIX_CROSS_GLIBC_FLAGS_SET=1
|
||||
@@ -1,120 +0,0 @@
|
||||
source $stdenv/setup
|
||||
|
||||
mkdir $out
|
||||
mkdir $out/bin
|
||||
mkdir $out/nix-support
|
||||
|
||||
# Force gcc to use ld-wrapper.sh when calling ld.
|
||||
cflagsCompile="-B$out/bin/"
|
||||
|
||||
if test -z "$nativeLibc" -a -n "$libc"; then
|
||||
cflagsCompile="$cflagsCompile -B$gccLibs/lib -B$libc/lib/ -isystem $libc_dev/include"
|
||||
ldflags="$ldflags -L$libc/lib"
|
||||
# Get the proper dynamic linker for glibc and uclibc.
|
||||
dlinker=`eval 'echo $libc/lib/ld*.so.?'`
|
||||
if [ -n "$dlinker" ]; then
|
||||
ldflagsBefore="-dynamic-linker $dlinker"
|
||||
|
||||
# The same as above, but put into files, useful for the gcc builder.
|
||||
echo $dlinker > $out/nix-support/dynamic-linker
|
||||
# This trick is to avoid dependencies on the cross-toolchain gcc
|
||||
# for libgcc, libstdc++, ...
|
||||
# -L is for libtool's .la files, and -rpath for the usual fixupPhase
|
||||
# shrinking rpaths.
|
||||
if [ -n "$gccLibs" ]; then
|
||||
ldflagsBefore="$ldflagsBefore -rpath $gccLibs/lib"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$osxMinVersion" ]; then
|
||||
cflagsCompile="$cflagsCompile -mmacosx-version-min=$osxMinVersion"
|
||||
fi
|
||||
|
||||
echo "$cflagsCompile -B$libc/lib/ -idirafter $libc/include -idirafter $gcc/lib/gcc/*/*/include-fixed" > $out/nix-support/libc-cflags
|
||||
|
||||
echo "-L$libc/lib -rpath $libc/lib -rpath-link $libc/lib" > $out/nix-support/libc-ldflags
|
||||
|
||||
# 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).
|
||||
echo "$ldflagsBefore" > $out/nix-support/libc-ldflags-before
|
||||
fi
|
||||
|
||||
if test -n "$nativeTools"; then
|
||||
gccPath="$nativePrefix/bin"
|
||||
ldPath="$nativePrefix/bin"
|
||||
else
|
||||
ldflags="$ldflags -L$gcc/lib -L$gcc/lib64"
|
||||
gccPath="$gcc/bin"
|
||||
ldPath="$binutils/$crossConfig/bin"
|
||||
fi
|
||||
|
||||
|
||||
doSubstitute() {
|
||||
local src=$1
|
||||
local dst=$2
|
||||
substitute "$src" "$dst" \
|
||||
--subst-var "out" \
|
||||
--subst-var "shell" \
|
||||
--subst-var "gcc" \
|
||||
--subst-var "gccProg" \
|
||||
--subst-var "binutils" \
|
||||
--subst-var "libc" \
|
||||
--subst-var "cflagsCompile" \
|
||||
--subst-var "cflagsLink" \
|
||||
--subst-var "ldflags" \
|
||||
--subst-var "ldflagsBefore" \
|
||||
--subst-var "ldPath" \
|
||||
--subst-var-by "ld" "$ldPath/ld"
|
||||
}
|
||||
|
||||
|
||||
# Make wrapper scripts around gcc, g++, and g77. Also make symlinks
|
||||
# cc, c++, and f77.
|
||||
mkGccWrapper() {
|
||||
local dst=$1
|
||||
local src=$2
|
||||
|
||||
if ! test -f "$src"; then
|
||||
echo "$src does not exist (skipping)"
|
||||
return
|
||||
fi
|
||||
|
||||
gccProg="$src"
|
||||
doSubstitute "$gccWrapper" "$dst"
|
||||
chmod +x "$dst"
|
||||
}
|
||||
|
||||
mkGccWrapper $out/bin/$crossConfig-gcc $gccPath/$crossConfig-gcc
|
||||
#ln -s gcc $out/bin/cc
|
||||
|
||||
mkGccWrapper $out/bin/$crossConfig-g++ $gccPath/$crossConfig-g++
|
||||
ln -s $crossConfig-g++ $out/bin/$crossConfig-c++
|
||||
|
||||
mkGccWrapper $out/bin/$crossConfig-cpp $gccPath/$crossConfig-cpp
|
||||
|
||||
mkGccWrapper $out/bin/$crossConfig-g77 $gccPath/$crossConfig-g77
|
||||
ln -s $crossConfig-g77 $out/bin/$crossConfig-f77
|
||||
|
||||
ln -s $binutils/bin/$crossConfig-ar $out/bin/$crossConfig-ar
|
||||
ln -s $binutils/bin/$crossConfig-as $out/bin/$crossConfig-as
|
||||
ln -s $binutils/bin/$crossConfig-nm $out/bin/$crossConfig-nm
|
||||
ln -s $binutils/bin/$crossConfig-strip $out/bin/$crossConfig-strip
|
||||
|
||||
|
||||
# Make a wrapper around the linker.
|
||||
doSubstitute "$ldWrapper" "$out/bin/$crossConfig-ld"
|
||||
chmod +x "$out/bin/$crossConfig-ld"
|
||||
|
||||
|
||||
# Emit a setup hook. Also store the path to the original GCC and
|
||||
# Glibc.
|
||||
test -n "$gcc" && echo $gcc > $out/nix-support/orig-cc
|
||||
test -n "$libc" && echo $libc > $out/nix-support/orig-libc
|
||||
test -n "$libc_dev" && echo $libc_dev > $out/nix-support/orig-libc-dev
|
||||
|
||||
doSubstitute "$addFlags" "$out/nix-support/add-flags"
|
||||
|
||||
doSubstitute "$setupHook" "$out/nix-support/setup-hook"
|
||||
|
||||
cp -p $utils $out/nix-support/utils
|
||||
@@ -1,65 +0,0 @@
|
||||
# The Nix `gcc' stdenv.mkDerivation 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. This
|
||||
# stdenv.mkDerivation provides a wrapper that sets up the right environment
|
||||
# variables so that the compiler and the linker just "work".
|
||||
|
||||
{ name ? "", stdenv, nativeTools, nativeLibc, noLibc ? false, nativePrefix ? ""
|
||||
, gcc ? null, libc ? null, binutils ? null, shell ? "", cross
|
||||
}:
|
||||
|
||||
assert nativeTools -> nativePrefix != "";
|
||||
assert !nativeTools -> gcc != null && binutils != null;
|
||||
assert !noLibc -> (!nativeLibc -> libc != null);
|
||||
|
||||
let
|
||||
chosenName = if name == "" then gcc.name else name;
|
||||
gccLibs = stdenv.mkDerivation {
|
||||
name = chosenName + "-libs";
|
||||
phases = [ "installPhase" ];
|
||||
installPhase = ''
|
||||
echo $out
|
||||
mkdir -p "$out"
|
||||
|
||||
if [ -d "${gcc}/${cross.config}/lib" ]
|
||||
then
|
||||
cp -Rd "${gcc}/${cross.config}/lib" "$out/lib"
|
||||
chmod -R +w "$out/lib"
|
||||
for a in "$out/lib/"*.la; do
|
||||
sed -i -e "s,${gcc}/${cross.config}/lib,$out/lib,g" $a
|
||||
done
|
||||
rm -f "$out/lib/"*.py
|
||||
else
|
||||
# The MinGW cross-compiler falls into this category.
|
||||
mkdir "$out/lib"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
builder = ./builder.sh;
|
||||
setupHook = ./setup-hook.sh;
|
||||
gccWrapper = ./gcc-wrapper.sh;
|
||||
ldWrapper = ./ld-wrapper.sh;
|
||||
utils = ./utils.sh;
|
||||
addFlags = ./add-flags;
|
||||
inherit nativeTools nativeLibc nativePrefix gcc binutils;
|
||||
libc = if libc ? out then libc.out else libc;
|
||||
libc_dev = if libc ? dev then libc.dev else libc;
|
||||
crossConfig = if cross != null then cross.config else null;
|
||||
osxMinVersion = cross.osxMinVersion or null;
|
||||
gccLibs = if gcc != null then gccLibs else null;
|
||||
name = chosenName;
|
||||
langC = if nativeTools then true else gcc.langC;
|
||||
langCC = if nativeTools then true else gcc.langCC;
|
||||
langF77 = if nativeTools then false else gcc ? langFortran;
|
||||
shell = if shell == "" then stdenv.shell else shell;
|
||||
meta = if gcc != null then gcc.meta else
|
||||
{ description = "System C compiler wrapper";
|
||||
};
|
||||
|
||||
passthru = {
|
||||
target = cross;
|
||||
};
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
#! @shell@ -e
|
||||
|
||||
if test -n "$NIX_CC_WRAPPER_START_HOOK"; then
|
||||
source "$NIX_CC_WRAPPER_START_HOOK"
|
||||
fi
|
||||
|
||||
if test -z "$NIX_CROSS_GLIBC_FLAGS_SET"; then
|
||||
source @out@/nix-support/add-flags
|
||||
fi
|
||||
|
||||
source @out@/nix-support/utils
|
||||
|
||||
|
||||
# Figure out if linker flags should be passed. GCC prints annoying
|
||||
# warnings when they are not needed.
|
||||
dontLink=0
|
||||
if test "$*" = "-v" -o -z "$*"; then
|
||||
dontLink=1
|
||||
else
|
||||
for i in "$@"; do
|
||||
if test "$i" = "-c"; then
|
||||
dontLink=1
|
||||
elif test "$i" = "-S"; then
|
||||
dontLink=1
|
||||
elif test "$i" = "-E"; then
|
||||
dontLink=1
|
||||
elif test "$i" = "-E"; then
|
||||
dontLink=1
|
||||
elif test "$i" = "-M"; then
|
||||
dontLink=1
|
||||
elif test "$i" = "-MM"; then
|
||||
dontLink=1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Optionally filter out paths not refering to the store.
|
||||
params=("$@")
|
||||
if test "$NIX_ENFORCE_PURITY" = "1" -a -n "$NIX_STORE"; then
|
||||
rest=()
|
||||
n=0
|
||||
while test $n -lt ${#params[*]}; do
|
||||
p=${params[n]}
|
||||
p2=${params[$((n+1))]}
|
||||
if test "${p:0:3}" = "-L/" && badPath "${p:2}"; then
|
||||
skip $p
|
||||
elif test "$p" = "-L" && badPath "$p2"; then
|
||||
n=$((n + 1)); skip $p2
|
||||
elif test "${p:0:3}" = "-I/" && badPath "${p:2}"; then
|
||||
skip $p
|
||||
elif test "$p" = "-I" && badPath "$p2"; then
|
||||
n=$((n + 1)); skip $p2
|
||||
elif test "$p" = "-isystem" && badPath "$p2"; then
|
||||
n=$((n + 1)); skip $p2
|
||||
else
|
||||
rest=("${rest[@]}" "$p")
|
||||
fi
|
||||
n=$((n + 1))
|
||||
done
|
||||
params=("${rest[@]}")
|
||||
fi
|
||||
|
||||
|
||||
# Add the flags for the C compiler proper.
|
||||
extraAfter=($NIX_CROSS_CFLAGS_COMPILE)
|
||||
extraBefore=()
|
||||
|
||||
if test "$dontLink" != "1"; then
|
||||
|
||||
# Add the flags that should only be passed to the compiler when
|
||||
# linking.
|
||||
extraAfter=(${extraAfter[@]} $NIX_CROSS_CFLAGS_LINK)
|
||||
|
||||
# Add the flags that should be passed to the linker (and prevent
|
||||
# `ld-wrapper' from adding NIX_CROSS_LDFLAGS again).
|
||||
for i in $NIX_CROSS_LDFLAGS_BEFORE; do
|
||||
if test "${i:0:3}" = "-L/"; then
|
||||
extraBefore=(${extraBefore[@]} "$i")
|
||||
else
|
||||
extraBefore=(${extraBefore[@]} "-Wl,$i")
|
||||
fi
|
||||
done
|
||||
for i in $NIX_CROSS_LDFLAGS; do
|
||||
if test "${i:0:3}" = "-L/"; then
|
||||
extraAfter=(${extraAfter[@]} "$i")
|
||||
else
|
||||
extraAfter=(${extraAfter[@]} "-Wl,$i")
|
||||
fi
|
||||
done
|
||||
export NIX_CROSS_LDFLAGS_SET=1
|
||||
fi
|
||||
|
||||
# Optionally print debug info.
|
||||
if test "$NIX_DEBUG" = "1"; then
|
||||
echo "original flags to @gccProg@:" >&2
|
||||
for i in "${params[@]}"; do
|
||||
echo " $i" >&2
|
||||
done
|
||||
echo "extraBefore flags to @gccProg@:" >&2
|
||||
for i in ${extraBefore[@]}; do
|
||||
echo " $i" >&2
|
||||
done
|
||||
echo "extraAfter flags to @gccProg@:" >&2
|
||||
for i in ${extraAfter[@]}; do
|
||||
echo " $i" >&2
|
||||
done
|
||||
fi
|
||||
|
||||
if test -n "$NIX_CC_WRAPPER_EXEC_HOOK"; then
|
||||
source "$NIX_CC_WRAPPER_EXEC_HOOK"
|
||||
fi
|
||||
|
||||
# We want gcc to call the wrapper linker, not that of binutils.
|
||||
export PATH="@ldPath@:$PATH"
|
||||
|
||||
exec @gccProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]}
|
||||
@@ -1,145 +0,0 @@
|
||||
#! @shell@ -e
|
||||
|
||||
if test -n "$NIX_LD_WRAPPER_START_HOOK"; then
|
||||
source "$NIX_LD_WRAPPER_START_HOOK"
|
||||
fi
|
||||
|
||||
if test -z "$NIX_CROSS_GLIBC_FLAGS_SET"; then
|
||||
source @out@/nix-support/add-flags
|
||||
fi
|
||||
|
||||
source @out@/nix-support/utils
|
||||
|
||||
|
||||
# Optionally filter out paths not refering to the store.
|
||||
params=("$@")
|
||||
if test "$NIX_ENFORCE_PURITY" = "1" -a -n "$NIX_STORE" \
|
||||
-a \( -z "$NIX_IGNORE_LD_THROUGH_GCC" -o -z "$NIX_CROSS_LDFLAGS_SET" \); then
|
||||
rest=()
|
||||
n=0
|
||||
while test $n -lt ${#params[*]}; do
|
||||
p=${params[n]}
|
||||
p2=${params[$((n+1))]}
|
||||
if test "${p:0:3}" = "-L/" && badPath "${p:2}"; then
|
||||
skip $p
|
||||
elif test "$p" = "-L" && badPath "$p2"; then
|
||||
n=$((n + 1)); skip $p2
|
||||
elif test "$p" = "-rpath" && badPath "$p2"; then
|
||||
n=$((n + 1)); skip $p2
|
||||
elif test "$p" = "-dynamic-linker" && badPath "$p2"; then
|
||||
n=$((n + 1)); skip $p2
|
||||
elif test "${p:0:1}" = "/" && badPath "$p"; then
|
||||
# We cannot skip this; barf.
|
||||
echo "impure path \`$p' used in link" >&2
|
||||
exit 1
|
||||
else
|
||||
rest=("${rest[@]}" "$p")
|
||||
fi
|
||||
n=$((n + 1))
|
||||
done
|
||||
params=("${rest[@]}")
|
||||
fi
|
||||
|
||||
|
||||
extra=()
|
||||
extraBefore=()
|
||||
|
||||
if test -z "$NIX_CROSS_LDFLAGS_SET"; then
|
||||
extra=(${extra[@]} $NIX_CROSS_LDFLAGS)
|
||||
extraBefore=(${extraBefore[@]} $NIX_CROSS_LDFLAGS_BEFORE)
|
||||
fi
|
||||
|
||||
|
||||
# Add all used dynamic libraries to the rpath.
|
||||
if test "$NIX_DONT_SET_RPATH" != "1"; then
|
||||
|
||||
# First, find all -L... switches.
|
||||
allParams=("${params[@]}" ${extra[@]})
|
||||
libPath=""
|
||||
addToLibPath() {
|
||||
local path="$1"
|
||||
if test "${path:0:1}" != "/"; then return 0; fi
|
||||
case "$path" in
|
||||
*..*|*./*|*/.*|*//*)
|
||||
local path2
|
||||
if path2=$(readlink -f "$path"); then
|
||||
path="$path2"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
case $libPath in
|
||||
*\ $path\ *) return 0 ;;
|
||||
esac
|
||||
libPath="$libPath $path "
|
||||
}
|
||||
n=0
|
||||
while test $n -lt ${#allParams[*]}; do
|
||||
p=${allParams[n]}
|
||||
p2=${allParams[$((n+1))]}
|
||||
if test "${p:0:3}" = "-L/"; then
|
||||
addToLibPath ${p:2}
|
||||
elif test "$p" = "-L"; then
|
||||
addToLibPath ${p2}
|
||||
n=$((n + 1))
|
||||
fi
|
||||
n=$((n + 1))
|
||||
done
|
||||
|
||||
# Second, for each -l... switch, find the directory containing the
|
||||
# library and add it to the rpath.
|
||||
rpath=""
|
||||
addToRPath() {
|
||||
# If the path is not in the store, don't add it to the rpath.
|
||||
# This typically happens for libraries in /tmp that are later
|
||||
# copied to $out/lib. If not, we're screwed.
|
||||
if test "${1:0:${#NIX_STORE}}" != "$NIX_STORE"; then return 0; fi
|
||||
case $rpath in
|
||||
*\ $1\ *) return 0 ;;
|
||||
esac
|
||||
rpath="$rpath $1 "
|
||||
}
|
||||
findLib() {
|
||||
for i in $libPath; do
|
||||
if test -f $i/lib$1.so; then
|
||||
addToRPath $i
|
||||
fi
|
||||
done
|
||||
}
|
||||
n=0
|
||||
while test $n -lt ${#allParams[*]}; do
|
||||
p=${allParams[n]}
|
||||
p2=${allParams[$((n+1))]}
|
||||
if test "${p:0:2}" = "-l"; then
|
||||
findLib ${p:2}
|
||||
elif test "$p" = "-l"; then
|
||||
# I haven't seen `-l foo', but you never know...
|
||||
findLib ${p2}
|
||||
n=$((n + 1))
|
||||
fi
|
||||
n=$((n + 1))
|
||||
done
|
||||
|
||||
# Finally, add `-rpath' switches.
|
||||
for i in $rpath; do
|
||||
extra=(${extra[@]} -rpath $i -rpath-link $i)
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Optionally print debug info.
|
||||
if test "$NIX_DEBUG" = "1"; then
|
||||
echo "original flags to @ld@:" >&2
|
||||
for i in "${params[@]}"; do
|
||||
echo " $i" >&2
|
||||
done
|
||||
echo "extra flags to @ld@:" >&2
|
||||
for i in ${extra[@]}; do
|
||||
echo " $i" >&2
|
||||
done
|
||||
fi
|
||||
|
||||
if test -n "$NIX_LD_WRAPPER_EXEC_HOOK"; then
|
||||
source "$NIX_LD_WRAPPER_EXEC_HOOK"
|
||||
fi
|
||||
|
||||
exec @ld@ ${extraBefore[@]} "${params[@]}" ${extra[@]}
|
||||
@@ -1,90 +0,0 @@
|
||||
NIX_CROSS_CFLAGS_COMPILE=""
|
||||
NIX_CROSS_LDFLAGS=""
|
||||
|
||||
crossAddCVars () {
|
||||
if test -d $1/include; then
|
||||
export NIX_CROSS_CFLAGS_COMPILE="$NIX_CROSS_CFLAGS_COMPILE -I$1/include"
|
||||
fi
|
||||
|
||||
if test -d $1/lib; then
|
||||
export NIX_CROSS_LDFLAGS="$NIX_CROSS_LDFLAGS -L$1/lib -rpath-link $1/lib"
|
||||
fi
|
||||
}
|
||||
|
||||
crossEnvHooks+=(crossAddCVars)
|
||||
|
||||
crossStripDirs() {
|
||||
local dirs="$1"
|
||||
local stripFlags="$2"
|
||||
local dirsNew=
|
||||
|
||||
for d in ${dirs}; do
|
||||
if test -d "$prefix/$d"; then
|
||||
dirsNew="${dirsNew} $prefix/$d "
|
||||
fi
|
||||
done
|
||||
dirs=${dirsNew}
|
||||
|
||||
if test -n "${dirs}"; then
|
||||
header "cross stripping (with flags $stripFlags) in $dirs"
|
||||
# libc_nonshared.a should never be stripped, or builds will break.
|
||||
find $dirs -type f -print0 | xargs -0 ${xargsFlags:--r} $crossConfig-strip $stripFlags || true
|
||||
stopNest
|
||||
fi
|
||||
}
|
||||
|
||||
crossStrip () {
|
||||
# In cross_renaming we may rename dontCrossStrip to dontStrip, and
|
||||
# dontStrip to dontNativeStrip.
|
||||
# TODO: strip _only_ ELF executables, and return || fail here...
|
||||
if test -z "$dontCrossStrip"; then
|
||||
stripDebugList=${stripDebugList:-lib lib64 libexec bin sbin}
|
||||
if test -n "$stripDebugList"; then
|
||||
crossStripDirs "$stripDebugList" "${stripDebugFlags:--S}"
|
||||
fi
|
||||
|
||||
stripAllList=${stripAllList:-}
|
||||
if test -n "$stripAllList"; then
|
||||
crossStripDirs "$stripAllList" "${stripAllFlags:--s}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
preDistPhases=(${preDistPhases[@]} crossStrip)
|
||||
|
||||
|
||||
# Note: these come *after* $out in the PATH (see setup.sh).
|
||||
|
||||
if test -n "@gcc@"; then
|
||||
PATH=$PATH:@gcc@/bin
|
||||
fi
|
||||
|
||||
if test -n "@binutils@"; then
|
||||
PATH=$PATH:@binutils@/bin
|
||||
fi
|
||||
|
||||
if test -n "@libc@"; then
|
||||
PATH=$PATH:@libc@/bin
|
||||
crossAddCVars @libc@
|
||||
fi
|
||||
|
||||
if test "$dontSetConfigureCross" != "1"; then
|
||||
configureFlags="$configureFlags --build=$system --host=$crossConfig"
|
||||
fi
|
||||
# Disabling the tests when cross compiling, as usually the tests are meant for
|
||||
# native compilations.
|
||||
doCheck=""
|
||||
|
||||
# Don't strip foreign binaries with native "strip" tool.
|
||||
dontStrip=1
|
||||
|
||||
# Add the output as an rpath.
|
||||
if test "$NIX_NO_SELF_RPATH" != "1"; then
|
||||
export NIX_CROSS_LDFLAGS="-rpath $out/lib -rpath-link $out/lib $NIX_CROSS_LDFLAGS"
|
||||
if test -n "$NIX_LIB64_IN_SELF_RPATH"; then
|
||||
export NIX_CROSS_LDFLAGS="-rpath $out/lib64 -rpath-link $out/lib $NIX_CROSS_LDFLAGS"
|
||||
fi
|
||||
fi
|
||||
|
||||
export CC=${crossConfig}-gcc
|
||||
export CXX=${crossConfig}-g++
|
||||
@@ -1,24 +0,0 @@
|
||||
skip () {
|
||||
if test "$NIX_DEBUG" = "1"; then
|
||||
echo "skipping impure path $1" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Checks whether a path is impure. E.g., `/lib/foo.so' is impure, but
|
||||
# `/nix/store/.../lib/foo.so' isn't.
|
||||
badPath() {
|
||||
local p=$1
|
||||
|
||||
# Relative paths are okay (since they're presumably relative to
|
||||
# the temporary build directory).
|
||||
if test "${p:0:1}" != "/"; then return 1; fi
|
||||
|
||||
# Otherwise, the path should refer to the store or some temporary
|
||||
# directory (including the build directory).
|
||||
test \
|
||||
"$p" != "/dev/null" -a \
|
||||
"${p:0:${#NIX_STORE}}" != "$NIX_STORE" -a \
|
||||
"${p:0:4}" != "/tmp" -a \
|
||||
"${p:0:${#NIX_BUILD_TOP}}" != "$NIX_BUILD_TOP"
|
||||
}
|
||||
@@ -61,7 +61,6 @@ stdenv.mkDerivation {
|
||||
|
||||
crossAttrs = {
|
||||
shell = shell.crossDrv + shell.crossDrv.shellPath;
|
||||
libc = stdenv.ccCross.libc;
|
||||
coreutils = coreutils.crossDrv;
|
||||
binutils = binutils.crossDrv;
|
||||
gcc = gcc.crossDrv;
|
||||
|
||||
Reference in New Issue
Block a user