2012-09-18 16:38:43 +00:00
|
|
|
/* Build configuration used to build glibc, Info files, and locale
|
|
|
|
information. */
|
|
|
|
|
2017-09-21 00:27:43 +00:00
|
|
|
{ stdenv, lib
|
2017-05-18 10:55:08 +00:00
|
|
|
, buildPlatform, hostPlatform
|
|
|
|
, buildPackages
|
2017-09-21 00:27:43 +00:00
|
|
|
, fetchurl
|
|
|
|
, linuxHeaders ? null
|
|
|
|
, gd ? null, libpng ? null
|
2017-05-18 10:55:08 +00:00
|
|
|
}:
|
|
|
|
|
|
|
|
{ name
|
|
|
|
, withLinuxHeaders ? false
|
|
|
|
, profilingLibraries ? false
|
|
|
|
, installLocales ? false
|
|
|
|
, withGd ? false
|
|
|
|
, meta
|
2017-04-26 03:55:03 +00:00
|
|
|
, ...
|
|
|
|
} @ args:
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
let
|
2017-08-26 09:35:11 +00:00
|
|
|
version = "2.26";
|
2018-01-14 19:39:49 +00:00
|
|
|
patchSuffix = "-131";
|
2017-08-26 09:35:11 +00:00
|
|
|
sha256 = "1ggnj1hzjym7sn93rbwydcqd562q73lsb7g7kd199g6j9j9hlkp5";
|
2017-05-18 10:55:08 +00:00
|
|
|
cross = if buildPlatform != hostPlatform then hostPlatform else null;
|
2012-09-18 16:38:43 +00:00
|
|
|
in
|
|
|
|
|
2017-05-18 10:55:08 +00:00
|
|
|
assert withLinuxHeaders -> linuxHeaders != null;
|
|
|
|
assert withGd -> gd != null && libpng != null;
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
stdenv.mkDerivation ({
|
2017-05-18 10:55:08 +00:00
|
|
|
inherit installLocales;
|
|
|
|
linuxHeaders = if withLinuxHeaders then linuxHeaders else null;
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
# The host/target system.
|
|
|
|
crossConfig = if cross != null then cross.config else null;
|
|
|
|
|
|
|
|
inherit (stdenv) is64bit;
|
|
|
|
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
|
2016-02-18 20:11:15 +00:00
|
|
|
patches =
|
2017-09-02 14:49:43 +00:00
|
|
|
[
|
|
|
|
/* No tarballs for stable upstream branch, only https://sourceware.org/git/?p=glibc.git
|
|
|
|
$ git co release/2.25/master; git describe
|
|
|
|
glibc-2.25-49-gbc5ace67fe
|
|
|
|
$ git show --reverse glibc-2.25..release/2.25/master | gzip -n -9 --rsyncable - > 2.25-49.patch.gz
|
|
|
|
*/
|
2017-08-26 09:35:11 +00:00
|
|
|
./2.26-75.patch.gz
|
2017-12-20 13:56:31 +00:00
|
|
|
./2.26-75to115.diff.gz
|
2018-01-14 19:39:49 +00:00
|
|
|
# contains fix for CVE-2018-1000001 as the last commit:
|
|
|
|
# https://sourceware.org/git/?p=glibc.git;a=commit;h=fabef2edbc
|
|
|
|
./2.26-115to131.diff.gz
|
2017-09-02 14:49:43 +00:00
|
|
|
|
|
|
|
/* Have rpcgen(1) look for cpp(1) in $PATH. */
|
2013-04-03 09:27:12 +00:00
|
|
|
./rpcgen-path.patch
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
/* Allow NixOS and Nix to handle the locale-archive. */
|
|
|
|
./nix-locale-archive.patch
|
|
|
|
|
2013-03-29 21:04:25 +00:00
|
|
|
/* Don't use /etc/ld.so.cache, for non-NixOS systems. */
|
2012-09-18 16:38:43 +00:00
|
|
|
./dont-use-system-ld-so-cache.patch
|
|
|
|
|
2014-02-19 00:44:33 +00:00
|
|
|
/* Don't use /etc/ld.so.preload, but /etc/ld-nix.so.preload. */
|
|
|
|
./dont-use-system-ld-so-preload.patch
|
|
|
|
|
2013-06-03 20:16:05 +00:00
|
|
|
/* The command "getconf CS_PATH" returns the default search path
|
|
|
|
"/bin:/usr/bin", which is inappropriate on NixOS machines. This
|
|
|
|
patch extends the search path by "/run/current-system/sw/bin". */
|
|
|
|
./fix_path_attribute_in_getconf.patch
|
2017-12-20 13:57:48 +00:00
|
|
|
|
|
|
|
/* Allow running with RHEL 6 -like kernels. The patch adds an exception
|
|
|
|
for glibc to accept 2.6.32 and to tag the ELFs as 2.6.32-compatible
|
|
|
|
(otherwise the loader would refuse libc).
|
|
|
|
Note that glibc will fully work only on their heavily patched kernels
|
|
|
|
and we lose early mismatch detection on 2.6.32.
|
|
|
|
|
|
|
|
On major glibc updates we should check that the patched kernel supports
|
2018-01-14 19:39:49 +00:00
|
|
|
all the required features. ATM it's verified up to glibc-2.26-131.
|
2017-12-20 13:57:48 +00:00
|
|
|
# HOWTO: check glibc sources for changes in kernel requirements
|
|
|
|
git log -p glibc-2.25.. sysdeps/unix/sysv/linux/x86_64/kernel-features.h sysdeps/unix/sysv/linux/kernel-features.h
|
|
|
|
# get kernel sources (update the URL)
|
|
|
|
mkdir tmp && cd tmp
|
|
|
|
curl http://vault.centos.org/6.9/os/Source/SPackages/kernel-2.6.32-696.el6.src.rpm | rpm2cpio - | cpio -idmv
|
|
|
|
tar xf linux-*.bz2
|
|
|
|
# check syscall presence, for example
|
|
|
|
less linux-*?/arch/x86/kernel/syscall_table_32.S
|
|
|
|
*/
|
|
|
|
./allow-kernel-2.6.32.patch
|
2017-07-06 02:06:10 +00:00
|
|
|
]
|
|
|
|
++ lib.optional stdenv.isx86_64 ./fix-x64-abi.patch;
|
2012-09-18 16:38:43 +00:00
|
|
|
|
2014-09-13 12:06:27 +00:00
|
|
|
postPatch =
|
2012-09-18 16:38:43 +00:00
|
|
|
# Needed for glibc to build with the gnumake 3.82
|
|
|
|
# http://comments.gmane.org/gmane.linux.lfs.support/31227
|
2014-09-13 12:06:27 +00:00
|
|
|
''
|
|
|
|
sed -i 's/ot \$/ot:\n\ttouch $@\n$/' manual/Makefile
|
|
|
|
''
|
2012-09-18 16:38:43 +00:00
|
|
|
# nscd needs libgcc, and we don't want it dynamically linked
|
|
|
|
# because we don't want it to depend on bootstrap-tools libs.
|
2014-09-13 12:06:27 +00:00
|
|
|
+ ''
|
|
|
|
echo "LDFLAGS-nscd += -static-libgcc" >> nscd/Makefile
|
|
|
|
''
|
2014-11-11 10:04:10 +00:00
|
|
|
# Replace the date and time in nscd by a prefix of $out.
|
|
|
|
# It is used as a protocol compatibility check.
|
|
|
|
# Note: the size of the struct changes, but using only a part
|
|
|
|
# would break hash-rewriting. When receiving stats it does check
|
|
|
|
# that the struct sizes match and can't cause overflow or something.
|
2014-09-13 12:06:27 +00:00
|
|
|
+ ''
|
|
|
|
cat ${./glibc-remove-datetime-from-nscd.patch} \
|
|
|
|
| sed "s,@out@,$out," | patch -p1
|
|
|
|
'';
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
configureFlags =
|
|
|
|
[ "-C"
|
|
|
|
"--enable-add-ons"
|
2017-11-17 06:37:25 +00:00
|
|
|
"--enable-obsolete-nsl"
|
2012-09-18 16:38:43 +00:00
|
|
|
"--enable-obsolete-rpc"
|
|
|
|
"--sysconfdir=/etc"
|
2016-09-12 00:28:26 +00:00
|
|
|
"--enable-stackguard-randomization"
|
2017-05-18 10:55:08 +00:00
|
|
|
(if withLinuxHeaders
|
2016-02-18 20:11:15 +00:00
|
|
|
then "--with-headers=${linuxHeaders}/include"
|
2012-09-18 16:38:43 +00:00
|
|
|
else "--without-headers")
|
|
|
|
(if profilingLibraries
|
|
|
|
then "--enable-profile"
|
|
|
|
else "--disable-profile")
|
2017-08-26 09:35:11 +00:00
|
|
|
] ++ lib.optionals withLinuxHeaders [
|
|
|
|
"--enable-kernel=3.2.0" # can't get below with glibc >= 2.26
|
2016-02-18 20:11:15 +00:00
|
|
|
] ++ lib.optionals (cross != null) [
|
2016-02-04 18:24:46 +00:00
|
|
|
(if cross ? float && cross.float == "soft" then "--without-fp" else "--with-fp")
|
2017-08-26 09:35:11 +00:00
|
|
|
] ++ lib.optionals (cross != null) [
|
2012-09-18 16:38:43 +00:00
|
|
|
"--with-__thread"
|
treewide: isArm -> isAarch32
Following legacy packing conventions, `isArm` was defined just for
32-bit ARM instruction set. This is confusing to non packagers though,
because Aarch64 is an ARM instruction set.
The official ARM overview for ARMv8[1] is surprisingly not confusing,
given the overall state of affairs for ARM naming conventions, and
offers us a solution. It divides the nomenclature into three levels:
```
ISA: ARMv8 {-A, -R, -M}
/ \
Mode: Aarch32 Aarch64
| / \
Encoding: A64 A32 T32
```
At the top is the overall v8 instruction set archicture. Second are the
two modes, defined by bitwidth but differing in other semantics too, and
buttom are the encodings, (hopefully?) isomorphic if they encode the
same mode.
The 32 bit encodings are mostly backwards compatible with previous
non-Thumb and Thumb encodings, and if so we can pun the mode names to
instead mean "sets of compatable or isomorphic encodings", and then
voilà we have nice names for 32-bit and 64-bit arm instruction sets
which do not use the word ARM so as to not confused either laymen or
experienced ARM packages.
[1]: https://developer.arm.com/products/architecture/a-profile
(cherry picked from commit ba52ae50488de85a9cf60a3a04f1c9ca7122ec74)
2018-03-20 02:41:06 +00:00
|
|
|
] ++ lib.optionals (cross == null && stdenv.isAarch32) [
|
2012-09-18 16:38:43 +00:00
|
|
|
"--host=arm-linux-gnueabi"
|
|
|
|
"--build=arm-linux-gnueabi"
|
2012-12-28 16:53:18 +00:00
|
|
|
|
2012-09-18 16:38:43 +00:00
|
|
|
# To avoid linking with -lgcc_s (dynamic link)
|
|
|
|
# so the glibc does not depend on its compiler store path
|
|
|
|
"libc_cv_as_needed=no"
|
2016-02-18 20:11:15 +00:00
|
|
|
] ++ lib.optional withGd "--with-gd";
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
installFlags = [ "sysconfdir=$(out)/etc" ];
|
|
|
|
|
2016-01-24 02:28:59 +00:00
|
|
|
outputs = [ "out" "bin" "dev" "static" ];
|
2014-08-25 13:30:46 +00:00
|
|
|
|
2017-06-26 03:10:03 +00:00
|
|
|
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
2017-04-26 03:55:03 +00:00
|
|
|
buildInputs = lib.optionals withGd [ gd libpng ];
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
# Needed to install share/zoneinfo/zone.tab. Set to impure /bin/sh to
|
|
|
|
# prevent a retained dependency on the bootstrap tools in the stdenv-linux
|
|
|
|
# bootstrap.
|
|
|
|
BASH_SHELL = "/bin/sh";
|
|
|
|
}
|
|
|
|
|
2017-05-18 10:55:08 +00:00
|
|
|
// (removeAttrs args [ "withLinuxHeaders" "withGd" ]) //
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
{
|
2018-01-27 01:47:55 +00:00
|
|
|
name = name + "-${version}${patchSuffix}";
|
2016-02-18 20:11:15 +00:00
|
|
|
|
|
|
|
src = fetchurl {
|
2017-02-20 20:16:41 +00:00
|
|
|
url = "mirror://gnu/glibc/glibc-${version}.tar.xz";
|
2016-02-21 09:30:09 +00:00
|
|
|
inherit sha256;
|
2016-02-18 20:11:15 +00:00
|
|
|
};
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
# Remove absolute paths from `configure' & co.; build out-of-tree.
|
|
|
|
preConfigure = ''
|
|
|
|
export PWD_P=$(type -tP pwd)
|
|
|
|
for i in configure io/ftwtest-sh; do
|
|
|
|
# Can't use substituteInPlace here because replace hasn't been
|
|
|
|
# built yet in the bootstrap.
|
|
|
|
sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
|
|
|
|
done
|
|
|
|
|
|
|
|
mkdir ../build
|
|
|
|
cd ../build
|
|
|
|
|
|
|
|
configureScript="`pwd`/../$sourceRoot/configure"
|
|
|
|
|
2016-02-18 20:11:15 +00:00
|
|
|
${lib.optionalString (stdenv.cc.libc != null)
|
2014-12-17 18:11:30 +00:00
|
|
|
''makeFlags="$makeFlags BUILD_LDFLAGS=-Wl,-rpath,${stdenv.cc.libc}/lib"''
|
2013-03-10 23:47:59 +00:00
|
|
|
}
|
2012-09-18 16:38:43 +00:00
|
|
|
|
2017-05-18 10:55:08 +00:00
|
|
|
|
|
|
|
'' + lib.optionalString (cross != null) ''
|
|
|
|
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
|
|
|
|
EOF
|
2012-09-18 16:38:43 +00:00
|
|
|
'';
|
|
|
|
|
2016-02-18 20:11:15 +00:00
|
|
|
preBuild = lib.optionalString withGd "unset NIX_DONT_SET_RPATH";
|
|
|
|
|
2012-09-18 16:38:43 +00:00
|
|
|
meta = {
|
|
|
|
homepage = http://www.gnu.org/software/libc/;
|
2016-02-18 20:11:15 +00:00
|
|
|
description = "The GNU C Library";
|
2012-09-18 16:38:43 +00:00
|
|
|
|
|
|
|
longDescription =
|
|
|
|
'' Any Unix-like operating system needs a C library: the library which
|
|
|
|
defines the "system calls" and other basic facilities such as
|
|
|
|
open, malloc, printf, exit...
|
|
|
|
|
|
|
|
The GNU C library is used as the C library in the GNU system and
|
|
|
|
most systems with the Linux kernel.
|
|
|
|
'';
|
|
|
|
|
2016-02-18 20:11:15 +00:00
|
|
|
license = lib.licenses.lgpl2Plus;
|
2012-09-18 16:38:43 +00:00
|
|
|
|
2016-02-18 20:11:15 +00:00
|
|
|
maintainers = [ lib.maintainers.eelco ];
|
2016-08-28 14:57:17 +00:00
|
|
|
platforms = lib.platforms.linux;
|
2012-09-18 16:38:43 +00:00
|
|
|
} // meta;
|
2017-05-18 10:55:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// lib.optionalAttrs (cross != null) {
|
|
|
|
preInstall = null; # clobber the native hook
|
|
|
|
|
|
|
|
dontStrip = true;
|
|
|
|
|
|
|
|
separateDebugInfo = false; # this is currently broken for crossDrv
|
|
|
|
|
|
|
|
# To avoid a dependency on the build system 'bash'.
|
|
|
|
preFixup = ''
|
2017-12-16 02:30:37 +00:00
|
|
|
rm -f $bin/bin/{ldd,tzselect,catchsegv,xtrace}
|
2017-05-18 10:55:08 +00:00
|
|
|
'';
|
2012-09-18 16:38:43 +00:00
|
|
|
})
|