nixpkgs/pkgs/development/misc/newlib/default.nix
Adam Joseph 7444c59c52 newlib: evade more of newlib's self-disablement
In https://github.com/NixOS/nixpkgs/pull/266364/files I neglected to
evade one of newlib's other (annoying) self-disablement checks: when
host==target newlib decides it's not in the mood to build itself for
some reason.

Since we have an entire package for newlib (it's no longer part of
gcc) these checks are silly.  So I have evadede the second check as well.

Closes #267859
2023-11-16 20:41:25 -08:00

125 lines
4.6 KiB
Nix

{ stdenv, fetchurl, buildPackages, lib, fetchpatch, texinfo
, # "newlib-nano" is what the official ARM embedded toolchain calls this build
# configuration that prioritizes low space usage. We include it as a preset
# for embedded projects striving for a similar configuration.
nanoizeNewlib ? false
}:
stdenv.mkDerivation (finalAttrs: {
pname = "newlib";
version = "4.3.0.20230120";
src = fetchurl {
url = "ftp://sourceware.org/pub/newlib/newlib-${finalAttrs.version}.tar.gz";
sha256 = "sha256-g6Yqma9Z4465sMWO0JLuJNcA//Q6IsA+QzlVET7zUVA=";
};
patches = lib.optionals nanoizeNewlib [
# https://bugs.gentoo.org/723756
(fetchpatch {
name = "newlib-3.3.0-no-nano-cxx.patch";
url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/sys-libs/newlib/files/newlib-3.3.0-no-nano-cxx.patch?id=9ee5a1cd6f8da6d084b93b3dbd2e8022a147cfbf";
sha256 = "sha256-S3mf7vwrzSMWZIGE+d61UDH+/SK/ao1hTPee1sElgco=";
})
];
depsBuildBuild = [
buildPackages.stdenv.cc
texinfo # for makeinfo
];
# newlib expects CC to build for build platform, not host platform
preConfigure = ''
export CC=cc
'' +
# newlib tries to disable itself when building for Linux *except*
# when native-compiling. Unfortunately the check for "is cross
# compiling" was written when newlib was part of GCC and newlib
# was built along with GCC (therefore newlib was built to execute
# on the targetPlatform, not the hostPlatform). Unfortunately
# when newlib was extracted from GCC, this "is cross compiling"
# logic was not fixed. So we must disable it.
''
substituteInPlace configure --replace 'noconfigdirs target-newlib target-libgloss' 'noconfigdirs'
substituteInPlace configure --replace 'cross_only="target-libgloss target-newlib' 'cross_only="'
'';
configurePlatforms = [ "build" "target" ];
# flags copied from https://community.arm.com/support-forums/f/compilers-and-libraries-forum/53310/gcc-arm-none-eabi-what-were-the-newlib-compilation-options
# sort alphabetically
configureFlags = [
"--with-newlib"
# The newlib configury uses `host` to refer to the platform
# which is being used to compile newlib. Ugh. It does this
# because of its history: newlib used to be distributed with and
# built as part of gcc.
#
# To prevent nixpkgs from going insane, this package presents the
# "normal" view to the outside world: the binaries in $out will
# execute on `stdenv.hostPlatform`. We then fool newlib's build
# process into doing the right thing.
"--host=${stdenv.targetPlatform.config}"
] ++ (if !nanoizeNewlib then [
"--disable-newlib-supplied-syscalls"
"--disable-nls"
"--enable-newlib-io-c99-formats"
"--enable-newlib-io-long-long"
"--enable-newlib-reent-check-verify"
"--enable-newlib-register-fini"
"--enable-newlib-retargetable-locking"
] else [
"--disable-newlib-fseek-optimization"
"--disable-newlib-fvwrite-in-streamio"
"--disable-newlib-supplied-syscalls"
"--disable-newlib-unbuf-stream-opt"
"--disable-newlib-wide-orient"
"--disable-nls"
"--enable-lite-exit"
"--enable-newlib-global-atexit"
"--enable-newlib-nano-formatted-io"
"--enable-newlib-nano-malloc"
"--enable-newlib-reent-check-verify"
"--enable-newlib-reent-small"
"--enable-newlib-retargetable-locking"
]);
dontDisableStatic = true;
# apply necessary nano changes from https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/manifest/copy_nano_libraries.sh?rev=4c50be6ccb9c4205a5262a3925317073&hash=1375A7B0A1CD0DB9B9EB0D2B574ADF66
postInstall = lib.optionalString nanoizeNewlib ''
mkdir -p $out${finalAttrs.passthru.incdir}/newlib-nano
cp $out${finalAttrs.passthru.incdir}/newlib.h $out${finalAttrs.passthru.incdir}/newlib-nano/
(
cd $out${finalAttrs.passthru.libdir}
for f in librdimon.a libc.a libg.a; do
# Some libraries are only available for specific architectures.
# For example, librdimon.a is only available on ARM.
[ -f "$f" ] && cp "$f" "''${f%%\.a}_nano.a"
done
)
'' + ''[ "$(find $out -type f | wc -l)" -gt 0 ] || (echo '$out is empty' 1>&2 && exit 1)'';
passthru = {
incdir = "/${stdenv.targetPlatform.config}/include";
libdir = "/${stdenv.targetPlatform.config}/lib";
};
meta = with lib; {
description = "a C library intended for use on embedded systems";
homepage = "https://sourceware.org/newlib/";
# arch has "bsd" while gentoo has "NEWLIB LIBGLOSS GPL-2" while COPYING has "gpl2"
# there are 5 copying files in total
# COPYING
# COPYING.LIB
# COPYING.LIBGLOSS
# COPYING.NEWLIB
# COPYING3
license = licenses.gpl2Plus;
};
})