Improved support for building 32-bit binaries on x86_64-linux.

* glibc_multi: a wrapper that combines the 32-bit and 64-bit Glibcs.
  This is necessary so that 64-bit GCC can find gnu/stubs-32.h and the
  32-bit Glibc libraries.

  To build glibc_multi on x86_64-linux, you still need either the
  i686-linux Glibc derivation from a channel, or to have configured
  Nix with support for forwarding the build to a i686-linux machine.
  In the future this may become unnecessary by providing a prebuilt
  binary of 32-bit Glibc somewhere (like the binaries used in the
  stdenvLinux bootstrap).

* With glibc_multi, it becomes possible to build gcc with multilib
  support (i.e. it builds 32-bit and 64-bit versions of libgcc,
  libstdc++, etc.).

svn path=/nixpkgs/trunk/; revision=12203
This commit is contained in:
Eelco Dolstra 2008-06-27 18:26:19 +00:00
parent f960020e95
commit 48ac8018ca
2 changed files with 36 additions and 6 deletions

View File

@ -5,6 +5,7 @@
, texinfo ? null , texinfo ? null
, gmp, mpfr , gmp, mpfr
, bison ? null, flex ? null , bison ? null, flex ? null
, enableMultilib ? false
}: }:
assert langC; assert langC;
@ -43,6 +44,7 @@ stdenv.mkDerivation {
++ optionals langTreelang [bison flex]; ++ optionals langTreelang [bison flex];
configureFlags = " configureFlags = "
${if enableMultilib then "" else "--disable-multilib"}
--disable-libstdcxx-pch --disable-libstdcxx-pch
--with-system-zlib --with-system-zlib
--enable-languages=${ --enable-languages=${
@ -60,8 +62,8 @@ stdenv.mkDerivation {
NIX_EXTRA_LDFLAGS = if staticCompiler then "-static" else ""; NIX_EXTRA_LDFLAGS = if staticCompiler then "-static" else "";
inherit gmp mpfr; inherit gmp mpfr;
passthru = { inherit langC langCC langFortran langTreelang; }; passthru = { inherit langC langCC langFortran langTreelang enableMultilib; };
meta = { meta = {
homepage = "http://gcc.gnu.org/"; homepage = "http://gcc.gnu.org/";

View File

@ -1333,10 +1333,16 @@ let pkgs = rec {
profiledCompiler = true; profiledCompiler = true;
})); }));
gcc43 = lowPrio (wrapGCCWith (import ../build-support/gcc-wrapper-new) (import ../development/compilers/gcc-4.3 { gcc43 = lowPrio (wrapGCCWith (import ../build-support/gcc-wrapper-new) glibc (import ../development/compilers/gcc-4.3 {
inherit fetchurl stdenv texinfo gmp mpfr noSysDirs; inherit fetchurl stdenv texinfo gmp mpfr noSysDirs;
profiledCompiler = false; profiledCompiler = false;
#langFortran = true; }));
gcc43multi = lowPrio (wrapGCCWith (import ../build-support/gcc-wrapper-new) glibc_multi (import ../development/compilers/gcc-4.3 {
stdenv = overrideGCC stdenv (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi gcc42);
inherit fetchurl texinfo gmp mpfr noSysDirs;
profiledCompiler = false;
enableMultilib = true;
})); }));
gccApple = wrapGCC (import ../development/compilers/gcc-apple { gccApple = wrapGCC (import ../development/compilers/gcc-apple {
@ -1748,7 +1754,7 @@ let pkgs = rec {
inherit fetchurl stdenv visualcpp windowssdk; inherit fetchurl stdenv visualcpp windowssdk;
}; };
wrapGCCWith = gccWrapper: baseGCC: gccWrapper { wrapGCCWith = gccWrapper: glibc: baseGCC: gccWrapper {
nativeTools = stdenv ? gcc && stdenv.gcc.nativeTools; nativeTools = stdenv ? gcc && stdenv.gcc.nativeTools;
nativeLibc = stdenv ? gcc && stdenv.gcc.nativeLibc; nativeLibc = stdenv ? gcc && stdenv.gcc.nativeLibc;
nativePrefix = if stdenv ? gcc then stdenv.gcc.nativePrefix else ""; nativePrefix = if stdenv ? gcc then stdenv.gcc.nativePrefix else "";
@ -1757,7 +1763,7 @@ let pkgs = rec {
inherit stdenv binutils; inherit stdenv binutils;
}; };
wrapGCC = wrapGCCWith (import ../build-support/gcc-wrapper); wrapGCC = wrapGCCWith (import ../build-support/gcc-wrapper) glibc;
# FIXME: This is a specific hack for GCC-UPC. Eventually, we may # FIXME: This is a specific hack for GCC-UPC. Eventually, we may
# want to merge `gcc-upc-wrapper' and `gcc-wrapper'. # want to merge `gcc-upc-wrapper' and `gcc-wrapper'.
@ -2591,6 +2597,28 @@ let pkgs = rec {
#installLocales = false; #installLocales = false;
}); });
glibc_multi =
assert system == "x86_64-linux";
runCommand "${glibc.name}-multi"
{ glibc64 = glibc;
glibc32 = (import ./all-packages.nix {system = "i686-linux";}).glibc;
}
''
ensureDir $out
ln -s $glibc64/* $out/
rm $out/lib $out/lib64
ensureDir $out/lib
ln -s $glibc64/lib/* $out/lib
ln -s $glibc32/lib $out/lib/32
ln -s lib $out/lib64
rm $out/include
cp -rs $glibc32/include $out
chmod -R u+w $out/include
cp -rsf $glibc64/include $out
''; # */
gmime = import ../development/libraries/gmime { gmime = import ../development/libraries/gmime {
inherit fetchurl stdenv pkgconfig zlib; inherit fetchurl stdenv pkgconfig zlib;
inherit (gtkLibs) glib; inherit (gtkLibs) glib;