After many broken builds I've managed to get a working mostly-minimal
Nixos build using the new Gold ld linker where possible.  The changes
are attached.

Some packages still use the original GNU ld linker, either due to bugs
or limitations in the current Gold version (although I did fix one so
that GHC would build) or some deep dependency on how ld works.  For
Nixos in particular the current patchelf (0.5) fails with a floating
point exception on anything linked by Gold.

Many of the package level changes are due to Gold being more strict in
ensuring that all symbols can be found at link time.  In most cases
I've simply added an LDFLAGS = ... entry in the derivation.  I believe
this will be harmless with GNU ld so there's no stdenv entry
indicating that Gold is enabled.

If a hydra branch of nixpkgs was created I'd be happy to (slowly) fix
packages till there's a stable build.  In the mean time I'd like to be
able to use Nixos without multi-day compile delays  ;-)

cheers
Rohan
Index: development/tools/misc/binutils/default.nix
===================================================================
--- development/tools/misc/binutils/default.nix	(revision 20587)
+++ development/tools/misc/binutils/default.nix	(working copy)
@@ -1,10 +1,13 @@
-{stdenv, fetchurl, noSysDirs, cross ? null}:
+{stdenv, fetchurl, noSysDirs, cross ? null, enableGold ? false, bison ? null}:
 
+assert enableGold -> bison != null;
+
 let
     basename = "binutils-2.20";
 in
 stdenv.mkDerivation rec {
-  name = basename + stdenv.lib.optionalString (cross != null) "-${cross.config}";
+  name = basename + stdenv.lib.optionalString (cross != null) "-${cross.config}"
+       	 	  + stdenv.lib.optionalString enableGold "-gold";
 
   src = fetchurl {
     url = "mirror://gnu/binutils/${basename}.tar.bz2";
@@ -18,10 +21,15 @@
     ./new-dtags.patch
 
     ./as-pr10856.patch
+
+    # allow paths INPUT to be relative to the current working directory
+    ./gold-input-path.patch
   ];
 
   inherit noSysDirs;
 
+  buildInputs = stdenv.lib.optional enableGold bison;
+
   preConfigure = ''
     # Clear the default library search path.
     if test "$noSysDirs" = "1"; then
@@ -36,7 +44,8 @@
   '';
 
   configureFlags = "--disable-werror" # needed for dietlibc build
-      + stdenv.lib.optionalString (cross != null) " --target=${cross.config}";
+      + stdenv.lib.optionalString (cross != null) " --target=${cross.config}"
+      + stdenv.lib.optionalString enableGold " --enable-gold";
 
   meta = {
     description = "GNU Binutils, tools for manipulating binaries (linker, assembler, etc.)";
Index: development/tools/misc/binutils/gold-input-path.patch
===================================================================
--- development/tools/misc/binutils/gold-input-path.patch	(revision 0)
+++ development/tools/misc/binutils/gold-input-path.patch	(revision 0)
@@ -0,0 +1,21 @@
+Fix a bug in Gold ld:
+http://sourceware.org/bugzilla/show_bug.cgi?id=11182
+
+Gold can't find INPUT files with fully specified paths
+
+--- a/gold/script.cc	2010/01/20 22:36:09 +1300
++++ b/gold/script.cc	2010/01/20 22:36:09 +1300
+@@ -2182,6 +2182,13 @@
+ 	}
+     }
+ 
++  // remove any path in file name
++  size_t path_part = name_string.find_last_of('/');
++  if (path_part != length)
++    {
++      name_string = name_string.substr(path_part + 1);
++    }
++
+   Input_file_argument file(name_string.c_str(),
+ 			   Input_file_argument::INPUT_FILE_TYPE_FILE,
+ 			   extra_search_path, false,
Index: development/libraries/libgcrypt/default.nix
===================================================================
--- development/libraries/libgcrypt/default.nix	(revision 20587)
+++ development/libraries/libgcrypt/default.nix	(working copy)
@@ -12,6 +12,8 @@
 
   doCheck = true;
 
+  LDFLAGS = "-lgpg-error";
+
   # For some reason the tests don't find `libgpg-error.so'.
   checkPhase = ''
     LD_LIBRARY_PATH="${libgpgerror}/lib:$LD_LIBRARY_PATH" \
Index: development/libraries/libdrm/default.nix
===================================================================
--- development/libraries/libdrm/default.nix	(revision 20587)
+++ development/libraries/libdrm/default.nix	(working copy)
@@ -10,6 +10,8 @@
 
   buildInputs = [ pkgconfig libpthreadstubs ];
 
+  LDFLAGS = "-lrt";
+
   preConfigure = ''
     # General case: non intel.
     if test -n "$crossConfig"; then
Index: development/libraries/libedit/default.nix
===================================================================
--- development/libraries/libedit/default.nix	(revision 20587)
+++ development/libraries/libedit/default.nix	(working copy)
@@ -10,6 +10,10 @@
 
   propagatedBuildInputs = [ ncurses ];
 
+  # gold doesn't support 'INPUT( -llibrary )' syntax
+  # so hack in the correct library name
+  preConfigure = "sed -i 's/-lncurses/-lncursesw/g' configure";
+
   meta = {
     homepage = "http://www.thrysoee.dk/editline/";;
     description = "A port of the NetBSD Editline library (libedit)";
Index: development/libraries/imlib2/default.nix
===================================================================
--- development/libraries/imlib2/default.nix	(revision 20587)
+++ development/libraries/imlib2/default.nix	(working copy)
@@ -7,4 +7,5 @@
     sha256 = "1lrg7haqhmzpdb14cgp9vny5fanlwlyhf5n017v130in297gv1qj";
   };
   buildInputs = [x11 libjpeg libtiff libungif libpng bzip2];
+  LDFLAGS = "-lX11 -lm";
 }
