diff options
Diffstat (limited to 'nixpkgs/pkgs/os-specific/linux/busybox')
4 files changed, 225 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/os-specific/linux/busybox/busybox-in-store.patch b/nixpkgs/pkgs/os-specific/linux/busybox/busybox-in-store.patch new file mode 100644 index 000000000000..2d356b66b3ae --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/busybox/busybox-in-store.patch @@ -0,0 +1,23 @@ +Allow BusyBox to be invoked as "<something>-busybox". This is +necessary when it's run from the Nix store as <hash>-busybox during +stdenv bootstrap. +--- a/libbb/appletlib.c ++++ b/libbb/appletlib.c +@@ -947,7 +947,7 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar + static NORETURN void run_applet_and_exit(const char *name, char **argv) + { + # if ENABLE_BUSYBOX +- if (is_prefixed_with(name, "busybox")) ++ if (strstr(name, "busybox") != 0) + exit(busybox_main(/*unused:*/ 0, argv)); + # endif + # if NUM_APPLETS > 0 +@@ -1045,7 +1045,7 @@ int main(int argc UNUSED_PARAM, char **argv) + + lbb_prepare("busybox" IF_FEATURE_INDIVIDUAL(, argv)); + # if !ENABLE_BUSYBOX +- if (argv[1] && is_prefixed_with(bb_basename(argv[0]), "busybox")) ++ if (argv[1] && strstr(bb_basename(argv[0]), "busybox") != 0) + argv++; + # endif + applet_name = argv[0]; diff --git a/nixpkgs/pkgs/os-specific/linux/busybox/clang-cross.patch b/nixpkgs/pkgs/os-specific/linux/busybox/clang-cross.patch new file mode 100644 index 000000000000..b2d696bfd73f --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/busybox/clang-cross.patch @@ -0,0 +1,37 @@ +diff --git a/Makefile b/Makefile +index 6fedcffba..3385836c4 100644 +--- a/Makefile ++++ b/Makefile +@@ -271,8 +271,8 @@ export quiet Q KBUILD_VERBOSE + # Look for make include files relative to root of kernel src + MAKEFLAGS += --include-dir=$(srctree) + +-HOSTCC = gcc +-HOSTCXX = g++ ++HOSTCC = cc ++HOSTCXX = c++ + HOSTCFLAGS := + HOSTCXXFLAGS := + # We need some generic definitions +@@ -289,7 +289,7 @@ MAKEFLAGS += -rR + # Make variables (CC, etc...) + + AS = $(CROSS_COMPILE)as +-CC = $(CROSS_COMPILE)gcc ++CC = $(CROSS_COMPILE)cc + LD = $(CC) -nostdlib + CPP = $(CC) -E + AR = $(CROSS_COMPILE)ar +diff --git a/scripts/Makefile.IMA b/scripts/Makefile.IMA +index f155108d7..185257064 100644 +--- a/scripts/Makefile.IMA ++++ b/scripts/Makefile.IMA +@@ -39,7 +39,7 @@ ifndef HOSTCC + HOSTCC = cc + endif + AS = $(CROSS_COMPILE)as +-CC = $(CROSS_COMPILE)gcc ++CC = $(CROSS_COMPILE)cc + LD = $(CC) -nostdlib + CPP = $(CC) -E + AR = $(CROSS_COMPILE)ar diff --git a/nixpkgs/pkgs/os-specific/linux/busybox/default.nix b/nixpkgs/pkgs/os-specific/linux/busybox/default.nix new file mode 100644 index 000000000000..a4a7adeb8b79 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/busybox/default.nix @@ -0,0 +1,140 @@ +{ stdenv, lib, buildPackages, fetchurl, fetchFromGitLab +, enableStatic ? stdenv.hostPlatform.isStatic +, enableMinimal ? false +# Allow forcing musl without switching stdenv itself, e.g. for our bootstrapping: +# nix build -f pkgs/top-level/release.nix stdenvBootstrapTools.x86_64-linux.dist +, useMusl ? stdenv.hostPlatform.libc == "musl", musl +, extraConfig ? "" +}: + +assert stdenv.hostPlatform.libc == "musl" -> useMusl; + +let + configParser = '' + function parseconfig { + while read LINE; do + NAME=`echo "$LINE" | cut -d \ -f 1` + OPTION=`echo "$LINE" | cut -d \ -f 2` + + if ! [[ "$NAME" =~ ^CONFIG_ ]]; then continue; fi + + echo "parseconfig: removing $NAME" + sed -i /$NAME'\(=\| \)'/d .config + + echo "parseconfig: setting $NAME=$OPTION" + echo "$NAME=$OPTION" >> .config + done + } + ''; + + libcConfig = lib.optionalString useMusl '' + CONFIG_FEATURE_UTMP n + CONFIG_FEATURE_WTMP n + ''; + + # The debian version lacks behind the upstream version and also contains + # a debian-specific suffix. We only fetch the debian repository to get the + # default.script + debianVersion = "1.30.1-6"; + debianSource = fetchFromGitLab { + domain = "salsa.debian.org"; + owner = "installer-team"; + repo = "busybox"; + rev = "debian/1%${debianVersion}"; + sha256 = "sha256-6r0RXtmqGXtJbvLSD1Ma1xpqR8oXL2bBKaUE/cSENL8="; + }; + debianDispatcherScript = "${debianSource}/debian/tree/udhcpc/etc/udhcpc/default.script"; + outDispatchPath = "$out/default.script"; +in + +stdenv.mkDerivation rec { + pname = "busybox"; + version = "1.32.1"; + + # Note to whoever is updating busybox: please verify that: + # nix-build pkgs/stdenv/linux/make-bootstrap-tools.nix -A test + # still builds after the update. + src = fetchurl { + url = "https://busybox.net/downloads/${pname}-${version}.tar.bz2"; + sha256 = "1vhd59qmrdyrr1q7rvxmyl96z192mxl089hi87yl0hcp6fyw8mwx"; + }; + + hardeningDisable = [ "format" "pie" ] + ++ lib.optionals enableStatic [ "fortify" ]; + + patches = [ + ./busybox-in-store.patch + ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) ./clang-cross.patch; + + postPatch = "patchShebangs ."; + + configurePhase = '' + export KCONFIG_NOTIMESTAMP=1 + make ${if enableMinimal then "allnoconfig" else "defconfig"} + + ${configParser} + + cat << EOF | parseconfig + + CONFIG_PREFIX "$out" + CONFIG_INSTALL_NO_USR y + + CONFIG_LFS y + + ${lib.optionalString enableStatic '' + CONFIG_STATIC y + ''} + + # Use the external mount.cifs program. + CONFIG_FEATURE_MOUNT_CIFS n + CONFIG_FEATURE_MOUNT_HELPERS y + + # Set paths for console fonts. + CONFIG_DEFAULT_SETFONT_DIR "/etc/kbd" + + # Bump from 4KB, much faster I/O + CONFIG_FEATURE_COPYBUF_KB 64 + + # Set the path for the udhcpc script + CONFIG_UDHCPC_DEFAULT_SCRIPT "${outDispatchPath}" + + ${extraConfig} + CONFIG_CROSS_COMPILER_PREFIX "${stdenv.cc.targetPrefix}" + ${libcConfig} + EOF + + make oldconfig + + runHook postConfigure + ''; + + postConfigure = lib.optionalString (useMusl && stdenv.hostPlatform.libc != "musl") '' + makeFlagsArray+=("CC=${stdenv.cc.targetPrefix}cc -isystem ${musl.dev}/include -B${musl}/lib -L${musl}/lib") + ''; + + postInstall = '' + sed -e ' + 1 a busybox() { '$out'/bin/busybox "$@"; }\ + logger() { '$out'/bin/logger "$@"; }\ + ' ${debianDispatcherScript} > ${outDispatchPath} + chmod 555 ${outDispatchPath} + PATH=$out/bin patchShebangs ${outDispatchPath} + ''; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + buildInputs = lib.optionals (enableStatic && !useMusl && stdenv.cc.libc ? static) [ stdenv.cc.libc stdenv.cc.libc.static ]; + + enableParallelBuilding = true; + + doCheck = false; # tries to access the net + + meta = with lib; { + description = "Tiny versions of common UNIX utilities in a single small executable"; + homepage = "https://busybox.net/"; + license = licenses.gpl2; + maintainers = with maintainers; [ TethysSvensson ]; + platforms = platforms.linux; + priority = 10; + }; +} diff --git a/nixpkgs/pkgs/os-specific/linux/busybox/sandbox-shell.nix b/nixpkgs/pkgs/os-specific/linux/busybox/sandbox-shell.nix new file mode 100644 index 000000000000..036ea0a0f486 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/busybox/sandbox-shell.nix @@ -0,0 +1,25 @@ +{ busybox, stdenv}: + +# Minimal shell for use as basic /bin/sh in sandbox builds +busybox.override { + enableStatic = true; + enableMinimal = true; + extraConfig = '' + CONFIG_FEATURE_FANCY_ECHO y + CONFIG_FEATURE_SH_MATH y + CONFIG_FEATURE_SH_MATH_64 y + + CONFIG_ASH y + CONFIG_ASH_OPTIMIZE_FOR_SIZE y + + CONFIG_ASH_ALIAS y + CONFIG_ASH_BASH_COMPAT y + CONFIG_ASH_CMDCMD y + CONFIG_ASH_ECHO y + CONFIG_ASH_GETOPTS y + CONFIG_ASH_INTERNAL_GLOB y + CONFIG_ASH_JOB_CONTROL y + CONFIG_ASH_PRINTF y + CONFIG_ASH_TEST y + ''; +} |