From 9511eb033bb00a6553549afd0e8161463972ffa6 Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 30 Oct 2025 20:47:10 +0100 Subject: [PATCH 01/10] all-packages: drop reference to obsolete uclibc package in favor of uclibc-ng --- pkgs/top-level/all-packages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index f113948d81c3..9012cd3a963f 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -6993,7 +6993,7 @@ with pkgs; else if libc == "bionic" then bionic else if libc == "uclibc" then - uclibc + uclibc-ng else if libc == "avrlibc" then avrlibc else if libc == "newlib" && stdenv.hostPlatform.isMsp430 then From f7e74f098246b268d65124838e82943e55becee2 Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Wed, 17 Dec 2025 23:51:54 +0100 Subject: [PATCH 02/10] maintainers: add aleclearmind --- maintainers/maintainer-list.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 9b146e5363cf..35f4e1581d0d 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -1114,6 +1114,13 @@ githubId = 82811; name = "Aldo Borrero"; }; + aleclearmind = { + email = "ale.nix@clearmind.me"; + matrix = "@bake.monorail:matrix.org"; + github = "aleclearmind"; + githubId = 2545644; + name = "Alessandro Di Federico"; + }; alejandrosame = { email = "alejandrosanchzmedina@gmail.com"; matrix = "@alejandrosame:matrix.org"; From 551863ad6f1adc0017c5fa5bb0e9b0b7fe4b903f Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 30 Oct 2025 20:11:38 +0100 Subject: [PATCH 03/10] uclibc-ng: minor changes --- pkgs/by-name/uc/uclibc-ng/package.nix | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index ef49ca1e12e0..bbef143c6e2a 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -26,16 +26,15 @@ let echo "parseconfig: removing $NAME" sed -i /^$NAME=/d .config - #if test "$OPTION" != n; then - echo "parseconfig: setting $NAME=$OPTION" - echo "$NAME=$OPTION" >> .config - #fi + echo "parseconfig: setting $NAME=$OPTION" + echo "$NAME=$OPTION" >> .config done set +x } ''; # UCLIBC_SUSV4_LEGACY defines 'tmpnam', needed for gcc libstdc++ builds. + # 'ftw' needed to build acl, a coreutils dependency nixConfig = '' RUNTIME_PREFIX "/" DEVEL_PREFIX "/" @@ -70,7 +69,6 @@ stdenv.mkDerivation (finalAttrs: { hash = "sha256-X386r92yygj7KVvkVWHAGIQHED10Rs/SZLm4Iv7T7S0="; }; - # 'ftw' needed to build acl, a coreutils dependency configurePhase = '' make defconfig ${configParser} From fe557e14e68e0b3f21f6b4929475526c354a8689 Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Sat, 22 Nov 2025 19:27:41 +0100 Subject: [PATCH 04/10] uclibc-ng: add aleclearmind as maintainer --- pkgs/by-name/uc/uclibc-ng/package.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index bbef143c6e2a..ba87265142b7 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -142,7 +142,7 @@ stdenv.mkDerivation (finalAttrs: { experimental and need more testing. ''; license = lib.licenses.lgpl2Plus; - maintainers = [ ]; + maintainers = with lib.maintainers; [ aleclearmind ]; platforms = lib.platforms.linux; badPlatforms = lib.platforms.aarch64; }; From 0ab2e38e112682b849bddb00af0441c89e5ce7a7 Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 30 Oct 2025 20:21:37 +0100 Subject: [PATCH 05/10] uclibc-ng: use V=1 for verbose builds VERBOSE=1 is no (longer?) used by uclibc. --- pkgs/by-name/uc/uclibc-ng/package.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index ba87265142b7..b95f901738cf 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -90,7 +90,7 @@ stdenv.mkDerivation (finalAttrs: { makeFlags = [ "ARCH=${stdenv.hostPlatform.linuxArch}" "TARGET_ARCH=${stdenv.hostPlatform.linuxArch}" - "VERBOSE=1" + "V=1" ] ++ lib.optionals isCross [ "CROSS=${stdenv.cc.targetPrefix}" From 0aa8e281f2945ec80fd446fff2e6b04fe3c3734c Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Sat, 22 Nov 2025 18:34:29 +0100 Subject: [PATCH 06/10] uclibc-ng: do not special case ARM cross-compilation It is unclear why this was being done. The earliest source of detecting cross-compilation for ARM dates back to d65fe65. --- pkgs/by-name/uc/uclibc-ng/package.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index b95f901738cf..3019d0b38b07 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -51,7 +51,7 @@ let + lib.optionalString (stdenv.hostPlatform.gcc.float or "" == "soft") '' UCLIBC_HAS_FPU n '' - + lib.optionalString (stdenv.hostPlatform.isAarch32 && isCross) '' + + lib.optionalString stdenv.hostPlatform.isAarch32 '' CONFIG_ARM_EABI y ARCH_WANTS_BIG_ENDIAN n ARCH_BIG_ENDIAN n From 73146ea35c7f50e768f0cd5550fa1ce3df9d19c2 Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 30 Oct 2025 20:17:19 +0100 Subject: [PATCH 07/10] uclibc-ng: do not disable hardware floating point support for ARM The original author had probably in mind some specific device without hardware floating point support. --- pkgs/by-name/uc/uclibc-ng/package.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index 3019d0b38b07..c6aca9bbd3d1 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -57,7 +57,6 @@ let ARCH_BIG_ENDIAN n ARCH_WANTS_LITTLE_ENDIAN y ARCH_LITTLE_ENDIAN y - UCLIBC_HAS_FPU n ''; in stdenv.mkDerivation (finalAttrs: { From 90b59828be4571927f60d56acdc54f2c598509cc Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 30 Oct 2025 20:17:59 +0100 Subject: [PATCH 08/10] uclibc-ng: detect CONFIG_ARM_EABI from platform This commit introduces a `isEabi` predicate for platforms and employs it to detect whether to configure uclibc with CONFIG_ARM_EABI or not. --- lib/systems/inspect.nix | 5 +++++ lib/systems/parse.nix | 12 +++++++++++- pkgs/by-name/uc/uclibc-ng/package.nix | 4 +++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/systems/inspect.nix b/lib/systems/inspect.nix index c1876093600d..0a8e1ac8e702 100644 --- a/lib/systems/inspect.nix +++ b/lib/systems/inspect.nix @@ -440,6 +440,11 @@ rec { isPE = { kernel.execFormat = execFormats.pe; }; + + isEabi = { + abi.eabi = true; + }; + }; # given two patterns, return a pattern which is their logical AND. diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix index c76aa592fc28..86f8c169d901 100644 --- a/lib/systems/parse.nix +++ b/lib/systems/parse.nix @@ -662,15 +662,19 @@ rec { # On ARM, this corresponds to ARMEABI. eabi = { float = "soft"; + eabi = true; }; eabihf = { float = "hard"; + eabi = true; }; # Other architectures should use ELF in embedded situations. elf = { }; - androideabi = { }; + androideabi = { + eabi = true; + }; android = { assertions = [ { @@ -684,9 +688,11 @@ rec { gnueabi = { float = "soft"; + eabi = true; }; gnueabihf = { float = "hard"; + eabi = true; }; gnu = { assertions = [ @@ -730,17 +736,21 @@ rec { musleabi = { float = "soft"; + eabi = true; }; musleabihf = { float = "hard"; + eabi = true; }; musl = { }; uclibceabi = { float = "soft"; + eabi = true; }; uclibceabihf = { float = "hard"; + eabi = true; }; uclibc = { }; diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index c6aca9bbd3d1..e1396b34c2d0 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -51,8 +51,10 @@ let + lib.optionalString (stdenv.hostPlatform.gcc.float or "" == "soft") '' UCLIBC_HAS_FPU n '' - + lib.optionalString stdenv.hostPlatform.isAarch32 '' + + lib.optionalString stdenv.hostPlatform.isEabi '' CONFIG_ARM_EABI y + '' + + lib.optionalString stdenv.hostPlatform.isAarch32 '' ARCH_WANTS_BIG_ENDIAN n ARCH_BIG_ENDIAN n ARCH_WANTS_LITTLE_ENDIAN y From 2eceab7950edc531fe6a2186442a104f00d6c7e3 Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 30 Oct 2025 20:18:56 +0100 Subject: [PATCH 09/10] uclibc-ng: handle endianess explicitly Employ `isLittleEndian`/`isBigEndian` to configure uclibc endianess. --- pkgs/by-name/uc/uclibc-ng/package.nix | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index e1396b34c2d0..24de1084cc53 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -54,11 +54,17 @@ let + lib.optionalString stdenv.hostPlatform.isEabi '' CONFIG_ARM_EABI y '' - + lib.optionalString stdenv.hostPlatform.isAarch32 '' + + lib.optionalString stdenv.hostPlatform.isLittleEndian '' ARCH_WANTS_BIG_ENDIAN n ARCH_BIG_ENDIAN n ARCH_WANTS_LITTLE_ENDIAN y ARCH_LITTLE_ENDIAN y + '' + + lib.optionalString stdenv.hostPlatform.isBigEndian '' + ARCH_WANTS_BIG_ENDIAN y + ARCH_BIG_ENDIAN y + ARCH_WANTS_LITTLE_ENDIAN n + ARCH_LITTLE_ENDIAN n ''; in stdenv.mkDerivation (finalAttrs: { From e8b384078f32ae8bdf7ded43e035b541d61a8cad Mon Sep 17 00:00:00 2001 From: Alessandro Di Federico Date: Thu, 30 Oct 2025 20:19:51 +0100 Subject: [PATCH 10/10] uclibc-ng: specify architecture in `make defconfig` This ensures the correct architecture is picked up in the `.config` file. For instance, specifying `ARCH=arm` will correctly set TARGET_ARCH=arm and TARGET_arm=y. This commit has been tested to successfully produce toolchains for: * mipsel-unknown-linux-uclibc (ben-nanonote) * mips-unknown-linux-uclibc * armv7a-unknown-linux-uclibceabihf * armv7a-unknown-linux-uclibceabi Specifically, the following script has been used to test the toolchains: #!/usr/bin/env bash set -euo pipefail function test_toolchain() { TRIPLE="$1" shift EXPRESSION="$1" shift QEMU_ARCH="$1" shift echo "Testing $TRIPLE" > /dev/stderr BUILT_PACKAGE=$(nix-build -E "$EXPRESSION") nix-shell -p "$BUILT_PACKAGE" -p qemu --run ' set -euo pipefail echo "#include " > program.c echo "int main() { puts(\"Hello!\"); }" >> program.c '"$TRIPLE"'-gcc program.c -o program -static for TO_GREP in '"$(printf "'%s' " "$@")"'; do readelf -h program | grep -F "$TO_GREP" done qemu-'"$QEMU_ARCH"' ./program ' } function test_triple() { TRIPLE="$1" shift QEMU_ARCH="$1" shift test_toolchain "$TRIPLE" '(import ./. { crossSystem = { config = "'"$TRIPLE"'"; }; }).stdenv.cc' "$QEMU_ARCH" "$@" } function test_cross() { TRIPLE="$1" shift CROSS="$1" shift QEMU_ARCH="$1" shift test_toolchain "$TRIPLE" '(import ./. {}).pkgsCross.'"$CROSS"'.stdenv.cc' "$QEMU_ARCH" "$@" } test_cross "mipsel-unknown-linux-uclibc" "ben-nanonote" "mipsel" "little endian" test_triple "mips-unknown-linux-uclibc" "mips" "big endian" test_triple "armv7a-unknown-linux-uclibceabihf" "arm" "little endian" "EABI" "hard-float ABI" test_triple "armv7a-unknown-linux-uclibceabi" "arm" "little endian" "EABI" "soft-float ABI" --- pkgs/by-name/uc/uclibc-ng/package.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/by-name/uc/uclibc-ng/package.nix b/pkgs/by-name/uc/uclibc-ng/package.nix index 24de1084cc53..d512a4a571b3 100644 --- a/pkgs/by-name/uc/uclibc-ng/package.nix +++ b/pkgs/by-name/uc/uclibc-ng/package.nix @@ -77,7 +77,7 @@ stdenv.mkDerivation (finalAttrs: { }; configurePhase = '' - make defconfig + make defconfig ARCH=${stdenv.hostPlatform.linuxArch} ${configParser} cat << EOF | parseconfig ${nixConfig}