Index: development/compilers/ghc/6.10.4.nix
===================================================================
--- development/compilers/ghc/6.10.4.nix	(revision 20587)
+++ development/compilers/ghc/6.10.4.nix	(working copy)
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, libedit, ghc, perl, gmp, ncurses}:
+{stdenv, fetchurl, gcc, libedit, ghc, perl, gmp, ncurses}:
 
 stdenv.mkDerivation rec {
   version = "6.10.4";
@@ -14,2 +14,2 @@
 
   buildInputs = [ghc libedit perl gmp];

+  LDFLAGS="-lpthread";
+
   configureFlags=[
     "--with-gmp-libraries=${gmp}/lib"
     "--with-gmp-includes=${gmp}/include"
-    "--with-gcc=${stdenv.gcc}/bin/gcc"
+    "--with-gcc=${gcc}/bin/gcc"
   ];
 
   meta = {
Index: applications/misc/xterm/default.nix
===================================================================
--- applications/misc/xterm/default.nix	(revision 20587)
+++ applications/misc/xterm/default.nix	(working copy)
@@ -12,6 +12,8 @@
     --enable-load-vt-fonts --enable-i18n --enable-doublechars --enable-luit
     --enable-mini-luit";
 
+  LDFLAGS = "-lncursesw";
+
   meta = {
     homepage = http://invisible-island.net/xterm;
   };
Index: tools/networking/ssmtp/default.nix
===================================================================
--- tools/networking/ssmtp/default.nix	(revision 20587)
+++ tools/networking/ssmtp/default.nix	(working copy)
@@ -15,6 +15,9 @@
      })
   ];
   configureFlags = "${if tlsSupport then "--enable-ssl" else ""}";
+  
+  CFLAGS = stdenv.lib.optional tlsSupport "-lcrypto";
+
   postConfigure = "
     sed -e '/INSTALLED_CONFIGURATION_FILE/d' \\
         -e 's|\\(DSSMTPCONFDIR.*\\).(.*)\\(.*$\\)|\\1/etc/ssmtp\\2|' \\
