* gcc-wrapper now filters out -L and -I flags referring to paths

outside the store (in pure builds).

svn path=/nixpkgs/trunk/; revision=817
This commit is contained in:
Eelco Dolstra 2004-03-08 18:29:08 +00:00
parent ce50734cf0
commit 946a2d4a48
10 changed files with 68 additions and 15 deletions

View file

@ -57,6 +57,7 @@ test -z "$isNative" && echo $glibc > $out/nix-support/orig-glibc
sed \ sed \
-e "s^@isNative@^$isNative^g" \ -e "s^@isNative@^$isNative^g" \
-e "s^@enforcePurity@^$enforcePurity^g" \
-e "s^@gcc@^$gcc^g" \ -e "s^@gcc@^$gcc^g" \
-e "s^@glibc@^$glibc^g" \ -e "s^@glibc@^$glibc^g" \
< $setupHook > $out/nix-support/setup-hook < $setupHook > $out/nix-support/setup-hook

View file

@ -17,6 +17,7 @@ derivation {
gccWrapper = ./gcc-wrapper.sh; gccWrapper = ./gcc-wrapper.sh;
ldWrapper = ./ld-wrapper.sh; ldWrapper = ./ld-wrapper.sh;
inherit name stdenv isNative gcc glibc binutils; inherit name stdenv isNative gcc glibc binutils;
enforcePurity = if isNative then false else gcc.noSysDirs;
langC = if isNative then true else gcc.langC; langC = if isNative then true else gcc.langC;
langCC = if isNative then true else gcc.langCC; langCC = if isNative then true else gcc.langCC;
langF77 = if isNative then false else gcc.langF77; langF77 = if isNative then false else gcc.langF77;

View file

@ -10,6 +10,7 @@ if test -z "$NIX_GLIBC_FLAGS_SET"; then
NIX_LDFLAGS="@ldflags@ $NIX_LDFLAGS" NIX_LDFLAGS="@ldflags@ $NIX_LDFLAGS"
fi fi
# 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.
dontLink=0 dontLink=0
@ -33,6 +34,40 @@ else
done done
fi fi
# Optionally filter out paths not refering to the store.
skip () {
if test "$NIX_DEBUG" = "1"; then
echo "skipping impure path $1" >&2
fi
}
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/" -a "${p:2:${#NIX_STORE}}" != "$NIX_STORE"; then
skip $p
elif test "$p" = "-L" -a "${p2:0:${#NIX_STORE}}" != "$NIX_STORE"; then
n=$((n + 1)); skip $p2
elif test "${p:0:3}" = "-I/" -a "${p:2:${#NIX_STORE}}" != "$NIX_STORE"; then
skip $p
elif test "$p" = "-I" -a "${p2:0:${#NIX_STORE}}" != "$NIX_STORE"; then
n=$((n + 1)); skip $p2
elif test "$p" = "-isystem" -a "${p2:0:${#NIX_STORE}}" != "$NIX_STORE"; 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. # Add the flags for the C compiler proper.
extra=($NIX_CFLAGS_COMPILE) extra=($NIX_CFLAGS_COMPILE)
@ -58,7 +93,7 @@ fi
# Optionally print debug info. # Optionally print debug info.
if test "$NIX_DEBUG" = "1"; then if test "$NIX_DEBUG" = "1"; then
echo "original flags to @gcc@:" >&2 echo "original flags to @gcc@:" >&2
for i in "$@"; do for i in "${params[@]}"; do
echo " $i" >&2 echo " $i" >&2
done done
echo "extra flags to @gcc@:" >&2 echo "extra flags to @gcc@:" >&2
@ -71,4 +106,4 @@ if test -n "$NIX_GCC_WRAPPER_EXEC_HOOK"; then
. "$NIX_GCC_WRAPPER_EXEC_HOOK" . "$NIX_GCC_WRAPPER_EXEC_HOOK"
fi fi
exec @gcc@ "$@" ${extra[@]} exec @gcc@ "${params[@]}" ${extra[@]}

View file

@ -13,3 +13,5 @@ envHooks=(${envHooks[@]} addCVars)
if test -z "@isNative@"; then if test -z "@isNative@"; then
PATH=$PATH:@gcc@/bin:@glibc@/bin PATH=$PATH:@gcc@/bin:@glibc@/bin
fi fi
export NIX_ENFORCE_PURITY=@enforcePurity@

View file

@ -1,19 +1,16 @@
{ stdenv, fetchurl { stdenv, fetchurl, noSysDirs ? true
, langC ? true, langCC ? true, langF77 ? false , langC ? true, langCC ? true, langF77 ? false
}: }:
assert langC; assert langC;
derivation { derivation {
name = "gcc-3.3.2"; name = "gcc-3.3.3";
system = stdenv.system; system = stdenv.system;
builder = ./builder.sh; builder = ./builder.sh;
src = fetchurl { src = fetchurl {
# url = ftp://ftp.nluug.nl/mirror/languages/gcc/releases/gcc-3.3.3/gcc-3.3.3.tar.bz2; url = ftp://ftp.nluug.nl/mirror/languages/gcc/releases/gcc-3.3.3/gcc-3.3.3.tar.bz2;
# md5 = "3c6cfd9fcd180481063b4058cf6faff2"; md5 = "3c6cfd9fcd180481063b4058cf6faff2";
url = ftp://ftp.nluug.nl/pub/gnu/gcc/gcc-3.3.2/gcc-3.3.2.tar.bz2;
md5 = "65999f654102f5438ac8562d13a6eced";
}; };
noSysDirs = stdenv.noSysDirs; inherit stdenv noSysDirs langC langCC langF77;
inherit stdenv langC langCC langF77;
} }

View file

@ -15,7 +15,7 @@ LDFLAGS=-Wl,-S ../glibc-*/configure --prefix=$out --enable-add-ons --disable-pro
make || exit 1 make || exit 1
make install || exit 1 make install || exit 1
make localedata/install-locales || exit 1 #make localedata/install-locales || exit 1
strip -S $out/lib/*.a $out/lib/*.so $out/lib/gconv/*.so strip -S $out/lib/*.a $out/lib/*.so $out/lib/gconv/*.so
strip -s $out/bin/* $out/sbin/* $out/libexec/* strip -s $out/bin/* $out/sbin/* $out/libexec/*

View file

@ -21,6 +21,11 @@ param5=@param5@
. @preHook@ . @preHook@
if test -f @gcc@/nix-support/setup-hook; then
. @gcc@/nix-support/setup-hook
fi
# Recursively find all build inputs. # Recursively find all build inputs.
findInputs() findInputs()
{ {
@ -76,6 +81,10 @@ export NIX_STRIP_DEBUG=1
export NIX_CFLAGS_STRIP="-g0 -Wl,-s" export NIX_CFLAGS_STRIP="-g0 -Wl,-s"
# Where is the store? This is required for purity checking.
export NIX_STORE=$(dirname $out)/ # !!! hack
# Execute the post-hook. # Execute the post-hook.
. @postHook@ . @postHook@

View file

@ -12,6 +12,6 @@
# Select the right instantiation. # Select the right instantiation.
body = body =
if system == "i686-linux" if system == "i686-linux"
then stdenvs.stdenvLinuxPkgs then stdenvs.stdenvNativePkgs #stdenvs.stdenvLinuxPkgs
else stdenvs.stdenvNixPkgs; else stdenvs.stdenvNixPkgs;
} }

View file

@ -8,12 +8,19 @@
{system, allPackages}: rec { {system, allPackages}: rec {
# Trivial environment used for building other environments.
stdenvInitial = (import ../stdenv/initial) {
name = "stdenv-initial";
inherit system;
};
# The native (i.e., impure) build environment. This one uses the # The native (i.e., impure) build environment. This one uses the
# tools installed on the system outside of the Nix environment, # tools installed on the system outside of the Nix environment,
# i.e., the stuff in /bin, /usr/bin, etc. This environment should # i.e., the stuff in /bin, /usr/bin, etc. This environment should
# be used with care, since many Nix packages will not build properly # be used with care, since many Nix packages will not build properly
# with it (e.g., because they require GNU Make). # with it (e.g., because they require GNU Make).
stdenvNative = (import ../stdenv/native) {system = system;}; stdenvNative = (import ../stdenv/native) {stdenv = stdenvInitial;};
stdenvNativePkgs = allPackages {system = system; stdenv = stdenvNative;}; stdenvNativePkgs = allPackages {system = system; stdenv = stdenvNative;};

View file

@ -4,7 +4,7 @@ export NIX_DEBUG=1
. $stdenv/setup . $stdenv/setup
export NIX_CFLAGS_COMPILE="-v $NIX_CFLAGS_COMPILE" #export NIX_CFLAGS_COMPILE="-v $NIX_CFLAGS_COMPILE"
mkdir $out mkdir $out
mkdir $out/bin mkdir $out/bin
@ -19,7 +19,8 @@ int main(int argc, char * * argv)
} }
EOF EOF
gcc hello.c -o $out/bin/hello #gcc -I/nix/store/foo -I /nix/store/foo -I/usr/lib -I /usr/lib hello.c -o $out/bin/hello
gcc -L /nix/store/abcd/lib -isystem /usr/lib hello.c -o $out/bin/hello
$out/bin/hello $out/bin/hello