diff --git a/pkgs/build-support/gcc-wrapper/builder.sh b/pkgs/build-support/gcc-wrapper/builder.sh index d3b1f433559..92d187ab84d 100755 --- a/pkgs/build-support/gcc-wrapper/builder.sh +++ b/pkgs/build-support/gcc-wrapper/builder.sh @@ -57,6 +57,7 @@ test -z "$isNative" && echo $glibc > $out/nix-support/orig-glibc sed \ -e "s^@isNative@^$isNative^g" \ + -e "s^@enforcePurity@^$enforcePurity^g" \ -e "s^@gcc@^$gcc^g" \ -e "s^@glibc@^$glibc^g" \ < $setupHook > $out/nix-support/setup-hook diff --git a/pkgs/build-support/gcc-wrapper/default.nix b/pkgs/build-support/gcc-wrapper/default.nix index da189661164..11282e131da 100644 --- a/pkgs/build-support/gcc-wrapper/default.nix +++ b/pkgs/build-support/gcc-wrapper/default.nix @@ -17,6 +17,7 @@ derivation { gccWrapper = ./gcc-wrapper.sh; ldWrapper = ./ld-wrapper.sh; inherit name stdenv isNative gcc glibc binutils; + enforcePurity = if isNative then false else gcc.noSysDirs; langC = if isNative then true else gcc.langC; langCC = if isNative then true else gcc.langCC; langF77 = if isNative then false else gcc.langF77; diff --git a/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh b/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh index 59f38086f32..6cb3493f6bf 100644 --- a/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh +++ b/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh @@ -10,6 +10,7 @@ if test -z "$NIX_GLIBC_FLAGS_SET"; then NIX_LDFLAGS="@ldflags@ $NIX_LDFLAGS" fi + # Figure out if linker flags should be passed. GCC prints annoying # warnings when they are not needed. dontLink=0 @@ -33,6 +34,40 @@ else done 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. extra=($NIX_CFLAGS_COMPILE) @@ -58,7 +93,7 @@ fi # Optionally print debug info. if test "$NIX_DEBUG" = "1"; then echo "original flags to @gcc@:" >&2 - for i in "$@"; do + for i in "${params[@]}"; do echo " $i" >&2 done echo "extra flags to @gcc@:" >&2 @@ -71,4 +106,4 @@ if test -n "$NIX_GCC_WRAPPER_EXEC_HOOK"; then . "$NIX_GCC_WRAPPER_EXEC_HOOK" fi -exec @gcc@ "$@" ${extra[@]} +exec @gcc@ "${params[@]}" ${extra[@]} diff --git a/pkgs/build-support/gcc-wrapper/setup-hook.sh b/pkgs/build-support/gcc-wrapper/setup-hook.sh index a4c52ba803d..07c3b54b473 100644 --- a/pkgs/build-support/gcc-wrapper/setup-hook.sh +++ b/pkgs/build-support/gcc-wrapper/setup-hook.sh @@ -13,3 +13,5 @@ envHooks=(${envHooks[@]} addCVars) if test -z "@isNative@"; then PATH=$PATH:@gcc@/bin:@glibc@/bin fi + +export NIX_ENFORCE_PURITY=@enforcePurity@ diff --git a/pkgs/development/compilers/gcc-new/default.nix b/pkgs/development/compilers/gcc-new/default.nix index 0d44cbe74b0..e2311a26023 100644 --- a/pkgs/development/compilers/gcc-new/default.nix +++ b/pkgs/development/compilers/gcc-new/default.nix @@ -1,19 +1,16 @@ -{ stdenv, fetchurl +{ stdenv, fetchurl, noSysDirs ? true , langC ? true, langCC ? true, langF77 ? false }: assert langC; derivation { - name = "gcc-3.3.2"; + name = "gcc-3.3.3"; system = stdenv.system; builder = ./builder.sh; src = fetchurl { -# url = ftp://ftp.nluug.nl/mirror/languages/gcc/releases/gcc-3.3.3/gcc-3.3.3.tar.bz2; -# md5 = "3c6cfd9fcd180481063b4058cf6faff2"; - url = ftp://ftp.nluug.nl/pub/gnu/gcc/gcc-3.3.2/gcc-3.3.2.tar.bz2; - md5 = "65999f654102f5438ac8562d13a6eced"; + url = ftp://ftp.nluug.nl/mirror/languages/gcc/releases/gcc-3.3.3/gcc-3.3.3.tar.bz2; + md5 = "3c6cfd9fcd180481063b4058cf6faff2"; }; - noSysDirs = stdenv.noSysDirs; - inherit stdenv langC langCC langF77; + inherit stdenv noSysDirs langC langCC langF77; } diff --git a/pkgs/development/libraries/glibc/builder.sh b/pkgs/development/libraries/glibc/builder.sh index 7503e73a171..249ab0872ac 100755 --- a/pkgs/development/libraries/glibc/builder.sh +++ b/pkgs/development/libraries/glibc/builder.sh @@ -15,7 +15,7 @@ LDFLAGS=-Wl,-S ../glibc-*/configure --prefix=$out --enable-add-ons --disable-pro make || 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/bin/* $out/sbin/* $out/libexec/* diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index c163c04cb51..4530a1b1319 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -21,6 +21,11 @@ param5=@param5@ . @preHook@ +if test -f @gcc@/nix-support/setup-hook; then + . @gcc@/nix-support/setup-hook +fi + + # Recursively find all build inputs. findInputs() { @@ -76,6 +81,10 @@ export NIX_STRIP_DEBUG=1 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. . @postHook@ diff --git a/pkgs/system/all-packages.nix b/pkgs/system/all-packages.nix index f1a0c917f71..666d0e67273 100644 --- a/pkgs/system/all-packages.nix +++ b/pkgs/system/all-packages.nix @@ -12,6 +12,6 @@ # Select the right instantiation. body = if system == "i686-linux" - then stdenvs.stdenvLinuxPkgs + then stdenvs.stdenvNativePkgs #stdenvs.stdenvLinuxPkgs else stdenvs.stdenvNixPkgs; } diff --git a/pkgs/system/stdenvs.nix b/pkgs/system/stdenvs.nix index 34804ad55d8..06a9fc50fed 100644 --- a/pkgs/system/stdenvs.nix +++ b/pkgs/system/stdenvs.nix @@ -8,12 +8,19 @@ {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 # tools installed on the system outside of the Nix environment, # i.e., the stuff in /bin, /usr/bin, etc. This environment should # be used with care, since many Nix packages will not build properly # 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;}; diff --git a/pkgs/test/simple/builder.sh b/pkgs/test/simple/builder.sh index c155bdc3615..282fc520bd1 100755 --- a/pkgs/test/simple/builder.sh +++ b/pkgs/test/simple/builder.sh @@ -4,7 +4,7 @@ export NIX_DEBUG=1 . $stdenv/setup -export NIX_CFLAGS_COMPILE="-v $NIX_CFLAGS_COMPILE" +#export NIX_CFLAGS_COMPILE="-v $NIX_CFLAGS_COMPILE" mkdir $out mkdir $out/bin @@ -19,7 +19,8 @@ int main(int argc, char * * argv) } 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