Index: stdenv/linux/default.nix
===================================================================
--- stdenv/linux/default.nix	(revision 20587)
+++ stdenv/linux/default.nix	(working copy)
@@ -189,7 +189,7 @@
   #    bootstrap tools.
   stdenvLinuxBoot3 = stdenvBootFun {
     gcc = wrapGCC rec {
-      inherit (stdenvLinuxBoot2Pkgs) binutils;
+      binutils = stdenvLinuxBoot2Pkgs.binutilsOld;  # glibc doesn't like gold ld
       coreutils = bootstrapTools;
       libc = stdenvLinuxGlibc;
       gcc = stdenvLinuxBoot2Pkgs.gcc.gcc;
Index: os-specific/linux/hal/default.nix
===================================================================
--- os-specific/linux/hal/default.nix	(revision 20587)
+++ os-specific/linux/hal/default.nix	(working copy)
@@ -28,6 +28,8 @@
     --enable-umount-helper
   '';
 
+  LDFLAGS = "-ldbus-1";
+
   propagatedBuildInputs = [ libusb ]
     ++ stdenv.lib.optionals (stdenv.system != "armv5tel-linux") [ libsmbios ];
 
Index: os-specific/linux/pwdutils/default.nix
===================================================================
--- os-specific/linux/pwdutils/default.nix	(revision 20587)
+++ os-specific/linux/pwdutils/default.nix	(working copy)
@@ -10,5 +10,7 @@
 
   buildInputs = [pam openssl libnscd];
 
+  LDFLAGS = "-lcrypto";
+
   configureFlags = "--disable-ldap";
 }
Index: top-level/all-packages.nix
===================================================================
--- top-level/all-packages.nix	(revision 20588)
+++ top-level/all-packages.nix	(working copy)
@@ -646,7 +646,8 @@
   };
 
   e2fsprogs = import ../tools/filesystems/e2fsprogs {
-    inherit fetchurl stdenv pkgconfig libuuid;
+    inherit fetchurl pkgconfig libuuid;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   ecryptfs = import ../tools/security/ecryptfs {
@@ -857,7 +858,7 @@
 
   grub = import ../tools/misc/grub {
     inherit fetchurl autoconf automake;
-    stdenv = stdenv_32bit;
+    stdenv = overrideGCC stdenv_32bit gccOld;
     buggyBiosCDSupport = (getConfig ["grub" "buggyBiosCDSupport"] true);
   };
 
@@ -1423,11 +1424,13 @@
   };
 
   reiser4progs = import ../tools/filesystems/reiser4progs {
-    inherit fetchurl stdenv libaal;
+    inherit fetchurl libaal;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   reiserfsprogs = import ../tools/filesystems/reiserfsprogs {
-    inherit fetchurl stdenv;
+    inherit fetchurl;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   relfs = composedArgsAndFun (import ../tools/filesystems/relfs) {
@@ -1918,6 +1921,10 @@
 
   gcc = gcc44;
 
+  gccOld = wrapGCCWith (import ../build-support/gcc-wrapper) glibc binutilsOld (gcc.gcc.override {
+      texinfo = null;
+  });
+
   gcc295 = wrapGCC (import ../development/compilers/gcc-2.95 {
     inherit fetchurl stdenv noSysDirs;
   });
@@ -2002,17 +2009,19 @@
     cross = assert crossSystem != null; crossSystem;
   };
 
-  gcc43_multi = lowPrio (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi (gcc43.gcc.override {
-    stdenv = overrideGCC stdenv (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi gcc);
+  gcc43_multi = lowPrio (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi binutils (gcc43.gcc.override {
+    stdenv = overrideGCC stdenv (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi binutils gcc);
     profiledCompiler = false;
     enableMultilib = true;
   }));
 
-  gcc44_real = lowPrio (wrapGCC (makeOverridable (import ../development/compilers/gcc-4.4) {
+  gcc44_real = lowPrio (wrapGCC gcc44_real_base);
+
+  gcc44_real_base = lowPrio (makeOverridable (import ../development/compilers/gcc-4.4) {
     inherit fetchurl stdenv texinfo gmp mpfr /* ppl cloogppl */
       gettext which noSysDirs;
     profiledCompiler = true;
-  }));
+  });
 
   gccApple =
     wrapGCC ( (if stdenv.system == "i686-darwin" then import ../development/compilers/gcc-apple else import ../development/compilers/gcc-apple64) {
@@ -2229,8 +2238,8 @@
   haskellPackages_ghc6104 = recurseIntoAttrs (import ./haskell-packages.nix {
     inherit pkgs;
     ghc = import ../development/compilers/ghc/6.10.4.nix {
-      inherit fetchurl stdenv perl ncurses gmp libedit;
+      inherit stdenv fetchurl gcc perl ncurses gmp libedit;
       ghc = ghc6101Binary;
     };
   });
 
@@ -2451,16 +2462,17 @@
     inherit fetchurl stdenv visualcpp windowssdk;
   };
 
-  wrapGCCWith = gccWrapper: glibc: baseGCC: gccWrapper {
+  wrapGCCWith = gccWrapper: glibc: baseBinutils: baseGCC: gccWrapper {
     nativeTools = stdenv ? gcc && stdenv.gcc.nativeTools;
     nativeLibc = stdenv ? gcc && stdenv.gcc.nativeLibc;
     nativePrefix = if stdenv ? gcc then stdenv.gcc.nativePrefix else "";
     gcc = baseGCC;
     libc = glibc;
-    inherit stdenv binutils coreutils zlib;
+    binutils = baseBinutils;
+    inherit stdenv coreutils zlib;
   };
 
-  wrapGCC = wrapGCCWith (import ../build-support/gcc-wrapper) glibc;
+  wrapGCC = wrapGCCWith (makeOverridable (import ../build-support/gcc-wrapper)) glibc binutils;
 
   wrapGCCCross =
     {gcc, libc, binutils, cross, shell ? "", name ? "gcc-cross-wrapper"}:
@@ -2862,6 +2874,11 @@
 
   binutils = useFromStdenv "binutils"
     (import ../development/tools/misc/binutils {
+      inherit fetchurl stdenv bison noSysDirs;
+      enableGold = true;
+    });
+
+  binutilsOld = (import ../development/tools/misc/binutils {
       inherit fetchurl stdenv noSysDirs;
     });
 
@@ -3128,7 +3145,7 @@
 
   patchelf = useFromStdenv "patchelf"
     (import ../development/tools/misc/patchelf {
-      inherit fetchurl stdenv;
+      inherit stdenv fetchurl;
     });
 
   pmccabe = import ../development/tools/misc/pmccabe {
@@ -3217,7 +3235,8 @@
   };
 
   texinfo = makeOverridable (import ../development/tools/misc/texinfo) {
-    inherit fetchurl stdenv ncurses lzma;
+    inherit fetchurl ncurses lzma;
+    stdenv = overrideGCC stdenv gccOld;
   };
 
   texi2html = import ../development/tools/misc/texi2html {
@@ -3766,11 +3786,13 @@
   };
 
   glibcLocales = makeOverridable (import ../development/libraries/glibc-2.11/locales.nix) {
-    inherit fetchurl stdenv;
+    inherit fetchurl;
+    stdenv = overrideGCC stdenv gccOld;
   };
 
   glibcInfo = import ../development/libraries/glibc-2.11/info.nix {
-    inherit fetchurl stdenv texinfo perl;
+    inherit fetchurl texinfo perl;
+    stdenv = overrideGCC stdenv gccOld;
   };
 
   glibc_multi =
@@ -5964,7 +5986,8 @@
   };
 
   linux_2_6_32 = makeOverridable (import ../os-specific/linux/kernel/linux-2.6.32.nix) {
-    inherit fetchurl stdenv perl mktemp module_init_tools ubootChooser;
+    inherit fetchurl perl mktemp module_init_tools ubootChooser;
+    stdenv = overrideGCC stdenv gccOld;
     kernelPatches =
       [ kernelPatches.fbcondecor_2_6_31
         kernelPatches.sec_perm_2_6_24
@@ -5989,6 +6012,6 @@
 
   linux_2_6_33 = makeOverridable (import ../os-specific/linux/kernel/linux-2.6.33.nix) {
     inherit fetchurl stdenv perl mktemp module_init_tools ubootChooser;
     kernelPatches =
       [ kernelPatches.fbcondecor_2_6_33
         kernelPatches.sec_perm_2_6_24
@@ -6166,7 +6190,8 @@
   };
 
   klibc = makeOverridable (import ../os-specific/linux/klibc) {
-    inherit fetchurl stdenv perl bison mktemp;
+    inherit fetchurl perl bison mktemp;
+    stdenv = overrideGCC stdenv gccOld;
     linuxHeaders = glibc.kernelHeaders;
   };
 
@@ -6199,7 +6224,8 @@
   };
 
   libcap = import ../os-specific/linux/libcap {
-    inherit fetchurl stdenv attr;
+    inherit fetchurl attr;
+    stdenv = overrideGCC stdenv gccOld;
   };
 
   libnscd = import ../os-specific/linux/libnscd {
@@ -6216,11 +6242,13 @@
   };
 
   lvm2 = import ../os-specific/linux/lvm2 {
-    inherit fetchurl stdenv;
+    inherit fetchurl;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   mdadm = import ../os-specific/linux/mdadm {
-    inherit fetchurl stdenv groff;
+    inherit fetchurl groff;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   mingetty = import ../os-specific/linux/mingetty {
@@ -6228,7 +6256,8 @@
   };
 
   module_init_tools = import ../os-specific/linux/module-init-tools {
-    inherit fetchurl stdenv;
+    inherit fetchurl;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   mount_cifs = import ../os-specific/linux/mount-cifs {
@@ -6320,7 +6349,8 @@
   };
 
   procps = import ../os-specific/linux/procps {
-    inherit fetchurl stdenv ncurses;
+    inherit fetchurl ncurses;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   pwdutils = import ../os-specific/linux/pwdutils {
@@ -6431,7 +6461,8 @@
   };
 
   udev = makeOverridable (import ../os-specific/linux/udev) {
-    inherit fetchurl stdenv gperf pkgconfig acl libusb usbutils pciutils glib;
+    inherit fetchurl gperf pkgconfig acl libusb usbutils pciutils glib;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   uml = import ../os-specific/linux/kernel/linux-2.6.29.nix {
@@ -6461,7 +6492,8 @@
   utillinuxCurses = utillinuxngCurses;
 
   utillinuxng = makeOverridable (import ../os-specific/linux/util-linux-ng) {
-    inherit fetchurl stdenv;
+    inherit fetchurl;
+    stdenv = overrideGCC stdenv gccOld;  # patchelf doesn't like gold ld
   };
 
   utillinuxngCurses = utillinuxng.override {
_______________________________________________
nix-dev mailing list
[email protected]
https://mail.cs.uu.nl/mailman/listinfo/nix-dev

Reply via email to