summary refs log tree commit diff
path: root/pkgs/development/libraries/glibc/default.nix
blob: 066874973aaf7bc257a64796296b5573b2fc5aab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
{ stdenv, fetchurl, fetchgit ? null, kernelHeaders
, machHeaders ? null, hurdHeaders ? null, libpthreadHeaders ? null
, mig ? null
, installLocales ? true
, profilingLibraries ? false
, gccCross ? null
, debugSymbols ? false
, withGd ? false, gd ? null, libpng ? null
}:

assert stdenv.cc.cc.isGNU or false;

let
  build = import ./common.nix;
  cross = if gccCross != null then gccCross.target else null;
in
  build cross ({
    name = "glibc"
      + stdenv.lib.optionalString (hurdHeaders != null) "-hurd"
      + stdenv.lib.optionalString debugSymbols "-debug"
      + stdenv.lib.optionalString withGd "-gd";

    inherit fetchurl fetchgit stdenv kernelHeaders installLocales
      profilingLibraries gccCross withGd gd libpng;

    builder = ./builder.sh;

    # When building glibc from bootstrap-tools, we need libgcc_s at RPATH for
    # any program we run, because the gcc will have been placed at a new
    # store path than that determined when built (as a source for the
    # bootstrap-tools tarball)
    # Building from a proper gcc staying in the path where it was installed,
    # libgcc_s will not be at {gcc}/lib, and gcc's libgcc will be found without
    # any special hack.
    preInstall = if cross != null then "" else ''
      if [ -f ${stdenv.cc.cc}/lib/libgcc_s.so.1 ]; then
          mkdir -p $out/lib
          cp ${stdenv.cc.cc}/lib/libgcc_s.so.1 $out/lib/libgcc_s.so.1
          # the .so It used to be a symlink, but now it is a script
          cp -a ${stdenv.cc.cc}/lib/libgcc_s.so $out/lib/libgcc_s.so
      fi
    '';

    meta.description = "The GNU C Library";
  }

  //

  (if debugSymbols
   then {
     # Build with debugging symbols, but leave optimizations on and don't
     # attempt to keep the build tree.
     dontStrip = true;
     dontCrossStrip = true;
     NIX_STRIP_DEBUG = 0;
   }
   else {})

  //

  (if hurdHeaders != null
   then rec {
     inherit machHeaders hurdHeaders libpthreadHeaders mig fetchgit;

     propagatedBuildInputs = [ machHeaders hurdHeaders libpthreadHeaders ];

     passthru = {
       # When building GCC itself `propagatedBuildInputs' above is not
       # honored, so we pass it here so that the GCC builder can do the right
       # thing.
       inherit propagatedBuildInputs;
     };
   }
   else { })

  //

  (if cross != null
   then {
      preConfigure = ''
        sed -i s/-lgcc_eh//g "../$sourceRoot/Makeconfig"

        cat > config.cache << "EOF"
        libc_cv_forced_unwind=yes
        libc_cv_c_cleanup=yes
        libc_cv_gnu89_inline=yes
        # Only due to a problem in gcc configure scripts:
        libc_cv_sparc64_tls=${if cross.withTLS then "yes" else "no"}
        EOF
        export BUILD_CC=gcc
        export CC="$crossConfig-gcc"
        export AR="$crossConfig-ar"
        export RANLIB="$crossConfig-ranlib"

        dontStrip=1
      '';

      # To avoid a dependency on the build system 'bash'.
      preFixup = ''
        rm $bin/bin/{ldd,tzselect,catchsegv,xtrace}
      '';
    }
   else {}))