Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at fix-function-merge 124 lines 4.8 kB view raw
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}: 7 8stdenv.mkDerivation (finalAttrs: { 9 pname = "newlib"; 10 version = "4.3.0.20230120"; 11 12 src = fetchurl { 13 url = "ftp://sourceware.org/pub/newlib/newlib-${finalAttrs.version}.tar.gz"; 14 sha256 = "sha256-g6Yqma9Z4465sMWO0JLuJNcA//Q6IsA+QzlVET7zUVA="; 15 }; 16 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 ]; 25 26 depsBuildBuild = [ 27 buildPackages.stdenv.cc 28 texinfo # for makeinfo 29 ]; 30 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 ''; 46 47 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" 53 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}" 64 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 ]); 88 89 dontDisableStatic = true; 90 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/ 95 96 ( 97 cd $out${finalAttrs.passthru.libdir} 98 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)''; 106 107 passthru = { 108 incdir = "/${stdenv.targetPlatform.config}/include"; 109 libdir = "/${stdenv.targetPlatform.config}/lib"; 110 }; 111 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 }; 124})