pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / development / misc / newlib / default.nix
blobf9490ac1d2bf8035cca7d69f35388e384b09fa11
1 { stdenv, fetchurl, buildPackages, lib, fetchpatch, texinfo
2 , # "newlib-nano" is what the official ARM embedded toolchain calls this build
3   # configuration that prioritizes low space usage. We include it as a preset
4   # for embedded projects striving for a similar configuration.
5   nanoizeNewlib ? false
6 }:
8 stdenv.mkDerivation (finalAttrs: {
9   pname = "newlib";
10   version = "4.3.0.20230120";
12   src = fetchurl {
13     url = "ftp://sourceware.org/pub/newlib/newlib-${finalAttrs.version}.tar.gz";
14     sha256 = "sha256-g6Yqma9Z4465sMWO0JLuJNcA//Q6IsA+QzlVET7zUVA=";
15   };
17   patches = lib.optionals nanoizeNewlib [
18     # https://bugs.gentoo.org/723756
19     (fetchpatch {
20       name = "newlib-3.3.0-no-nano-cxx.patch";
21       url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/sys-libs/newlib/files/newlib-3.3.0-no-nano-cxx.patch?id=9ee5a1cd6f8da6d084b93b3dbd2e8022a147cfbf";
22       sha256 = "sha256-S3mf7vwrzSMWZIGE+d61UDH+/SK/ao1hTPee1sElgco=";
23     })
24   ];
26   depsBuildBuild = [
27     buildPackages.stdenv.cc
28     texinfo # for makeinfo
29   ];
31   # newlib expects CC to build for build platform, not host platform
32   preConfigure = ''
33     export CC=cc
34   '' +
35   # newlib tries to disable itself when building for Linux *except*
36   # when native-compiling.  Unfortunately the check for "is cross
37   # compiling" was written when newlib was part of GCC and newlib
38   # was built along with GCC (therefore newlib was built to execute
39   # on the targetPlatform, not the hostPlatform).  Unfortunately
40   # when newlib was extracted from GCC, this "is cross compiling"
41   # logic was not fixed.  So we must disable it.
42   ''
43     substituteInPlace configure --replace 'noconfigdirs target-newlib target-libgloss' 'noconfigdirs'
44     substituteInPlace configure --replace 'cross_only="target-libgloss target-newlib' 'cross_only="'
45   '';
48   configurePlatforms = [ "build" "target" ];
49   # 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
50   # sort alphabetically
51   configureFlags = [
52     "--with-newlib"
54     # The newlib configury uses `host` to refer to the platform
55     # which is being used to compile newlib.  Ugh.  It does this
56     # because of its history: newlib used to be distributed with and
57     # built as part of gcc.
58     #
59     # To prevent nixpkgs from going insane, this package presents the
60     # "normal" view to the outside world: the binaries in $out will
61     # execute on `stdenv.hostPlatform`.  We then fool newlib's build
62     # process into doing the right thing.
63     "--host=${stdenv.targetPlatform.config}"
65   ] ++ (if !nanoizeNewlib then [
66     "--disable-newlib-supplied-syscalls"
67     "--disable-nls"
68     "--enable-newlib-io-c99-formats"
69     "--enable-newlib-io-long-long"
70     "--enable-newlib-reent-check-verify"
71     "--enable-newlib-register-fini"
72     "--enable-newlib-retargetable-locking"
73   ] else [
74     "--disable-newlib-fseek-optimization"
75     "--disable-newlib-fvwrite-in-streamio"
76     "--disable-newlib-supplied-syscalls"
77     "--disable-newlib-unbuf-stream-opt"
78     "--disable-newlib-wide-orient"
79     "--disable-nls"
80     "--enable-lite-exit"
81     "--enable-newlib-global-atexit"
82     "--enable-newlib-nano-formatted-io"
83     "--enable-newlib-nano-malloc"
84     "--enable-newlib-reent-check-verify"
85     "--enable-newlib-reent-small"
86     "--enable-newlib-retargetable-locking"
87   ]);
89   dontDisableStatic = true;
91   # 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
92   postInstall = lib.optionalString nanoizeNewlib ''
93     mkdir -p $out${finalAttrs.passthru.incdir}/newlib-nano
94     cp $out${finalAttrs.passthru.incdir}/newlib.h $out${finalAttrs.passthru.incdir}/newlib-nano/
96     (
97       cd $out${finalAttrs.passthru.libdir}
99       for f in librdimon.a libc.a libg.a; do
100         # Some libraries are only available for specific architectures.
101         # For example, librdimon.a is only available on ARM.
102         [ -f "$f" ] && cp "$f" "''${f%%\.a}_nano.a"
103       done
104     )
105   '' + ''[ "$(find $out -type f | wc -l)" -gt 0 ] || (echo '$out is empty' 1>&2 && exit 1)'';
107   passthru = {
108     incdir = "/${stdenv.targetPlatform.config}/include";
109     libdir = "/${stdenv.targetPlatform.config}/lib";
110   };
112   meta = with lib; {
113     description = "C library intended for use on embedded systems";
114     homepage = "https://sourceware.org/newlib/";
115     # arch has "bsd" while gentoo has "NEWLIB LIBGLOSS GPL-2" while COPYING has "gpl2"
116     # there are 5 copying files in total
117     # COPYING
118     # COPYING.LIB
119     # COPYING.LIBGLOSS
120     # COPYING.NEWLIB
121     # COPYING3
122     license = licenses.gpl2Plus;
123   };