aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-04-02 23:14:21 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-04-02 23:14:21 +0000
commit2f1ba09955a36a3c6f7cb0704d3ccec0151c07cb (patch)
tree57e9631f497bc143062b92a68f9ef0a4bc3ec2b5
parent80afad5d85162a53a187c8b3e0427796ac976007 (diff)
parent9a270c2510a3c163c0ae68be4d3ba831c379471b (diff)
downloadtoybox-2f1ba09955a36a3c6f7cb0704d3ccec0151c07cb.tar.gz
Snap for 11662267 from 9a270c2510a3c163c0ae68be4d3ba831c379471b to sdk-release
Change-Id: I2099c2f2e81e550d551b941d5358af9d12fe3cb3
-rw-r--r--METADATA6
-rw-r--r--android/device/generated/newtoys.h2
-rw-r--r--android/linux/generated/newtoys.h2
-rw-r--r--android/mac/generated/newtoys.h2
-rwxr-xr-xmkroot/mkroot.sh132
-rwxr-xr-xmkroot/packages/tests3
-rwxr-xr-xmkroot/record-commands15
-rwxr-xr-xmkroot/tar-for-web.sh8
-rwxr-xr-xscripts/mcm-buildall.sh11
-rwxr-xr-xscripts/prereq/build.sh15
-rw-r--r--scripts/prereq/generated/config.h704
-rw-r--r--scripts/prereq/generated/flags.h848
-rw-r--r--scripts/prereq/generated/globals.h155
-rw-r--r--scripts/prereq/generated/help.h34
-rw-r--r--scripts/prereq/generated/newtoys.h124
-rw-r--r--scripts/prereq/generated/tags.h1
-rwxr-xr-xscripts/probes/cmd2dpkg26
-rwxr-xr-xscripts/recreate-prereq.sh40
-rw-r--r--toys/other/inotifyd.c3
-rw-r--r--www/faq.html2
20 files changed, 2062 insertions, 71 deletions
diff --git a/METADATA b/METADATA
index af5fd034..d5348dcc 100644
--- a/METADATA
+++ b/METADATA
@@ -8,13 +8,13 @@ third_party {
license_type: UNENCUMBERED
last_upgrade_date {
year: 2024
- month: 3
- day: 25
+ month: 4
+ day: 1
}
homepage: "https://landley.net/toybox/"
identifier {
type: "Git"
value: "https://github.com/landley/toybox"
- version: "95906a13d1c6d0df5f521d2d91371791663f339e"
+ version: "d1acc6e88be52e96e558717805b438c1f46ba529"
}
}
diff --git a/android/device/generated/newtoys.h b/android/device/generated/newtoys.h
index 23119eca..92814854 100644
--- a/android/device/generated/newtoys.h
+++ b/android/device/generated/newtoys.h
@@ -141,7 +141,7 @@ USE_ICONV(NEWTOY(iconv, "cst:f:", TOYFLAG_USR|TOYFLAG_BIN))
USE_ID(NEWTOY(id, ">1"USE_ID_Z("Z")"nGgru[!"USE_ID_Z("Z")"Ggu]", TOYFLAG_USR|TOYFLAG_BIN))
USE_IFCONFIG(NEWTOY(ifconfig, "^?aS", TOYFLAG_SBIN))
USE_INIT(NEWTOY(init, "", TOYFLAG_SBIN))
-USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN))
+USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
USE_INSMOD(NEWTOY(insmod, "<1", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
USE_INSTALL(NEWTOY(install, "<1cdDp(preserve-timestamps)svt:m:o:g:", TOYFLAG_USR|TOYFLAG_BIN))
USE_IONICE(NEWTOY(ionice, "^tc#<0>3=2n#<0>7=5p#", TOYFLAG_USR|TOYFLAG_BIN))
diff --git a/android/linux/generated/newtoys.h b/android/linux/generated/newtoys.h
index 23119eca..92814854 100644
--- a/android/linux/generated/newtoys.h
+++ b/android/linux/generated/newtoys.h
@@ -141,7 +141,7 @@ USE_ICONV(NEWTOY(iconv, "cst:f:", TOYFLAG_USR|TOYFLAG_BIN))
USE_ID(NEWTOY(id, ">1"USE_ID_Z("Z")"nGgru[!"USE_ID_Z("Z")"Ggu]", TOYFLAG_USR|TOYFLAG_BIN))
USE_IFCONFIG(NEWTOY(ifconfig, "^?aS", TOYFLAG_SBIN))
USE_INIT(NEWTOY(init, "", TOYFLAG_SBIN))
-USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN))
+USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
USE_INSMOD(NEWTOY(insmod, "<1", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
USE_INSTALL(NEWTOY(install, "<1cdDp(preserve-timestamps)svt:m:o:g:", TOYFLAG_USR|TOYFLAG_BIN))
USE_IONICE(NEWTOY(ionice, "^tc#<0>3=2n#<0>7=5p#", TOYFLAG_USR|TOYFLAG_BIN))
diff --git a/android/mac/generated/newtoys.h b/android/mac/generated/newtoys.h
index 23119eca..92814854 100644
--- a/android/mac/generated/newtoys.h
+++ b/android/mac/generated/newtoys.h
@@ -141,7 +141,7 @@ USE_ICONV(NEWTOY(iconv, "cst:f:", TOYFLAG_USR|TOYFLAG_BIN))
USE_ID(NEWTOY(id, ">1"USE_ID_Z("Z")"nGgru[!"USE_ID_Z("Z")"Ggu]", TOYFLAG_USR|TOYFLAG_BIN))
USE_IFCONFIG(NEWTOY(ifconfig, "^?aS", TOYFLAG_SBIN))
USE_INIT(NEWTOY(init, "", TOYFLAG_SBIN))
-USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN))
+USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
USE_INSMOD(NEWTOY(insmod, "<1", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
USE_INSTALL(NEWTOY(install, "<1cdDp(preserve-timestamps)svt:m:o:g:", TOYFLAG_USR|TOYFLAG_BIN))
USE_IONICE(NEWTOY(ionice, "^tc#<0>3=2n#<0>7=5p#", TOYFLAG_USR|TOYFLAG_BIN))
diff --git a/mkroot/mkroot.sh b/mkroot/mkroot.sh
index 37a91642..a4879edd 100755
--- a/mkroot/mkroot.sh
+++ b/mkroot/mkroot.sh
@@ -53,6 +53,7 @@ ${CROSS_COMPILE}cc --static -xc - -o /dev/null <<< "int main(void){return 0;}"||
# ----- Create hermetic build environment
+rm -rf generated
if [ -z "$NOAIRLOCK"] && [ -n "$CROSS_COMPILE" ]; then
# When cross compiling set host $PATH to binaries with known behavior by
# - building a host toybox later builds use as their command line
@@ -152,7 +153,10 @@ root:x:0:0:root:/root:/bin/sh
guest:x:500:500:guest:/home/guest:/bin/sh
nobody:x:65534:65534:nobody:/proc/self:/dev/null
EOF
-echo -e 'root:x:0:\nguest:x:500:\nnobody:x:65534:' > "$ROOT"/etc/group || exit 1
+echo -e 'root:x:0:\nguest:x:500:\nnobody:x:65534:' > "$ROOT"/etc/group &&
+: ${VERSION:=$(toybox --version)} &&
+# Optional file, basically a comment
+echo $'NAME="mkroot"\nVERSION="'${VERSION#* }$'"\nHOME_URL="https://landley.net/toybox"' > "$ROOT"/etc/os-release || exit 1
# Build any packages listed on command line
for i in ${PKG:+plumbing $PKG}; do
@@ -177,6 +181,7 @@ fi
# Convert comma separated values in $1 to CONFIG=$2 lines
csv2cfg() { sed -E '/^$/d;s/([^,]*)($|,)/CONFIG_\1\n/g' <<< "$1" | sed '/^$/!{/=/!s/.*/&='"$2/}";}
+be2csv() { eval "echo $*" | tr ' ' ,; } # brace expansion to csv
# Set variables from $CROSS, die on unrecognized target:
# BUILTIN - if set, statically link initramfs into kernel image
@@ -191,12 +196,17 @@ get_target_config()
# Target-specific info in an (alphabetical order) if/else staircase
# Each target needs board config, serial console, RTC, ethernet, block device.
+ KARGS=ttyS0 VMLINUX=vmlinux
if [ "$CROSS" == armv5l ]; then
# This could use the same VIRT board as armv7, but let's demonstrate a
# different one requiring a separate device tree binary.
- QEMU="arm -M versatilepb -net nic,model=rtl8139 -net user"
KARCH=arm KARGS=ttyAMA0 VMLINUX=arch/arm/boot/zImage
- KCONF=CPU_ARM926T,MMU,VFP,ARM_THUMB,AEABI,ARCH_VERSATILE,ATAGS,DEPRECATED_PARAM_STRUCT,ARM_ATAG_DTB_COMPAT,ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND,SERIAL_AMBA_PL011,SERIAL_AMBA_PL011_CONSOLE,RTC_CLASS,RTC_DRV_PL031,RTC_HCTOSYS,PCI,PCI_VERSATILE,BLK_DEV_SD,SCSI,SCSI_LOWLEVEL,SCSI_SYM53C8XX_2,SCSI_SYM53C8XX_MMIO,NET_VENDOR_REALTEK,8139CP,SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+ QEMU="arm -M versatilepb -net nic,model=rtl8139 -net user"
+ KCONF="$(be2csv CPU_ARM926T MMU VFP ARM_THUMB AEABI ARCH_VERSATILE ATAGS \
+ DEPRECATED_PARAM_STRUCT BLK_DEV_SD NET_VENDOR_REALTEK 8139CP \
+ ARM_ATAG_DTB_COMPAT{,_CMDLINE_EXTEND} PCI{,_VERSATILE} \
+ SERIAL_AMBA_PL011{,_CONSOLE} RTC_{CLASS,DRV_PL031,HCTOSYS} \
+ SCSI{,_LOWLEVEL,_SYM53C8XX_{2,MMIO,DMA_ADDRESSING_MODE=0}})"
DTB=versatile-pb.dtb
elif [ "$CROSS" == armv7l ] || [ "$CROSS" == aarch64 ]; then
if [ "$CROSS" == aarch64 ]; then
@@ -206,9 +216,13 @@ get_target_config()
QEMU="arm -M virt" KARCH=arm VMLINUX=arch/arm/boot/zImage
fi
KARGS=ttyAMA0
- KCONF=MMU,ARCH_MULTI_V7,ARCH_VIRT,SOC_DRA7XX,ARCH_OMAP2PLUS_TYPICAL,ARCH_ALPINE,ARM_THUMB,VDSO,CPU_IDLE,ARM_CPUIDLE,KERNEL_MODE_NEON,SERIAL_AMBA_PL011,SERIAL_AMBA_PL011_CONSOLE,RTC_CLASS,RTC_HCTOSYS,RTC_DRV_PL031,VIRTIO_MENU,VIRTIO_NET,PCI,PCI_HOST_GENERIC,VIRTIO_BLK,VIRTIO_PCI,VIRTIO_MMIO,ATA,ATA_SFF,ATA_BMDMA,ATA_PIIX,PATA_PLATFORM,PATA_OF_PLATFORM,ATA_GENERIC,ARM_LPAE
+ KCONF="$(be2csv MMU SOC_DRA7XX VDSO CPU_IDLE KERNEL_MODE_NEON \
+ ARCH_{MULTI_V7,VIRT,OMAP2PLUS_TYPICAL,ALPINE} ARM_{THUMB,CPUIDLE,LPAE} \
+ ATA{,_SFF,_BMDMA,_PIIX,_GENERIC} VIRTIO_{MENU,NET,BLK,PCI,MMIO} \
+ SERIAL_AMBA_PL011{,_CONSOLE} RTC_{CLASS,HCTOSYS,DRV_PL031} \
+ PATA_{,OF_}PLATFORM PCI{,_HOST_GENERIC})"
elif [ "$CROSS" == hexagon ]; then
- QEMU="hexagon -M comet" KARGS=ttyS0 VMLINUX=vmlinux
+ QEMU="hexagon -M comet"
KARCH="hexagon LLVM_IAS=1" KCONF=SPI,SPI_BITBANG,IOMMU_SUPPORT
elif [ "$CROSS" == i486 ] || [ "$CROSS" == i686 ] ||
[ "$CROSS" == x86_64 ] || [ "$CROSS" == x32 ]; then
@@ -220,44 +234,73 @@ get_target_config()
QEMU=x86_64 KCONF=64BIT
[ "$CROSS" == x32 ] && KCONF=X86_X32
fi
- KARCH=x86 KARGS=ttyS0 VMLINUX=arch/x86/boot/bzImage
- KCONF=$KCONF,UNWINDER_FRAME_POINTER,PCI,BLK_DEV_SD,ATA,ATA_SFF,ATA_BMDMA,ATA_PIIX,NET_VENDOR_INTEL,E1000,SERIAL_8250,SERIAL_8250_CONSOLE,RTC_CLASS
+ KARCH=x86 VMLINUX=arch/x86/boot/bzImage
+ KCONF+=,"$(be2csv UNWINDER_FRAME_POINTER PCI BLK_DEV_SD NET_VENDOR_INTEL \
+ E1000 RTC_CLASS ATA{,_SFF,_BMDMA,_PIIX} SERIAL_8250{,_CONSOLE})"
elif [ "$CROSS" == m68k ]; then
- QEMU="m68k -M q800" KARCH=m68k KARGS=ttyS0 VMLINUX=vmlinux
- KCONF=MMU,M68040,M68KFPU_EMU,MAC,SCSI,SCSI_LOWLEVEL,BLK_DEV_SD,SCSI_MAC_ESP,MACINTOSH_DRIVERS,NET_VENDOR_NATSEMI,MACSONIC,SERIAL_PMACZILOG,SERIAL_PMACZILOG_TTYS,SERIAL_PMACZILOG_CONSOLE
+ QEMU="m68k -M q800" KARCH=m68k
+ KCONF="$(be2csv MMU M68040 M68KFPU_EMU MAC BLK_DEV_SD MACINTOSH_DRIVERS \
+ NET_VENDOR_NATSEMI MACSONIC SCSI{,_LOWLEVEL,_MAC_ESP} \
+ SERIAL_PMACZILOG{,_TTYS,_CONSOLE})"
+ elif [ "$CROSS" == microblaze ]; then
+ QEMU="microblaze -M petalogix-s3adsp1800" KARCH=microblaze KARGS=ttyUL0
+ KCONF="$(be2csv MMU CPU_BIG_ENDIAN SERIAL_UARTLITE{,_CONSOLE} \
+ XILINX_{EMACLITE,MICROBLAZE0_{FAMILY="spartan3adsp",USE_{{MSR,PCMP}_INSTR,BARREL,HW_MUL}=1}})"
elif [ "$CROSS" == mips ] || [ "$CROSS" == mipsel ]; then
- QEMU="mips -M malta" KARCH=mips KARGS=ttyS0 VMLINUX=vmlinux
- KCONF=MIPS_MALTA,CPU_MIPS32_R2,SERIAL_8250,SERIAL_8250_CONSOLE,PCI,BLK_DEV_SD,ATA,ATA_SFF,ATA_BMDMA,ATA_PIIX,NET_VENDOR_AMD,PCNET32,POWER_RESET,POWER_RESET_SYSCON
- [ "$CROSS" == mipsel ] && KCONF=$KCONF,CPU_LITTLE_ENDIAN &&
+ QEMU="mips -M malta" KARCH=mips
+ KCONF="$(be2csv MIPS_MALTA CPU_MIPS32_R2 BLK_DEV_SD NET_VENDOR_AMD PCNET32 \
+ PCI SERIAL_8250{,_CONSOLE} ATA{,_SFF,_BMDMA,_PIIX} POWER_RESET{,_SYSCON})"
+ [ "$CROSS" == mipsel ] && KCONF+=,CPU_LITTLE_ENDIAN &&
QEMU="mipsel -M malta"
elif [ "$CROSS" == or1k ]; then
- KARCH=openrisc QEMU="or1k -M or1k-sim" KARGS=FIXME VMLINUX=vmlinux BUILTIN=1
- KCONF=OPENRISC_BUILTIN_DTB=\"or1ksim\",ETHOC,SERIO,SERIAL_8250,SERIAL_8250_CONSOLE,SERIAL_OF_PLATFORM
+ KARCH=openrisc QEMU="or1k -M or1k-sim" KARGS=FIXME BUILTIN=1
+ KCONF="$(be2csv OPENRISC_BUILTIN_DTB=\\\"or1ksim\\\" ETHOC SERIO \
+ SERIAL_OF_PLATFORM SERIAL_8250{,_CONSOLE})"
elif [ "$CROSS" == powerpc ]; then
- KARCH=powerpc QEMU="ppc -M g3beige" KARGS=ttyS0 VMLINUX=vmlinux
- KCONF=ALTIVEC,PPC_PMAC,PPC_OF_BOOT_TRAMPOLINE,ATA,ATA_SFF,ATA_BMDMA,PATA_MACIO,BLK_DEV_SD,MACINTOSH_DRIVERS,ADB,ADB_CUDA,NET_VENDOR_NATSEMI,NET_VENDOR_8390,NE2K_PCI,SERIO,SERIAL_PMACZILOG,SERIAL_PMACZILOG_TTYS,SERIAL_PMACZILOG_CONSOLE,BOOTX_TEXT
+ KARCH=powerpc QEMU="ppc -M g3beige"
+ KCONF="$(be2csv ALTIVEC PATA_MACIO BLK_DEV_SD MACINTOSH_DRIVERS SERIO \
+ NET_VENDOR_8390 NE2K_PCI BOOTX_TEXT PPC_{PMAC,OF_BOOT_TRAMPOLINE} \
+ ATA{,_SFF,_BMDMA} ADB{,_CUDA} SERIAL_PMACZILOG{,_TTYS,_CONSOLE})"
elif [ "$CROSS" == powerpc64 ] || [ "$CROSS" == powerpc64le ]; then
KARCH=powerpc QEMU="ppc64 -M pseries -vga none" KARGS=hvc0
- VMLINUX=vmlinux
- KCONF=PPC64,PPC_PSERIES,PPC_OF_BOOT_TRAMPOLINE,BLK_DEV_SD,SCSI_LOWLEVEL,SCSI_IBMVSCSI,ATA,NET_VENDOR_IBM,IBMVETH,HVC_CONSOLE,PPC_TRANSACTIONAL_MEM,PPC_DISABLE_WERROR,SECTION_MISMATCH_WARN_ONLY
+ KCONF="$(be2csv PPC64 BLK_DEV_SD ATA NET_VENDOR_IBM IBMVETH HVC_CONSOLE \
+ PPC_{PSERIES,OF_BOOT_TRAMPOLINE,TRANSACTIONAL_MEM,DISABLE_WERROR} \
+ SCSI_{LOWLEVEL,IBMVSCSI})"
+#SECTION_MISMATCH_WARN_ONLY
[ "$CROSS" == powerpc64le ] && KCONF=$KCONF,CPU_LITTLE_ENDIAN
elif [ "$CROSS" = s390x ]; then
QEMU="s390x" KARCH=s390 VMLINUX=arch/s390/boot/bzImage
- KCONF=MARCH_Z900,PACK_STACK,VIRTIO_NET,VIRTIO_BLK,SCLP_TTY,SCLP_CONSOLE,SCLP_VT220_TTY,SCLP_VT220_CONSOLE,S390_GUEST
+ KCONF="$(be2csv MARCH_Z900 PACK_STACK S390_GUEST VIRTIO_{NET,BLK} \
+ SCLP_{TTY,CONSOLE,VT220_{TTY,CONSOLE}})"
elif [ "$CROSS" == sh2eb ]; then
- BUILTIN=1 KARCH=sh VMLINUX=vmlinux
- KCONF=CPU_SUBTYPE_J2,CPU_BIG_ENDIAN,SH_JCORE_SOC,SMP,BINFMT_ELF_FDPIC,JCORE_EMAC,SERIAL_UARTLITE,SERIAL_UARTLITE_CONSOLE,HZ_100,CMDLINE_OVERWRITE,SPI,SPI_JCORE,MMC,PWRSEQ_SIMPLE,MMC_BLOCK,MMC_SPI,BINMT_FLAT,BINFMT_MISC,DNOTIFY,INOTIFY_USER,FUSE_FS,I2C,I2C_HELPER_AUTO,LOCALVERSION_AUTO,MTD,MTD_SPI_NOR,MTD_SST25L,MTD_OF_PARTS,POSIX_MQUEUE,SYSVIPC,UEVENT_HELPER,UIO,UIO_PDRV_GENIRQ,FLATMEM_MANUAL,MEMORY_START=0x10000000,CMDLINE=\"console=ttyUL0\ earlycon\"
- KCONF+=,BFP_SYSCALL,CRYPTO_DES,CRYPTO_DH,CRYPTO_ECHAINIV,CRYPTO_LZO,CRYPTO_MANAGER_DISABLE_TESTS,CRYPTO_RSA,CRYPTO_SHA1,CRYPTO_SHA3,INET_DIAG,SERIAL_8250
- # TODO NET_9P,9P_FS fails to boot in 6.3, unaligned access?
- elif [ "$CROSS" == sh4 ]; then
- QEMU="sh4 -M r2d -serial null -serial mon:stdio" KARCH=sh
+ BUILTIN=1 KARCH=sh
+ KCONF="$(be2csv CPU_{SUBTYPE_J2,BIG_ENDIAN} SH_JCORE_SOC SMP JCORE_EMAC \
+ FLATMEM_MANUAL MEMORY_START=0x10000000 CMDLINE_OVERWRITE DNOTIFY FUSE_FS \
+ INOTIFY_USER SPI{,_JCORE} SERIAL_UARTLITE{,_CONSOLE} PWRSEQ_SIMPLE \
+ MMC{,_BLOCK,_SPI} UIO{,_PDRV_GENIRQ} MTD{,_SPI_NOR,_SST25L,_OF_PARTS} \
+ BINFMT_{ELF_FDPIC,MISC} I2C{,_HELPER_AUTO})"
+ KCONF+=,CMDLINE=\"console=ttyUL0\ earlycon\"
+ elif [ "$CROSS" == sh4 ] || [ "$CROSS" == sh4eb ]; then
+ QEMU="$CROSS -M r2d -serial null -serial mon:stdio" KARCH=sh
KARGS="ttySC1 noiotrap" VMLINUX=arch/sh/boot/zImage
- KCONF=CPU_SUBTYPE_SH7751R,MMU,VSYSCALL,SH_FPU,SH_RTS7751R2D,RTS7751R2D_PLUS,SERIAL_SH_SCI,SERIAL_SH_SCI_CONSOLE,PCI,NET_VENDOR_REALTEK,8139CP,PCI,BLK_DEV_SD,ATA,ATA_SFF,ATA_BMDMA,PATA_PLATFORM,BINFMT_ELF_FDPIC,BINFMT_FLAT,MEMORY_START=0x0c000000
+ KCONF="$(be2csv CPU_SUBTYPE_SH7751R MMU VSYSCALL SH_{FPU,RTS7751R2D} PCI \
+ RTS7751R2D_PLUS SERIAL_SH_SCI{,_CONSOLE} NET_VENDOR_REALTEK 8139CP \
+ BLK_DEV_SD ATA{,_SFF,_BMDMA} PATA_PLATFORM BINFMT_ELF_FDPIC \
+ MEMORY_START=0x0c000000)"
#see also SPI SPI_SH_SCI MFD_SM501 RTC_CLASS RTC_DRV_R9701 RTC_DRV_SH RTC_HCTOSYS
+ [ "$CROSS" == sh4eb ] && KCONF+=,CPU_BIG_ENDIAN
else die "Unknown \$CROSS=$CROSS"
fi
}
+# Linux kernel .config symbols common to all architectures
+: ${GENERIC_KCONF:=$(be2csv PANIC_TIMEOUT=1 NO_HZ HIGH_RES_TIMERS RD_GZIP \
+ BINFMT_{ELF,SCRIPT} BLK_DEV{,_INITRD,_LOOP} EXT4_{FS,USE_FOR_EXT2} \
+ VFAT_FS FAT_DEFAULT_UTF8 MISC_FILESYSTEMS NLS_{CODEPAGE_437,ISO8859_1} \
+ SQUASHFS{,_XATTR,_ZLIB} TMPFS{,_POSIX_ACL} DEVTMPFS{,_MOUNT} \
+ NET{,DEVICES,_CORE,CONSOLE} PACKET UNIX INET IPV6 ETHERNET \
+ COMPAT_32BIT_TIME EARLY_PRINTK IKCONFIG{,_PROC})}
+
# ----- Build kernel for target
if [ -z "$LINUX" ] || [ ! -d "$LINUX/kernel" ]; then
@@ -269,8 +312,9 @@ else
get_target_config
# Write the qemu launch script
+ INITRAMFS=initramfs.cpio.gz
if [ -n "$QEMU" ]; then
- [ -z "$BUILTIN" ] && INITRD='-initrd "$DIR"/initramfs.cpio.gz'
+ [ -z "$BUILTIN" ] && INITRD='-initrd "$DIR"/'"$INITRAMFS"
{ echo DIR='"$(dirname $0)";' qemu-system-"$QEMU" -m 256 '"$@"' $QEMU_MORE \
-nographic -no-reboot -kernel '"$DIR"'/linux-kernel $INITRD \
${DTB:+-dtb '"$DIR"'/linux.dtb} \
@@ -284,22 +328,27 @@ else
pushd "$LINUX" && make distclean && popd &&
cp -sfR "$LINUX" "$TEMP/linux" && pushd "$TEMP/linux" &&
- # Write linux-miniconfig
+ # Write microconfig (minimal symbol name/value list in CSV format)
mkdir -p "$OUTDOC" &&
- { echo "# make ARCH=$KARCH allnoconfig KCONFIG_ALLCONFIG=linux-miniconfig"
- echo -e "# make ARCH=$KARCH -j \$(nproc)\n# boot $VMLINUX\n\n"
-
- # Expand list of =y symbols, first generic then architecture-specific
- for i in BINFMT_ELF,BINFMT_SCRIPT,PANIC_TIMEOUT=1,NO_HZ,HIGH_RES_TIMERS,BLK_DEV,BLK_DEV_INITRD,RD_GZIP,BLK_DEV_LOOP,EXT4_FS,EXT4_USE_FOR_EXT2,VFAT_FS,FAT_DEFAULT_UTF8,NLS_CODEPAGE_437,NLS_ISO8859_1,MISC_FILESYSTEMS,SQUASHFS,SQUASHFS_XATTR,SQUASHFS_ZLIB,DEVTMPFS,DEVTMPFS_MOUNT,TMPFS,TMPFS_POSIX_ACL,NET,PACKET,UNIX,INET,IPV6,NETDEVICES,NET_CORE,NETCONSOLE,ETHERNET,COMPAT_32BIT_TIME,EARLY_PRINTK,IKCONFIG,IKCONFIG_PROC "$KCONF" ${MODULES+MODULES,MODULE_UNLOAD} "$KEXTRA" ; do
- echo "$i" >> "$OUTDOC"/linux-microconfig
+ for i in "$GENERIC_KCONF" "$KCONF" ${MODULES+MODULES,MODULE_UNLOAD} "$KEXTRA"
+ do echo "$i"; done > "$OUTDOC"/linux-microconfig &&
+
+ # expand to miniconfig (symbol list to switch on after running "allnoconfig")
+ {
+ echo "# make ARCH=$KARCH allnoconfig KCONFIG_ALLCONFIG=linux-miniconfig"
+ echo "# make ARCH=$KARCH -j \$(nproc)"
+ echo "# boot $VMLINUX${DTB:+ dtb $DTB} console=$KARGS"
+ echo
+ while read i; do
echo "# architecture ${X:-independent}"
csv2cfg "$i" y
X=${X:+extra} X=${X:-specific}
- done
+ done < "$OUTDOC"/linux-microconfig
[ -n "$BUILTIN" ] && echo -e CONFIG_INITRAMFS_SOURCE="\"$OUTPUT/fs\""
for i in $MODULES; do csv2cfg "$i" m; done
- echo "$KERNEL_CONFIG"
} > "$OUTDOC/linux-miniconfig" &&
+
+ # Expand miniconfig to full .config
make ARCH=$KARCH allnoconfig KCONFIG_ALLCONFIG="$OUTDOC/linux-miniconfig" &&
# Second config pass to remove stupid kernel defaults
@@ -322,12 +371,11 @@ else
fi
# clean up and package root filesystem for initramfs.
-if [ -z "$BUILTIN" ]; then
- announce initramfs
- { (cd "$ROOT" && find . -printf '%P\n' | cpio -o -H newc -R +0:+0 ) || exit 1
- ! test -e "$OUTDOC/modules.cpio.gz" || zcat $_;} | gzip \
- > "$OUTPUT"/initramfs.cpio.gz || exit 1
-fi
+announce initramfs
+[ -z "$BUILTIN" ] && DIR="$OUTPUT" || DIR="$OUTDOC"
+{ (cd "$ROOT" && find . -printf '%P\n' | cpio -o -H newc -R +0:+0 ) || exit 1
+ ! test -e "$OUTDOC/modules.cpio.gz" || zcat $_;} | gzip \
+ > "$DIR/$INITRAMFS" || exit 1
mv "$LOG".{n,y} && echo "Output is in $OUTPUT"
rmdir "$TEMP" 2>/dev/null || exit 0 # remove if empty, not an error
diff --git a/mkroot/packages/tests b/mkroot/packages/tests
index bca3b40c..5e27f4a1 100755
--- a/mkroot/packages/tests
+++ b/mkroot/packages/tests
@@ -10,6 +10,5 @@ download 6694284723e034f0c564e81a30879939d5ef8b7e \
cp "$DOWNLOAD"/{usb,pci}.ids "$ROOT/etc/" || exit 1
-# Enable module support in the kernel and add a couple test modules
-KEXTRA=MODULES,MODULE_UNLOAD,"$KEXTRA"
+# add a couple test modules
MODULES+=FSCACHE,CACHEFILES
diff --git a/mkroot/record-commands b/mkroot/record-commands
index 6e63c5b7..32557a3e 100755
--- a/mkroot/record-commands
+++ b/mkroot/record-commands
@@ -16,13 +16,11 @@ if [ ! -x "$WRAPDIR/logpath" ]
then
mkdir -p "$WRAPDIR" || exit 1
[ -e "$(which logpath)" ] && cp -H "$(which logpath)" "$WRAPDIR/logpath" ||
- mkdir -p "$WRAPDIR" && PREFIX="$WRAPDIR/" scripts/single.sh logpath ||
- exit 1
- find $(tr : '\n' <<< "$PATH") -type f,l -maxdepth 1 -executable \
- -exec basename {} \; | while read FILE
- do
- ln -s logpath "$WRAPDIR/$FILE" 2>/dev/null
- done
+ PREFIX="$WRAPDIR/" scripts/single.sh logpath || exit 1
+ tr : '\n' <<< "$PATH" | while read i; do
+ find "$i" -type f,l -maxdepth 1 -executable -exec basename {} \; | \
+ while read FILE; do ln -s logpath "$WRAPDIR/$FILE" 2>/dev/null; done
+ done
fi
# Delete old log (if any)
@@ -34,8 +32,7 @@ if [ ${#BASH_SOURCE[@]} -lt 2 ]
then
"$@"
X=$?
-
- [ ! -z "$RM" ] && "$RM" -rf "$WRAPDIR"
+ [ -n "$RM" ] && "$RM" -rf "$WRAPDIR"
exit $X
fi
diff --git a/mkroot/tar-for-web.sh b/mkroot/tar-for-web.sh
index c31b2888..5bb6d80c 100755
--- a/mkroot/tar-for-web.sh
+++ b/mkroot/tar-for-web.sh
@@ -25,11 +25,11 @@ Bootable system images created by:
mkroot/mkroot.sh LINUX=~/linux CROSS=allnonstop
Each system image is built from two packages: toybox and linux.
-Run the ./qemu-*.sh script in each tarball to boot the system
-to a shell prompt under qemu. Run the "exit" command to shut down the
-virtual system and exit the emulator.
+The run-qemu.sh script in each tarball should boot the system
+to a shell prompt under qemu, exit from that shell to shut down the
+virtual system and stop the emulator.
-See https://landley.net/toybox/FAQ.html#mkroot for details.
+See https://landley.net/toybox/faq.html#mkroot for details.
Built from mkroot $(git describe --tags), and Linux $KVERS with patches in linux-patches/
EOF
diff --git a/scripts/mcm-buildall.sh b/scripts/mcm-buildall.sh
index b5b19e5e..a27b9c07 100755
--- a/scripts/mcm-buildall.sh
+++ b/scripts/mcm-buildall.sh
@@ -29,7 +29,8 @@ TARGETS=(i686:: aarch64:eabi:
"armv7m:eabi:--with-arch=armv7-m --with-mode=thumb --disable-libatomic --enable-default-pie"
armv7r:eabihf:"--with-arch=armv7-r --enable-default-pie"
i486:: m68k:: microblaze:: mips:: mips64:: mipsel:: or1k:: powerpc::
- powerpc64:: powerpc64le:: riscv64:: s390x:: sh2eb:fdpic:--with-cpu=mj2
+ powerpc64:: powerpc64le:: riscv32:: riscv64:: s390x::
+ sh2eb:fdpic:--with-cpu=mj2
sh4::--enable-incomplete-targets sh4eb::--enable-incomplete-targets
x86_64::--with-mtune=nocona x86_64@x32:x32:
)
@@ -173,13 +174,13 @@ patch_mcm()
# and doesn't even use the latest musl release by default, so fix it up.
# Select newer package versions and don't use dodgy mirrors
- sed -i 's/mirror//;s/\(LINUX_VER =\).*/\1 6.6/;s/\(GCC_VER =\).*/\1 11.2.0/' \
+ sed -i 's/mirror//;s/\(LINUX_VER =\).*/\1 6.8/;s/\(GCC_VER =\).*/\1 11.2.0/' \
Makefile &&
- echo 'c8dbfa8285f1a90596a227690653d84b9eb2debe linux-6.6.tar.xz' > \
- hashes/linux-6.6.tar.xz.sha1 &&
+ echo 'c9ab5b95c0b8e9e41290d3fc53b4e5cb2e8abb75 linux-6.8.tar.xz' > \
+ hashes/linux-6.8.tar.xz.sha1 &&
# mcm redundantly downloads tarball if hash file has newer timestamp,
# and it whack-a-moles how to download kernels by version for some reason.
- touch -d @1 hashes/linux-6.6.tar.xz.sha1 &&
+ touch -d @1 hashes/linux-6.8.tar.xz.sha1 &&
sed -i 's/\(.*linux-\)3\(.*\)v3.x/\16\2v6.x/' Makefile &&
# nommu toolchains need to vfork()+pipe, and or1k has different kernel arch
diff --git a/scripts/prereq/build.sh b/scripts/prereq/build.sh
new file mode 100755
index 00000000..4c88dbab
--- /dev/null
+++ b/scripts/prereq/build.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+BUILD='cc -funsigned-char -I scripts/prereq -I . -Os -ffunction-sections -fdata-sections -fno-asynchronous-unwind-tables -fno-strict-aliasing -DTOYBOX_VERSION=""'
+LINK=''
+FILES="
+main.c toys/lsb/gzip.c toys/other/readlink.c toys/other/taskset.c
+toys/other/which.c toys/pending/tr.c toys/posix/basename.c toys/posix/cat.c
+toys/posix/chmod.c toys/posix/cmp.c toys/posix/dirname.c toys/posix/echo.c
+toys/posix/fold.c toys/posix/grep.c toys/posix/head.c toys/posix/ln.c
+toys/posix/ls.c toys/posix/mkdir.c toys/posix/od.c toys/posix/rm.c
+toys/posix/sed.c toys/posix/sort.c toys/posix/tail.c toys/posix/tee.c
+toys/posix/uname.c toys/posix/wc.c toys/posix/xargs.c
+"
+
+$BUILD lib/*.c $FILES $LINK -o toybox
diff --git a/scripts/prereq/generated/config.h b/scripts/prereq/generated/config.h
new file mode 100644
index 00000000..43eb0b6b
--- /dev/null
+++ b/scripts/prereq/generated/config.h
@@ -0,0 +1,704 @@
+#define CFG_TOYBOX_ON_ANDROID 0
+#define USE_TOYBOX_ON_ANDROID(...)
+#define CFG_TOYBOX_FORK 1
+#define USE_TOYBOX_FORK(...) __VA_ARGS__
+#define CFG_BASENAME 1
+#define USE_BASENAME(...) __VA_ARGS__
+#define CFG_CAL 0
+#define USE_CAL(...)
+#define CFG_CAT 1
+#define USE_CAT(...) __VA_ARGS__
+#define CFG_CHGRP 0
+#define USE_CHGRP(...)
+#define CFG_CHOWN 0
+#define USE_CHOWN(...)
+#define CFG_CHMOD 1
+#define USE_CHMOD(...) __VA_ARGS__
+#define CFG_CKSUM 0
+#define USE_CKSUM(...)
+#define CFG_CRC32 0
+#define USE_CRC32(...)
+#define CFG_CMP 1
+#define USE_CMP(...) __VA_ARGS__
+#define CFG_COMM 0
+#define USE_COMM(...)
+#define CFG_CP 0
+#define USE_CP(...)
+#define CFG_MV 0
+#define USE_MV(...)
+#define CFG_INSTALL 0
+#define USE_INSTALL(...)
+#define CFG_CPIO 0
+#define USE_CPIO(...)
+#define CFG_CUT 0
+#define USE_CUT(...)
+#define CFG_DATE 0
+#define USE_DATE(...)
+#define CFG_DD 0
+#define USE_DD(...)
+#define CFG_DF 0
+#define USE_DF(...)
+#define CFG_DIRNAME 1
+#define USE_DIRNAME(...) __VA_ARGS__
+#define CFG_DU 0
+#define USE_DU(...)
+#define CFG_ECHO 1
+#define USE_ECHO(...) __VA_ARGS__
+#define CFG_ENV 0
+#define USE_ENV(...)
+#define CFG_EXPAND 0
+#define USE_EXPAND(...)
+#define CFG_FALSE 0
+#define USE_FALSE(...)
+#define CFG_FILE 0
+#define USE_FILE(...)
+#define CFG_FIND 0
+#define USE_FIND(...)
+#define CFG_FOLD 1
+#define USE_FOLD(...) __VA_ARGS__
+#define CFG_GETCONF 0
+#define USE_GETCONF(...)
+#define CFG_GREP 1
+#define USE_GREP(...) __VA_ARGS__
+#define CFG_EGREP 1
+#define USE_EGREP(...) __VA_ARGS__
+#define CFG_FGREP 1
+#define USE_FGREP(...) __VA_ARGS__
+#define CFG_HEAD 1
+#define USE_HEAD(...) __VA_ARGS__
+#define CFG_ICONV 0
+#define USE_ICONV(...)
+#define CFG_ID 0
+#define USE_ID(...)
+#define CFG_ID_Z 0
+#define USE_ID_Z(...)
+#define CFG_GROUPS 0
+#define USE_GROUPS(...)
+#define CFG_LOGNAME 0
+#define USE_LOGNAME(...)
+#define CFG_WHOAMI 0
+#define USE_WHOAMI(...)
+#define CFG_KILL 0
+#define USE_KILL(...)
+#define CFG_KILLALL5 0
+#define USE_KILLALL5(...)
+#define CFG_LINK 0
+#define USE_LINK(...)
+#define CFG_LN 1
+#define USE_LN(...) __VA_ARGS__
+#define CFG_LOGGER 0
+#define USE_LOGGER(...)
+#define CFG_LS 1
+#define USE_LS(...) __VA_ARGS__
+#define CFG_MKDIR 1
+#define USE_MKDIR(...) __VA_ARGS__
+#define CFG_MKDIR_Z 0
+#define USE_MKDIR_Z(...)
+#define CFG_MKFIFO 0
+#define USE_MKFIFO(...)
+#define CFG_MKFIFO_Z 0
+#define USE_MKFIFO_Z(...)
+#define CFG_NICE 0
+#define USE_NICE(...)
+#define CFG_NL 0
+#define USE_NL(...)
+#define CFG_NOHUP 0
+#define USE_NOHUP(...)
+#define CFG_OD 1
+#define USE_OD(...) __VA_ARGS__
+#define CFG_PASTE 0
+#define USE_PASTE(...)
+#define CFG_PATCH 0
+#define USE_PATCH(...)
+#define CFG_PRINTF 0
+#define USE_PRINTF(...)
+#define CFG_PS 0
+#define USE_PS(...)
+#define CFG_TOP 0
+#define USE_TOP(...)
+#define CFG_IOTOP 0
+#define USE_IOTOP(...)
+#define CFG_PGREP 0
+#define USE_PGREP(...)
+#define CFG_PKILL 0
+#define USE_PKILL(...)
+#define CFG_PWD 0
+#define USE_PWD(...)
+#define CFG_RENICE 0
+#define USE_RENICE(...)
+#define CFG_RM 1
+#define USE_RM(...) __VA_ARGS__
+#define CFG_RMDIR 0
+#define USE_RMDIR(...)
+#define CFG_SED 1
+#define USE_SED(...) __VA_ARGS__
+#define CFG_SLEEP 0
+#define USE_SLEEP(...)
+#define CFG_SORT 1
+#define USE_SORT(...) __VA_ARGS__
+#define CFG_SORT_FLOAT 0
+#define USE_SORT_FLOAT(...)
+#define CFG_SPLIT 0
+#define USE_SPLIT(...)
+#define CFG_STRINGS 0
+#define USE_STRINGS(...)
+#define CFG_TAIL 1
+#define USE_TAIL(...) __VA_ARGS__
+#define CFG_TAR 0
+#define USE_TAR(...)
+#define CFG_TEE 1
+#define USE_TEE(...) __VA_ARGS__
+#define CFG_TEST 0
+#define USE_TEST(...)
+#define CFG_TEST_GLUE 0
+#define USE_TEST_GLUE(...)
+#define CFG_TIME 0
+#define USE_TIME(...)
+#define CFG_TOUCH 0
+#define USE_TOUCH(...)
+#define CFG_TRUE 0
+#define USE_TRUE(...)
+#define CFG_TSORT 0
+#define USE_TSORT(...)
+#define CFG_TTY 0
+#define USE_TTY(...)
+#define CFG_ULIMIT 0
+#define USE_ULIMIT(...)
+#define CFG_ARCH 0
+#define USE_ARCH(...)
+#define CFG_UNAME 1
+#define USE_UNAME(...) __VA_ARGS__
+#define CFG_UNIQ 0
+#define USE_UNIQ(...)
+#define CFG_UNLINK 0
+#define USE_UNLINK(...)
+#define CFG_UUDECODE 0
+#define USE_UUDECODE(...)
+#define CFG_UUENCODE 0
+#define USE_UUENCODE(...)
+#define CFG_WC 1
+#define USE_WC(...) __VA_ARGS__
+#define CFG_WHO 0
+#define USE_WHO(...)
+#define CFG_XARGS 1
+#define USE_XARGS(...) __VA_ARGS__
+#define CFG_ARP 0
+#define USE_ARP(...)
+#define CFG_ARPING 0
+#define USE_ARPING(...)
+#define CFG_BC 0
+#define USE_BC(...)
+#define CFG_BOOTCHARTD 0
+#define USE_BOOTCHARTD(...)
+#define CFG_BRCTL 0
+#define USE_BRCTL(...)
+#define CFG_CHSH 0
+#define USE_CHSH(...)
+#define CFG_CROND 0
+#define USE_CROND(...)
+#define CFG_CRONTAB 0
+#define USE_CRONTAB(...)
+#define CFG_CSPLIT 0
+#define USE_CSPLIT(...)
+#define CFG_DHCP 0
+#define USE_DHCP(...)
+#define CFG_DHCP6 0
+#define USE_DHCP6(...)
+#define CFG_DHCPD 0
+#define USE_DHCPD(...)
+#define CFG_DEBUG_DHCP 0
+#define USE_DEBUG_DHCP(...)
+#define CFG_DIFF 0
+#define USE_DIFF(...)
+#define CFG_DUMPLEASES 0
+#define USE_DUMPLEASES(...)
+#define CFG_EXPR 0
+#define USE_EXPR(...)
+#define CFG_FDISK 0
+#define USE_FDISK(...)
+#define CFG_FSCK 0
+#define USE_FSCK(...)
+#define CFG_GETFATTR 0
+#define USE_GETFATTR(...)
+#define CFG_GETTY 0
+#define USE_GETTY(...)
+#define CFG_GITCOMPAT 0
+#define USE_GITCOMPAT(...)
+#define CFG_GITCLONE 0
+#define USE_GITCLONE(...)
+#define CFG_GITINIT 0
+#define USE_GITINIT(...)
+#define CFG_GITREMOTE 0
+#define USE_GITREMOTE(...)
+#define CFG_GITFETCH 0
+#define USE_GITFETCH(...)
+#define CFG_GITCHECKOUT 0
+#define USE_GITCHECKOUT(...)
+#define CFG_GROUPADD 0
+#define USE_GROUPADD(...)
+#define CFG_GROUPDEL 0
+#define USE_GROUPDEL(...)
+#define CFG_HEXDUMP 0
+#define USE_HEXDUMP(...)
+#define CFG_HD 0
+#define USE_HD(...)
+#define CFG_INIT 0
+#define USE_INIT(...)
+#define CFG_IP 0
+#define USE_IP(...)
+#define CFG_IPCRM 0
+#define USE_IPCRM(...)
+#define CFG_IPCS 0
+#define USE_IPCS(...)
+#define CFG_KLOGD 0
+#define USE_KLOGD(...)
+#define CFG_KLOGD_SOURCE_RING_BUFFER 0
+#define USE_KLOGD_SOURCE_RING_BUFFER(...)
+#define CFG_LAST 0
+#define USE_LAST(...)
+#define CFG_LSOF 0
+#define USE_LSOF(...)
+#define CFG_MAN 0
+#define USE_MAN(...)
+#define CFG_MDEV 0
+#define USE_MDEV(...)
+#define CFG_MDEV_CONF 0
+#define USE_MDEV_CONF(...)
+#define CFG_MKE2FS 0
+#define USE_MKE2FS(...)
+#define CFG_MKE2FS_JOURNAL 0
+#define USE_MKE2FS_JOURNAL(...)
+#define CFG_MKE2FS_GEN 0
+#define USE_MKE2FS_GEN(...)
+#define CFG_MKE2FS_LABEL 0
+#define USE_MKE2FS_LABEL(...)
+#define CFG_MKE2FS_EXTENDED 0
+#define USE_MKE2FS_EXTENDED(...)
+#define CFG_MODPROBE 0
+#define USE_MODPROBE(...)
+#define CFG_MORE 0
+#define USE_MORE(...)
+#define CFG_ROUTE 0
+#define USE_ROUTE(...)
+#define CFG_SH 0
+#define USE_SH(...)
+#define CFG_CD 0
+#define USE_CD(...)
+#define CFG_DECLARE 0
+#define USE_DECLARE(...)
+#define CFG_EXIT 0
+#define USE_EXIT(...)
+#define CFG_SET 0
+#define USE_SET(...)
+#define CFG_UNSET 0
+#define USE_UNSET(...)
+#define CFG_EVAL 0
+#define USE_EVAL(...)
+#define CFG_EXEC 0
+#define USE_EXEC(...)
+#define CFG_EXPORT 0
+#define USE_EXPORT(...)
+#define CFG_JOBS 0
+#define USE_JOBS(...)
+#define CFG_LOCAL 0
+#define USE_LOCAL(...)
+#define CFG_SHIFT 0
+#define USE_SHIFT(...)
+#define CFG_SOURCE 0
+#define USE_SOURCE(...)
+#define CFG_WAIT 0
+#define USE_WAIT(...)
+#define CFG_STRACE 0
+#define USE_STRACE(...)
+#define CFG_STTY 0
+#define USE_STTY(...)
+#define CFG_SULOGIN 0
+#define USE_SULOGIN(...)
+#define CFG_SYSLOGD 0
+#define USE_SYSLOGD(...)
+#define CFG_TCPSVD 0
+#define USE_TCPSVD(...)
+#define CFG_TELNET 0
+#define USE_TELNET(...)
+#define CFG_TELNETD 0
+#define USE_TELNETD(...)
+#define CFG_TFTP 0
+#define USE_TFTP(...)
+#define CFG_TFTPD 0
+#define USE_TFTPD(...)
+#define CFG_TR 1
+#define USE_TR(...) __VA_ARGS__
+#define CFG_TRACEROUTE 0
+#define USE_TRACEROUTE(...)
+#define CFG_USERADD 0
+#define USE_USERADD(...)
+#define CFG_USERDEL 0
+#define USE_USERDEL(...)
+#define CFG_VI 0
+#define USE_VI(...)
+#define CFG_XZCAT 0
+#define USE_XZCAT(...)
+#define CFG_ACPI 0
+#define USE_ACPI(...)
+#define CFG_ASCII 0
+#define USE_ASCII(...)
+#define CFG_UNICODE 0
+#define USE_UNICODE(...)
+#define CFG_BASE64 0
+#define USE_BASE64(...)
+#define CFG_BASE32 0
+#define USE_BASE32(...)
+#define CFG_BLKDISCARD 0
+#define USE_BLKDISCARD(...)
+#define CFG_BLKID 0
+#define USE_BLKID(...)
+#define CFG_FSTYPE 0
+#define USE_FSTYPE(...)
+#define CFG_BLOCKDEV 0
+#define USE_BLOCKDEV(...)
+#define CFG_BUNZIP2 0
+#define USE_BUNZIP2(...)
+#define CFG_BZCAT 0
+#define USE_BZCAT(...)
+#define CFG_CHCON 0
+#define USE_CHCON(...)
+#define CFG_CHROOT 0
+#define USE_CHROOT(...)
+#define CFG_CHRT 0
+#define USE_CHRT(...)
+#define CFG_CLEAR 0
+#define USE_CLEAR(...)
+#define CFG_COUNT 0
+#define USE_COUNT(...)
+#define CFG_DEVMEM 0
+#define USE_DEVMEM(...)
+#define CFG_DOS2UNIX 0
+#define USE_DOS2UNIX(...)
+#define CFG_UNIX2DOS 0
+#define USE_UNIX2DOS(...)
+#define CFG_EJECT 0
+#define USE_EJECT(...)
+#define CFG_FACTOR 0
+#define USE_FACTOR(...)
+#define CFG_FALLOCATE 0
+#define USE_FALLOCATE(...)
+#define CFG_FLOCK 0
+#define USE_FLOCK(...)
+#define CFG_FMT 0
+#define USE_FMT(...)
+#define CFG_FREE 0
+#define USE_FREE(...)
+#define CFG_FREERAMDISK 0
+#define USE_FREERAMDISK(...)
+#define CFG_FSFREEZE 0
+#define USE_FSFREEZE(...)
+#define CFG_FSYNC 0
+#define USE_FSYNC(...)
+#define CFG_GETOPT 0
+#define USE_GETOPT(...)
+#define CFG_GPIODETECT 0
+#define USE_GPIODETECT(...)
+#define CFG_GPIOFIND 0
+#define USE_GPIOFIND(...)
+#define CFG_GPIOINFO 0
+#define USE_GPIOINFO(...)
+#define CFG_GPIOGET 0
+#define USE_GPIOGET(...)
+#define CFG_GPIOSET 0
+#define USE_GPIOSET(...)
+#define CFG_HELP 0
+#define USE_HELP(...)
+#define CFG_HEXEDIT 0
+#define USE_HEXEDIT(...)
+#define CFG_HWCLOCK 0
+#define USE_HWCLOCK(...)
+#define CFG_I2CDETECT 0
+#define USE_I2CDETECT(...)
+#define CFG_I2CDUMP 0
+#define USE_I2CDUMP(...)
+#define CFG_I2CGET 0
+#define USE_I2CGET(...)
+#define CFG_I2CSET 0
+#define USE_I2CSET(...)
+#define CFG_I2CTRANSFER 0
+#define USE_I2CTRANSFER(...)
+#define CFG_INOTIFYD 0
+#define USE_INOTIFYD(...)
+#define CFG_INSMOD 0
+#define USE_INSMOD(...)
+#define CFG_IONICE 0
+#define USE_IONICE(...)
+#define CFG_IORENICE 0
+#define USE_IORENICE(...)
+#define CFG_LINUX32 0
+#define USE_LINUX32(...)
+#define CFG_LOGIN 0
+#define USE_LOGIN(...)
+#define CFG_LOSETUP 0
+#define USE_LOSETUP(...)
+#define CFG_LSATTR 0
+#define USE_LSATTR(...)
+#define CFG_CHATTR 0
+#define USE_CHATTR(...)
+#define CFG_LSMOD 0
+#define USE_LSMOD(...)
+#define CFG_LSPCI 0
+#define USE_LSPCI(...)
+#define CFG_LSUSB 0
+#define USE_LSUSB(...)
+#define CFG_MAKEDEVS 0
+#define USE_MAKEDEVS(...)
+#define CFG_MCOOKIE 0
+#define USE_MCOOKIE(...)
+#define CFG_MEMEATER 0
+#define USE_MEMEATER(...)
+#define CFG_MIX 0
+#define USE_MIX(...)
+#define CFG_MKPASSWD 0
+#define USE_MKPASSWD(...)
+#define CFG_MKSWAP 0
+#define USE_MKSWAP(...)
+#define CFG_MODINFO 0
+#define USE_MODINFO(...)
+#define CFG_MOUNTPOINT 0
+#define USE_MOUNTPOINT(...)
+#define CFG_NBD_CLIENT 0
+#define USE_NBD_CLIENT(...)
+#define CFG_NBD_SERVER 0
+#define USE_NBD_SERVER(...)
+#define CFG_UNSHARE 0
+#define USE_UNSHARE(...)
+#define CFG_NSENTER 0
+#define USE_NSENTER(...)
+#define CFG_ONEIT 0
+#define USE_ONEIT(...)
+#define CFG_OPENVT 0
+#define USE_OPENVT(...)
+#define CFG_CHVT 0
+#define USE_CHVT(...)
+#define CFG_DEALLOCVT 0
+#define USE_DEALLOCVT(...)
+#define CFG_PARTPROBE 0
+#define USE_PARTPROBE(...)
+#define CFG_PIVOT_ROOT 0
+#define USE_PIVOT_ROOT(...)
+#define CFG_PMAP 0
+#define USE_PMAP(...)
+#define CFG_PRINTENV 0
+#define USE_PRINTENV(...)
+#define CFG_PWDX 0
+#define USE_PWDX(...)
+#define CFG_PWGEN 0
+#define USE_PWGEN(...)
+#define CFG_READAHEAD 0
+#define USE_READAHEAD(...)
+#define CFG_READELF 0
+#define USE_READELF(...)
+#define CFG_READLINK 1
+#define USE_READLINK(...) __VA_ARGS__
+#define CFG_REALPATH 0
+#define USE_REALPATH(...)
+#define CFG_REBOOT 0
+#define USE_REBOOT(...)
+#define CFG_RESET 0
+#define USE_RESET(...)
+#define CFG_REV 0
+#define USE_REV(...)
+#define CFG_RMMOD 0
+#define USE_RMMOD(...)
+#define CFG_RTCWAKE 0
+#define USE_RTCWAKE(...)
+#define CFG_SETFATTR 0
+#define USE_SETFATTR(...)
+#define CFG_SETSID 0
+#define USE_SETSID(...)
+#define CFG_SHA3SUM 0
+#define USE_SHA3SUM(...)
+#define CFG_SHRED 0
+#define USE_SHRED(...)
+#define CFG_SHUF 0
+#define USE_SHUF(...)
+#define CFG_STAT 0
+#define USE_STAT(...)
+#define CFG_SWAPOFF 0
+#define USE_SWAPOFF(...)
+#define CFG_SWAPON 0
+#define USE_SWAPON(...)
+#define CFG_SWITCH_ROOT 0
+#define USE_SWITCH_ROOT(...)
+#define CFG_SYSCTL 0
+#define USE_SYSCTL(...)
+#define CFG_TAC 0
+#define USE_TAC(...)
+#define CFG_NPROC 1
+#define USE_NPROC(...) __VA_ARGS__
+#define CFG_TASKSET 0
+#define USE_TASKSET(...)
+#define CFG_TIMEOUT 0
+#define USE_TIMEOUT(...)
+#define CFG_TRUNCATE 0
+#define USE_TRUNCATE(...)
+#define CFG_TS 0
+#define USE_TS(...)
+#define CFG_UCLAMPSET 0
+#define USE_UCLAMPSET(...)
+#define CFG_UPTIME 0
+#define USE_UPTIME(...)
+#define CFG_USLEEP 0
+#define USE_USLEEP(...)
+#define CFG_UUIDGEN 0
+#define USE_UUIDGEN(...)
+#define CFG_VCONFIG 0
+#define USE_VCONFIG(...)
+#define CFG_VMSTAT 0
+#define USE_VMSTAT(...)
+#define CFG_W 0
+#define USE_W(...)
+#define CFG_WATCH 0
+#define USE_WATCH(...)
+#define CFG_WATCHDOG 0
+#define USE_WATCHDOG(...)
+#define CFG_WHICH 1
+#define USE_WHICH(...) __VA_ARGS__
+#define CFG_XXD 0
+#define USE_XXD(...)
+#define CFG_YES 0
+#define USE_YES(...)
+#define CFG_FTPGET 0
+#define USE_FTPGET(...)
+#define CFG_FTPPUT 0
+#define USE_FTPPUT(...)
+#define CFG_HOST 0
+#define USE_HOST(...)
+#define CFG_HTTPD 0
+#define USE_HTTPD(...)
+#define CFG_IFCONFIG 0
+#define USE_IFCONFIG(...)
+#define CFG_MICROCOM 0
+#define USE_MICROCOM(...)
+#define CFG_NETCAT 0
+#define USE_NETCAT(...)
+#define CFG_NETSTAT 0
+#define USE_NETSTAT(...)
+#define CFG_PING 0
+#define USE_PING(...)
+#define CFG_RFKILL 0
+#define USE_RFKILL(...)
+#define CFG_SNTP 0
+#define USE_SNTP(...)
+#define CFG_TUNCTL 0
+#define USE_TUNCTL(...)
+#define CFG_WGET 0
+#define USE_WGET(...)
+#define CFG_WGET_LIBTLS 0
+#define USE_WGET_LIBTLS(...)
+#define CFG_DMESG 0
+#define USE_DMESG(...)
+#define CFG_GZIP 1
+#define USE_GZIP(...) __VA_ARGS__
+#define CFG_GUNZIP 0
+#define USE_GUNZIP(...)
+#define CFG_ZCAT 0
+#define USE_ZCAT(...)
+#define CFG_HOSTNAME 0
+#define USE_HOSTNAME(...)
+#define CFG_DNSDOMAINNAME 0
+#define USE_DNSDOMAINNAME(...)
+#define CFG_KILLALL 0
+#define USE_KILLALL(...)
+#define CFG_MD5SUM 0
+#define USE_MD5SUM(...)
+#define CFG_SHA1SUM 0
+#define USE_SHA1SUM(...)
+#define CFG_SHA224SUM 0
+#define USE_SHA224SUM(...)
+#define CFG_SHA256SUM 0
+#define USE_SHA256SUM(...)
+#define CFG_SHA384SUM 0
+#define USE_SHA384SUM(...)
+#define CFG_SHA512SUM 0
+#define USE_SHA512SUM(...)
+#define CFG_MKNOD 0
+#define USE_MKNOD(...)
+#define CFG_MKNOD_Z 0
+#define USE_MKNOD_Z(...)
+#define CFG_MKTEMP 0
+#define USE_MKTEMP(...)
+#define CFG_MOUNT 0
+#define USE_MOUNT(...)
+#define CFG_PASSWD 0
+#define USE_PASSWD(...)
+#define CFG_PASSWD_SAD 0
+#define USE_PASSWD_SAD(...)
+#define CFG_PIDOF 0
+#define USE_PIDOF(...)
+#define CFG_SEQ 0
+#define USE_SEQ(...)
+#define CFG_SU 0
+#define USE_SU(...)
+#define CFG_SYNC 0
+#define USE_SYNC(...)
+#define CFG_UMOUNT 0
+#define USE_UMOUNT(...)
+#define CFG_DEMO_MANY_OPTIONS 0
+#define USE_DEMO_MANY_OPTIONS(...)
+#define CFG_DEMO_NUMBER 0
+#define USE_DEMO_NUMBER(...)
+#define CFG_DEMO_SCANKEY 0
+#define USE_DEMO_SCANKEY(...)
+#define CFG_DEMO_UTF8TOWC 0
+#define USE_DEMO_UTF8TOWC(...)
+#define CFG_HELLO 0
+#define USE_HELLO(...)
+#define CFG_HOSTID 0
+#define USE_HOSTID(...)
+#define CFG_LOGPATH 0
+#define USE_LOGPATH(...)
+#define CFG_SKELETON 0
+#define USE_SKELETON(...)
+#define CFG_SKELETON_ALIAS 0
+#define USE_SKELETON_ALIAS(...)
+#define CFG_GETENFORCE 0
+#define USE_GETENFORCE(...)
+#define CFG_LOAD_POLICY 0
+#define USE_LOAD_POLICY(...)
+#define CFG_LOG 0
+#define USE_LOG(...)
+#define CFG_RESTORECON 0
+#define USE_RESTORECON(...)
+#define CFG_RUNCON 0
+#define USE_RUNCON(...)
+#define CFG_SENDEVENT 0
+#define USE_SENDEVENT(...)
+#define CFG_SETENFORCE 0
+#define USE_SETENFORCE(...)
+#define CFG_TOYBOX 1
+#define USE_TOYBOX(...) __VA_ARGS__
+#define CFG_TOYBOX_SUID 0
+#define USE_TOYBOX_SUID(...)
+#define CFG_TOYBOX_LSM_NONE 1
+#define USE_TOYBOX_LSM_NONE(...) __VA_ARGS__
+#define CFG_TOYBOX_SELINUX 0
+#define USE_TOYBOX_SELINUX(...)
+#define CFG_TOYBOX_SMACK 0
+#define USE_TOYBOX_SMACK(...)
+#define CFG_TOYBOX_LIBCRYPTO 0
+#define USE_TOYBOX_LIBCRYPTO(...)
+#define CFG_TOYBOX_LIBZ 0
+#define USE_TOYBOX_LIBZ(...)
+#define CFG_TOYBOX_FLOAT 0
+#define USE_TOYBOX_FLOAT(...)
+#define CFG_TOYBOX_HELP 0
+#define USE_TOYBOX_HELP(...)
+#define CFG_TOYBOX_HELP_DASHDASH 0
+#define USE_TOYBOX_HELP_DASHDASH(...)
+#define CFG_TOYBOX_ZHELP 0
+#define USE_TOYBOX_ZHELP(...)
+#define CFG_TOYBOX_FREE 0
+#define USE_TOYBOX_FREE(...)
+#define CFG_TOYBOX_NORECURSE 0
+#define USE_TOYBOX_NORECURSE(...)
+#define CFG_TOYBOX_DEBUG 0
+#define USE_TOYBOX_DEBUG(...)
+#define CFG_TOYBOX_FORCE_NOMMU 0
+#define USE_TOYBOX_FORCE_NOMMU(...)
diff --git a/scripts/prereq/generated/flags.h b/scripts/prereq/generated/flags.h
new file mode 100644
index 00000000..2565862c
--- /dev/null
+++ b/scripts/prereq/generated/flags.h
@@ -0,0 +1,848 @@
+#undef FORCED_FLAG
+#ifdef FORCE_FLAGS
+#define FORCED_FLAG 1LL
+#else
+#define FORCED_FLAG 0LL
+#endif
+
+// basename ^<1as: ^<1as:
+#undef OPTSTR_basename
+#define OPTSTR_basename "^<1as:"
+#ifdef CLEANUP_basename
+#undef CLEANUP_basename
+#undef FOR_basename
+#undef FLAG_s
+#undef FLAG_a
+#endif
+
+// cat uvte uvte
+#undef OPTSTR_cat
+#define OPTSTR_cat "uvte"
+#ifdef CLEANUP_cat
+#undef CLEANUP_cat
+#undef FOR_cat
+#undef FLAG_e
+#undef FLAG_t
+#undef FLAG_v
+#undef FLAG_u
+#endif
+
+// chmod <2?vfR[-vf] <2?vfR[-vf]
+#undef OPTSTR_chmod
+#define OPTSTR_chmod "<2?vfR[-vf]"
+#ifdef CLEANUP_chmod
+#undef CLEANUP_chmod
+#undef FOR_chmod
+#undef FLAG_R
+#undef FLAG_f
+#undef FLAG_v
+#endif
+
+// cmp <1>4ls(silent)(quiet)n#<1[!ls] <1>4ls(silent)(quiet)n#<1[!ls]
+#undef OPTSTR_cmp
+#define OPTSTR_cmp "<1>4ls(silent)(quiet)n#<1[!ls]"
+#ifdef CLEANUP_cmp
+#undef CLEANUP_cmp
+#undef FOR_cmp
+#undef FLAG_n
+#undef FLAG_s
+#undef FLAG_l
+#endif
+
+// echo ^?Een[-eE] ^?Een[-eE]
+#undef OPTSTR_echo
+#define OPTSTR_echo "^?Een[-eE]"
+#ifdef CLEANUP_echo
+#undef CLEANUP_echo
+#undef FOR_echo
+#undef FLAG_n
+#undef FLAG_e
+#undef FLAG_E
+#endif
+
+// fold bsw#<1=80 bsw#<1=80
+#undef OPTSTR_fold
+#define OPTSTR_fold "bsw#<1=80"
+#ifdef CLEANUP_fold
+#undef CLEANUP_fold
+#undef FOR_fold
+#undef FLAG_w
+#undef FLAG_s
+#undef FLAG_b
+#endif
+
+// grep (line-buffered)(color):;(exclude-dir)*S(exclude)*M(include)*ZzEFHIab(byte-offset)h(no-filename)ino(only-matching)rRsvwc(count)L(files-without-match)l(files-with-matches)q(quiet)(silent)e*f*C#B#A#m#x[!wx][!EF] (line-buffered)(color):;(exclude-dir)*S(exclude)*M(include)*ZzEFHIab(byte-offset)h(no-filename)ino(only-matching)rRsvwc(count)L(files-without-match)l(files-with-matches)q(quiet)(silent)e*f*C#B#A#m#x[!wx][!EF]
+#undef OPTSTR_grep
+#define OPTSTR_grep "(line-buffered)(color):;(exclude-dir)*S(exclude)*M(include)*ZzEFHIab(byte-offset)h(no-filename)ino(only-matching)rRsvwc(count)L(files-without-match)l(files-with-matches)q(quiet)(silent)e*f*C#B#A#m#x[!wx][!EF]"
+#ifdef CLEANUP_grep
+#undef CLEANUP_grep
+#undef FOR_grep
+#undef FLAG_x
+#undef FLAG_m
+#undef FLAG_A
+#undef FLAG_B
+#undef FLAG_C
+#undef FLAG_f
+#undef FLAG_e
+#undef FLAG_q
+#undef FLAG_l
+#undef FLAG_L
+#undef FLAG_c
+#undef FLAG_w
+#undef FLAG_v
+#undef FLAG_s
+#undef FLAG_R
+#undef FLAG_r
+#undef FLAG_o
+#undef FLAG_n
+#undef FLAG_i
+#undef FLAG_h
+#undef FLAG_b
+#undef FLAG_a
+#undef FLAG_I
+#undef FLAG_H
+#undef FLAG_F
+#undef FLAG_E
+#undef FLAG_z
+#undef FLAG_Z
+#undef FLAG_M
+#undef FLAG_S
+#undef FLAG_exclude_dir
+#undef FLAG_color
+#undef FLAG_line_buffered
+#endif
+
+// gzip n(no-name)cdfkt123456789[-123456789] n(no-name)cdfkt123456789[-123456789]
+#undef OPTSTR_gzip
+#define OPTSTR_gzip "n(no-name)cdfkt123456789[-123456789]"
+#ifdef CLEANUP_gzip
+#undef CLEANUP_gzip
+#undef FOR_gzip
+#undef FLAG_9
+#undef FLAG_8
+#undef FLAG_7
+#undef FLAG_6
+#undef FLAG_5
+#undef FLAG_4
+#undef FLAG_3
+#undef FLAG_2
+#undef FLAG_1
+#undef FLAG_t
+#undef FLAG_k
+#undef FLAG_f
+#undef FLAG_d
+#undef FLAG_c
+#undef FLAG_n
+#endif
+
+// head ?n(lines)#<0=10c(bytes)#<0qv[-nc] ?n(lines)#<0=10c(bytes)#<0qv[-nc]
+#undef OPTSTR_head
+#define OPTSTR_head "?n(lines)#<0=10c(bytes)#<0qv[-nc]"
+#ifdef CLEANUP_head
+#undef CLEANUP_head
+#undef FOR_head
+#undef FLAG_v
+#undef FLAG_q
+#undef FLAG_c
+#undef FLAG_n
+#endif
+
+// ln <1rt:Tvnfs <1rt:Tvnfs
+#undef OPTSTR_ln
+#define OPTSTR_ln "<1rt:Tvnfs"
+#ifdef CLEANUP_ln
+#undef CLEANUP_ln
+#undef FOR_ln
+#undef FLAG_s
+#undef FLAG_f
+#undef FLAG_n
+#undef FLAG_v
+#undef FLAG_T
+#undef FLAG_t
+#undef FLAG_r
+#endif
+
+// ls (sort):(color):;(full-time)(show-control-chars)˙(block-size)#=1024<1Ħ(group-directories-first)ŝZgoACFHLNRSUXabcdfhikl@mnpqrstuw#=80<0x1[-Cxm1][-Cxml][-Cxmo][-Cxmg][-cu][-ftS][-HL][-Nqb][-k˙] (sort):(color):;(full-time)(show-control-chars)˙(block-size)#=1024<1Ħ(group-directories-first)ŝZgoACFHLNRSUXabcdfhikl@mnpqrstuw#=80<0x1[-Cxm1][-Cxml][-Cxmo][-Cxmg][-cu][-ftS][-HL][-Nqb][-k˙]
+#undef OPTSTR_ls
+#define OPTSTR_ls "(sort):(color):;(full-time)(show-control-chars)˙(block-size)#=1024<1Ħ(group-directories-first)ŝZgoACFHLNRSUXabcdfhikl@mnpqrstuw#=80<0x1[-Cxm1][-Cxml][-Cxmo][-Cxmg][-cu][-ftS][-HL][-Nqb][-k˙]"
+#ifdef CLEANUP_ls
+#undef CLEANUP_ls
+#undef FOR_ls
+#undef FLAG_1
+#undef FLAG_x
+#undef FLAG_w
+#undef FLAG_u
+#undef FLAG_t
+#undef FLAG_s
+#undef FLAG_r
+#undef FLAG_q
+#undef FLAG_p
+#undef FLAG_n
+#undef FLAG_m
+#undef FLAG_l
+#undef FLAG_k
+#undef FLAG_i
+#undef FLAG_h
+#undef FLAG_f
+#undef FLAG_d
+#undef FLAG_c
+#undef FLAG_b
+#undef FLAG_a
+#undef FLAG_X
+#undef FLAG_U
+#undef FLAG_S
+#undef FLAG_R
+#undef FLAG_N
+#undef FLAG_L
+#undef FLAG_H
+#undef FLAG_F
+#undef FLAG_C
+#undef FLAG_A
+#undef FLAG_o
+#undef FLAG_g
+#undef FLAG_Z
+#undef FLAG_X7E
+#undef FLAG_X21
+#undef FLAG_X7F
+#undef FLAG_show_control_chars
+#undef FLAG_full_time
+#undef FLAG_color
+#undef FLAG_sort
+#endif
+
+// mkdir <1vp(parent)(parents)m: <1Z:vp(parent)(parents)m:
+#undef OPTSTR_mkdir
+#define OPTSTR_mkdir "<1vp(parent)(parents)m:"
+#ifdef CLEANUP_mkdir
+#undef CLEANUP_mkdir
+#undef FOR_mkdir
+#undef FLAG_m
+#undef FLAG_p
+#undef FLAG_v
+#undef FLAG_Z
+#endif
+
+// od j#vw#<1=16N#xsodcbA:t* j#vw#<1=16N#xsodcbA:t*
+#undef OPTSTR_od
+#define OPTSTR_od "j#vw#<1=16N#xsodcbA:t*"
+#ifdef CLEANUP_od
+#undef CLEANUP_od
+#undef FOR_od
+#undef FLAG_t
+#undef FLAG_A
+#undef FLAG_b
+#undef FLAG_c
+#undef FLAG_d
+#undef FLAG_o
+#undef FLAG_s
+#undef FLAG_x
+#undef FLAG_N
+#undef FLAG_w
+#undef FLAG_v
+#undef FLAG_j
+#endif
+
+// readlink <1vnf(canonicalize)emqz[-mef][-qv] <1vnf(canonicalize)emqz[-mef][-qv]
+#undef OPTSTR_readlink
+#define OPTSTR_readlink "<1vnf(canonicalize)emqz[-mef][-qv]"
+#ifdef CLEANUP_readlink
+#undef CLEANUP_readlink
+#undef FOR_readlink
+#undef FLAG_z
+#undef FLAG_q
+#undef FLAG_m
+#undef FLAG_e
+#undef FLAG_f
+#undef FLAG_n
+#undef FLAG_v
+#endif
+
+// realpath <1(relative-base):R(relative-to):s(no-symlinks)LPemqz[-Ps][-LP][-me]
+#undef OPTSTR_realpath
+#define OPTSTR_realpath "<1(relative-base):R(relative-to):s(no-symlinks)LPemqz[-Ps][-LP][-me]"
+#ifdef CLEANUP_realpath
+#undef CLEANUP_realpath
+#undef FOR_realpath
+#undef FLAG_z
+#undef FLAG_q
+#undef FLAG_m
+#undef FLAG_e
+#undef FLAG_P
+#undef FLAG_L
+#undef FLAG_s
+#undef FLAG_R
+#undef FLAG_relative_base
+#endif
+
+// rm f(force)iRrv[-fi] f(force)iRrv[-fi]
+#undef OPTSTR_rm
+#define OPTSTR_rm "f(force)iRrv[-fi]"
+#ifdef CLEANUP_rm
+#undef CLEANUP_rm
+#undef FOR_rm
+#undef FLAG_v
+#undef FLAG_r
+#undef FLAG_R
+#undef FLAG_i
+#undef FLAG_f
+#endif
+
+// sed (help)(version)(tarxform)e*f*i:;nErz(null-data)s[+Er] (help)(version)(tarxform)e*f*i:;nErz(null-data)s[+Er]
+#undef OPTSTR_sed
+#define OPTSTR_sed "(help)(version)(tarxform)e*f*i:;nErz(null-data)s[+Er]"
+#ifdef CLEANUP_sed
+#undef CLEANUP_sed
+#undef FOR_sed
+#undef FLAG_s
+#undef FLAG_z
+#undef FLAG_r
+#undef FLAG_E
+#undef FLAG_n
+#undef FLAG_i
+#undef FLAG_f
+#undef FLAG_e
+#undef FLAG_tarxform
+#undef FLAG_version
+#undef FLAG_help
+#endif
+
+// sort S:T:mo:k*t:xVbMCcszdfirun gS:T:mo:k*t:xVbMCcszdfirun
+#undef OPTSTR_sort
+#define OPTSTR_sort "S:T:mo:k*t:xVbMCcszdfirun"
+#ifdef CLEANUP_sort
+#undef CLEANUP_sort
+#undef FOR_sort
+#undef FLAG_n
+#undef FLAG_u
+#undef FLAG_r
+#undef FLAG_i
+#undef FLAG_f
+#undef FLAG_d
+#undef FLAG_z
+#undef FLAG_s
+#undef FLAG_c
+#undef FLAG_C
+#undef FLAG_M
+#undef FLAG_b
+#undef FLAG_V
+#undef FLAG_x
+#undef FLAG_t
+#undef FLAG_k
+#undef FLAG_o
+#undef FLAG_m
+#undef FLAG_T
+#undef FLAG_S
+#undef FLAG_g
+#endif
+
+// tail ?fFs:c(bytes)-n(lines)-[-cn][-fF] ?fFs:c(bytes)-n(lines)-[-cn][-fF]
+#undef OPTSTR_tail
+#define OPTSTR_tail "?fFs:c(bytes)-n(lines)-[-cn][-fF]"
+#ifdef CLEANUP_tail
+#undef CLEANUP_tail
+#undef FOR_tail
+#undef FLAG_n
+#undef FLAG_c
+#undef FLAG_s
+#undef FLAG_F
+#undef FLAG_f
+#endif
+
+// taskset <1^pa
+#undef OPTSTR_taskset
+#define OPTSTR_taskset "<1^pa"
+#ifdef CLEANUP_taskset
+#undef CLEANUP_taskset
+#undef FOR_taskset
+#undef FLAG_a
+#undef FLAG_p
+#endif
+
+// tee ia ia
+#undef OPTSTR_tee
+#define OPTSTR_tee "ia"
+#ifdef CLEANUP_tee
+#undef CLEANUP_tee
+#undef FOR_tee
+#undef FLAG_a
+#undef FLAG_i
+#endif
+
+// tr ^<1>2Ccstd[+cC] ^<1>2Ccstd[+cC]
+#undef OPTSTR_tr
+#define OPTSTR_tr "^<1>2Ccstd[+cC]"
+#ifdef CLEANUP_tr
+#undef CLEANUP_tr
+#undef FOR_tr
+#undef FLAG_d
+#undef FLAG_t
+#undef FLAG_s
+#undef FLAG_c
+#undef FLAG_C
+#endif
+
+// uname paomvrns paomvrns
+#undef OPTSTR_uname
+#define OPTSTR_uname "paomvrns"
+#ifdef CLEANUP_uname
+#undef CLEANUP_uname
+#undef FOR_uname
+#undef FLAG_s
+#undef FLAG_n
+#undef FLAG_r
+#undef FLAG_v
+#undef FLAG_m
+#undef FLAG_o
+#undef FLAG_a
+#undef FLAG_p
+#endif
+
+// wc Lcmwl Lcmwl
+#undef OPTSTR_wc
+#define OPTSTR_wc "Lcmwl"
+#ifdef CLEANUP_wc
+#undef CLEANUP_wc
+#undef FOR_wc
+#undef FLAG_l
+#undef FLAG_w
+#undef FLAG_m
+#undef FLAG_c
+#undef FLAG_L
+#endif
+
+// xargs ^E:P#<0(null)=1optr(no-run-if-empty)n#<1(max-args)s#0[!0E] ^E:P#<0(null)=1optr(no-run-if-empty)n#<1(max-args)s#0[!0E]
+#undef OPTSTR_xargs
+#define OPTSTR_xargs "^E:P#<0(null)=1optr(no-run-if-empty)n#<1(max-args)s#0[!0E]"
+#ifdef CLEANUP_xargs
+#undef CLEANUP_xargs
+#undef FOR_xargs
+#undef FLAG_0
+#undef FLAG_s
+#undef FLAG_n
+#undef FLAG_r
+#undef FLAG_t
+#undef FLAG_p
+#undef FLAG_o
+#undef FLAG_P
+#undef FLAG_E
+#endif
+
+#ifdef FOR_basename
+#define CLEANUP_basename
+#ifndef TT
+#define TT this.basename
+#endif
+#define FLAG_s (1LL<<0)
+#define FLAG_a (1LL<<1)
+#endif
+
+#ifdef FOR_cat
+#define CLEANUP_cat
+#ifndef TT
+#define TT this.cat
+#endif
+#define FLAG_e (1LL<<0)
+#define FLAG_t (1LL<<1)
+#define FLAG_v (1LL<<2)
+#define FLAG_u (1LL<<3)
+#endif
+
+#ifdef FOR_chmod
+#define CLEANUP_chmod
+#ifndef TT
+#define TT this.chmod
+#endif
+#define FLAG_R (1LL<<0)
+#define FLAG_f (1LL<<1)
+#define FLAG_v (1LL<<2)
+#endif
+
+#ifdef FOR_cmp
+#define CLEANUP_cmp
+#ifndef TT
+#define TT this.cmp
+#endif
+#define FLAG_n (1LL<<0)
+#define FLAG_s (1LL<<1)
+#define FLAG_l (1LL<<2)
+#endif
+
+#ifdef FOR_echo
+#define CLEANUP_echo
+#ifndef TT
+#define TT this.echo
+#endif
+#define FLAG_n (1LL<<0)
+#define FLAG_e (1LL<<1)
+#define FLAG_E (1LL<<2)
+#endif
+
+#ifdef FOR_fold
+#define CLEANUP_fold
+#ifndef TT
+#define TT this.fold
+#endif
+#define FLAG_w (1LL<<0)
+#define FLAG_s (1LL<<1)
+#define FLAG_b (1LL<<2)
+#endif
+
+#ifdef FOR_grep
+#define CLEANUP_grep
+#ifndef TT
+#define TT this.grep
+#endif
+#define FLAG_x (1LL<<0)
+#define FLAG_m (1LL<<1)
+#define FLAG_A (1LL<<2)
+#define FLAG_B (1LL<<3)
+#define FLAG_C (1LL<<4)
+#define FLAG_f (1LL<<5)
+#define FLAG_e (1LL<<6)
+#define FLAG_q (1LL<<7)
+#define FLAG_l (1LL<<8)
+#define FLAG_L (1LL<<9)
+#define FLAG_c (1LL<<10)
+#define FLAG_w (1LL<<11)
+#define FLAG_v (1LL<<12)
+#define FLAG_s (1LL<<13)
+#define FLAG_R (1LL<<14)
+#define FLAG_r (1LL<<15)
+#define FLAG_o (1LL<<16)
+#define FLAG_n (1LL<<17)
+#define FLAG_i (1LL<<18)
+#define FLAG_h (1LL<<19)
+#define FLAG_b (1LL<<20)
+#define FLAG_a (1LL<<21)
+#define FLAG_I (1LL<<22)
+#define FLAG_H (1LL<<23)
+#define FLAG_F (1LL<<24)
+#define FLAG_E (1LL<<25)
+#define FLAG_z (1LL<<26)
+#define FLAG_Z (1LL<<27)
+#define FLAG_M (1LL<<28)
+#define FLAG_S (1LL<<29)
+#define FLAG_exclude_dir (1LL<<30)
+#define FLAG_color (1LL<<31)
+#define FLAG_line_buffered (1LL<<32)
+#endif
+
+#ifdef FOR_gzip
+#define CLEANUP_gzip
+#ifndef TT
+#define TT this.gzip
+#endif
+#define FLAG_9 (1LL<<0)
+#define FLAG_8 (1LL<<1)
+#define FLAG_7 (1LL<<2)
+#define FLAG_6 (1LL<<3)
+#define FLAG_5 (1LL<<4)
+#define FLAG_4 (1LL<<5)
+#define FLAG_3 (1LL<<6)
+#define FLAG_2 (1LL<<7)
+#define FLAG_1 (1LL<<8)
+#define FLAG_t (1LL<<9)
+#define FLAG_k (1LL<<10)
+#define FLAG_f (1LL<<11)
+#define FLAG_d (1LL<<12)
+#define FLAG_c (1LL<<13)
+#define FLAG_n (1LL<<14)
+#endif
+
+#ifdef FOR_head
+#define CLEANUP_head
+#ifndef TT
+#define TT this.head
+#endif
+#define FLAG_v (1LL<<0)
+#define FLAG_q (1LL<<1)
+#define FLAG_c (1LL<<2)
+#define FLAG_n (1LL<<3)
+#endif
+
+#ifdef FOR_ln
+#define CLEANUP_ln
+#ifndef TT
+#define TT this.ln
+#endif
+#define FLAG_s (1LL<<0)
+#define FLAG_f (1LL<<1)
+#define FLAG_n (1LL<<2)
+#define FLAG_v (1LL<<3)
+#define FLAG_T (1LL<<4)
+#define FLAG_t (1LL<<5)
+#define FLAG_r (1LL<<6)
+#endif
+
+#ifdef FOR_ls
+#define CLEANUP_ls
+#ifndef TT
+#define TT this.ls
+#endif
+#define FLAG_1 (1LL<<0)
+#define FLAG_x (1LL<<1)
+#define FLAG_w (1LL<<2)
+#define FLAG_u (1LL<<3)
+#define FLAG_t (1LL<<4)
+#define FLAG_s (1LL<<5)
+#define FLAG_r (1LL<<6)
+#define FLAG_q (1LL<<7)
+#define FLAG_p (1LL<<8)
+#define FLAG_n (1LL<<9)
+#define FLAG_m (1LL<<10)
+#define FLAG_l (1LL<<11)
+#define FLAG_k (1LL<<12)
+#define FLAG_i (1LL<<13)
+#define FLAG_h (1LL<<14)
+#define FLAG_f (1LL<<15)
+#define FLAG_d (1LL<<16)
+#define FLAG_c (1LL<<17)
+#define FLAG_b (1LL<<18)
+#define FLAG_a (1LL<<19)
+#define FLAG_X (1LL<<20)
+#define FLAG_U (1LL<<21)
+#define FLAG_S (1LL<<22)
+#define FLAG_R (1LL<<23)
+#define FLAG_N (1LL<<24)
+#define FLAG_L (1LL<<25)
+#define FLAG_H (1LL<<26)
+#define FLAG_F (1LL<<27)
+#define FLAG_C (1LL<<28)
+#define FLAG_A (1LL<<29)
+#define FLAG_o (1LL<<30)
+#define FLAG_g (1LL<<31)
+#define FLAG_Z (1LL<<32)
+#define FLAG_X7E (1LL<<33)
+#define FLAG_X21 (1LL<<34)
+#define FLAG_X7F (1LL<<35)
+#define FLAG_show_control_chars (1LL<<36)
+#define FLAG_full_time (1LL<<37)
+#define FLAG_color (1LL<<38)
+#define FLAG_sort (1LL<<39)
+#endif
+
+#ifdef FOR_mkdir
+#define CLEANUP_mkdir
+#ifndef TT
+#define TT this.mkdir
+#endif
+#define FLAG_m (1LL<<0)
+#define FLAG_p (1LL<<1)
+#define FLAG_v (1LL<<2)
+#define FLAG_Z (FORCED_FLAG<<3)
+#endif
+
+#ifdef FOR_od
+#define CLEANUP_od
+#ifndef TT
+#define TT this.od
+#endif
+#define FLAG_t (1LL<<0)
+#define FLAG_A (1LL<<1)
+#define FLAG_b (1LL<<2)
+#define FLAG_c (1LL<<3)
+#define FLAG_d (1LL<<4)
+#define FLAG_o (1LL<<5)
+#define FLAG_s (1LL<<6)
+#define FLAG_x (1LL<<7)
+#define FLAG_N (1LL<<8)
+#define FLAG_w (1LL<<9)
+#define FLAG_v (1LL<<10)
+#define FLAG_j (1LL<<11)
+#endif
+
+#ifdef FOR_readlink
+#define CLEANUP_readlink
+#ifndef TT
+#define TT this.readlink
+#endif
+#define FLAG_z (1LL<<0)
+#define FLAG_q (1LL<<1)
+#define FLAG_m (1LL<<2)
+#define FLAG_e (1LL<<3)
+#define FLAG_f (1LL<<4)
+#define FLAG_n (1LL<<5)
+#define FLAG_v (1LL<<6)
+#endif
+
+#ifdef FOR_realpath
+#define CLEANUP_realpath
+#ifndef TT
+#define TT this.realpath
+#endif
+#define FLAG_z (FORCED_FLAG<<0)
+#define FLAG_q (FORCED_FLAG<<1)
+#define FLAG_m (FORCED_FLAG<<2)
+#define FLAG_e (FORCED_FLAG<<3)
+#define FLAG_P (FORCED_FLAG<<4)
+#define FLAG_L (FORCED_FLAG<<5)
+#define FLAG_s (FORCED_FLAG<<6)
+#define FLAG_R (FORCED_FLAG<<7)
+#define FLAG_relative_base (FORCED_FLAG<<8)
+#endif
+
+#ifdef FOR_rm
+#define CLEANUP_rm
+#ifndef TT
+#define TT this.rm
+#endif
+#define FLAG_v (1LL<<0)
+#define FLAG_r (1LL<<1)
+#define FLAG_R (1LL<<2)
+#define FLAG_i (1LL<<3)
+#define FLAG_f (1LL<<4)
+#endif
+
+#ifdef FOR_sed
+#define CLEANUP_sed
+#ifndef TT
+#define TT this.sed
+#endif
+#define FLAG_s (1LL<<0)
+#define FLAG_z (1LL<<1)
+#define FLAG_r (1LL<<2)
+#define FLAG_E (1LL<<3)
+#define FLAG_n (1LL<<4)
+#define FLAG_i (1LL<<5)
+#define FLAG_f (1LL<<6)
+#define FLAG_e (1LL<<7)
+#define FLAG_tarxform (1LL<<8)
+#define FLAG_version (1LL<<9)
+#define FLAG_help (1LL<<10)
+#endif
+
+#ifdef FOR_sort
+#define CLEANUP_sort
+#ifndef TT
+#define TT this.sort
+#endif
+#define FLAG_n (1LL<<0)
+#define FLAG_u (1LL<<1)
+#define FLAG_r (1LL<<2)
+#define FLAG_i (1LL<<3)
+#define FLAG_f (1LL<<4)
+#define FLAG_d (1LL<<5)
+#define FLAG_z (1LL<<6)
+#define FLAG_s (1LL<<7)
+#define FLAG_c (1LL<<8)
+#define FLAG_C (1LL<<9)
+#define FLAG_M (1LL<<10)
+#define FLAG_b (1LL<<11)
+#define FLAG_V (1LL<<12)
+#define FLAG_x (1LL<<13)
+#define FLAG_t (1LL<<14)
+#define FLAG_k (1LL<<15)
+#define FLAG_o (1LL<<16)
+#define FLAG_m (1LL<<17)
+#define FLAG_T (1LL<<18)
+#define FLAG_S (1LL<<19)
+#define FLAG_g (FORCED_FLAG<<20)
+#endif
+
+#ifdef FOR_tail
+#define CLEANUP_tail
+#ifndef TT
+#define TT this.tail
+#endif
+#define FLAG_n (1LL<<0)
+#define FLAG_c (1LL<<1)
+#define FLAG_s (1LL<<2)
+#define FLAG_F (1LL<<3)
+#define FLAG_f (1LL<<4)
+#endif
+
+#ifdef FOR_taskset
+#define CLEANUP_taskset
+#ifndef TT
+#define TT this.taskset
+#endif
+#define FLAG_a (FORCED_FLAG<<0)
+#define FLAG_p (FORCED_FLAG<<1)
+#endif
+
+#ifdef FOR_tee
+#define CLEANUP_tee
+#ifndef TT
+#define TT this.tee
+#endif
+#define FLAG_a (1LL<<0)
+#define FLAG_i (1LL<<1)
+#endif
+
+#ifdef FOR_tr
+#define CLEANUP_tr
+#ifndef TT
+#define TT this.tr
+#endif
+#define FLAG_d (1LL<<0)
+#define FLAG_t (1LL<<1)
+#define FLAG_s (1LL<<2)
+#define FLAG_c (1LL<<3)
+#define FLAG_C (1LL<<4)
+#endif
+
+#ifdef FOR_uname
+#define CLEANUP_uname
+#ifndef TT
+#define TT this.uname
+#endif
+#define FLAG_s (1LL<<0)
+#define FLAG_n (1LL<<1)
+#define FLAG_r (1LL<<2)
+#define FLAG_v (1LL<<3)
+#define FLAG_m (1LL<<4)
+#define FLAG_o (1LL<<5)
+#define FLAG_a (1LL<<6)
+#define FLAG_p (1LL<<7)
+#endif
+
+#ifdef FOR_wc
+#define CLEANUP_wc
+#ifndef TT
+#define TT this.wc
+#endif
+#define FLAG_l (1LL<<0)
+#define FLAG_w (1LL<<1)
+#define FLAG_m (1LL<<2)
+#define FLAG_c (1LL<<3)
+#define FLAG_L (1LL<<4)
+#endif
+
+#ifdef FOR_xargs
+#define CLEANUP_xargs
+#ifndef TT
+#define TT this.xargs
+#endif
+#define FLAG_0 (1LL<<0)
+#define FLAG_s (1LL<<1)
+#define FLAG_n (1LL<<2)
+#define FLAG_r (1LL<<3)
+#define FLAG_t (1LL<<4)
+#define FLAG_p (1LL<<5)
+#define FLAG_o (1LL<<6)
+#define FLAG_P (1LL<<7)
+#define FLAG_E (1LL<<8)
+#endif
+
+#undef OPTSTR_ascii
+#define OPTSTR_ascii 0
+#undef OPTSTR_dirname
+#define OPTSTR_dirname "<1"
+#undef OPTSTR_gitcheckout
+#define OPTSTR_gitcheckout "<1"
+#undef OPTSTR_gitclone
+#define OPTSTR_gitclone "<1"
+#undef OPTSTR_gitfetch
+#define OPTSTR_gitfetch 0
+#undef OPTSTR_gitinit
+#define OPTSTR_gitinit "<1"
+#undef OPTSTR_gitremote
+#define OPTSTR_gitremote "<1"
+#undef OPTSTR_makedevs
+#define OPTSTR_makedevs "<1>1d:"
+#undef OPTSTR_nproc
+#define OPTSTR_nproc "(all)"
+#undef OPTSTR_toybox
+#define OPTSTR_toybox 0
+#undef OPTSTR_which
+#define OPTSTR_which "<1a"
diff --git a/scripts/prereq/generated/globals.h b/scripts/prereq/generated/globals.h
new file mode 100644
index 00000000..464bfd70
--- /dev/null
+++ b/scripts/prereq/generated/globals.h
@@ -0,0 +1,155 @@
+struct gzip_data {
+ int level;
+};
+
+struct realpath_data {
+ char *R, *relative_base;
+};
+
+struct tr_data {
+ short *map;
+ int len1, len2;
+};
+
+struct basename_data {
+ char *s;
+};
+
+struct chmod_data {
+ char *mode;
+};
+
+struct cmp_data {
+ long n;
+
+ int fd;
+ char *name;
+};
+
+struct fold_data {
+ long w;
+};
+
+struct grep_data {
+ long m, A, B, C;
+ struct arg_list *f, *e, *M, *S, *exclude_dir;
+ char *color;
+
+ char *purple, *cyan, *red, *green, *grey;
+ struct double_list *reg;
+ int found, tried, delim;
+ struct arg_list **fixed;
+};
+
+struct head_data {
+ long c, n;
+
+ int file_no;
+};
+
+struct ln_data {
+ char *t;
+};
+
+struct ls_data {
+ long w, l, block_size;
+ char *color, *sort;
+
+ struct dirtree *files, *singledir;
+ unsigned screen_width;
+ int nl_title;
+ char *escmore;
+};
+
+struct mkdir_data {
+ char *m, *Z;
+};
+
+struct od_data {
+ struct arg_list *t;
+ char *A;
+ long N, w, j;
+
+ int address_idx;
+ unsigned types, leftover, star;
+ char *buf; // Points to buffers[0] or buffers[1].
+ char *bufs[2]; // Used to detect duplicate lines.
+ off_t pos;
+};
+
+struct sed_data {
+ char *i;
+ struct arg_list *f, *e;
+
+ // processed pattern list
+ struct double_list *pattern;
+
+ char *nextline, *remember, *tarxform;
+ void *restart, *lastregex;
+ long nextlen, rememberlen, count;
+ int fdout, noeol;
+ unsigned xx, tarxlen, xflags;
+ char delim, xftype;
+};
+
+struct sort_data {
+ char *t;
+ struct arg_list *k;
+ char *o, *T, S;
+
+ void *key_list;
+ unsigned linecount;
+ char **lines, *name;
+};
+
+struct tail_data {
+ long n, c;
+ char *s;
+
+ int file_no, last_fd, ss;
+ struct xnotify *not;
+ struct {
+ char *path;
+ int fd;
+ struct dev_ino di;
+ } *F;
+};
+
+struct tee_data {
+ void *outputs;
+ int out;
+};
+
+struct wc_data {
+ unsigned long totals[5];
+};
+
+struct xargs_data {
+ long s, n, P;
+ char *E;
+
+ long entries, bytes, np;
+ char delim;
+ FILE *tty;
+};
+extern union global_union {
+ struct gzip_data gzip;
+ struct realpath_data realpath;
+ struct tr_data tr;
+ struct basename_data basename;
+ struct chmod_data chmod;
+ struct cmp_data cmp;
+ struct fold_data fold;
+ struct grep_data grep;
+ struct head_data head;
+ struct ln_data ln;
+ struct ls_data ls;
+ struct mkdir_data mkdir;
+ struct od_data od;
+ struct sed_data sed;
+ struct sort_data sort;
+ struct tail_data tail;
+ struct tee_data tee;
+ struct wc_data wc;
+ struct xargs_data xargs;
+} this;
diff --git a/scripts/prereq/generated/help.h b/scripts/prereq/generated/help.h
new file mode 100644
index 00000000..9b17e37b
--- /dev/null
+++ b/scripts/prereq/generated/help.h
@@ -0,0 +1,34 @@
+#define HELP_toybox ""
+#define HELP_as ""
+#define HELP_basename ""
+#define HELP_cat ""
+#define HELP_cc ""
+#define HELP_chmod ""
+#define HELP_cmp ""
+#define HELP_dirname ""
+#define HELP_echo ""
+#define HELP_egrep ""
+#define HELP_fold ""
+#define HELP_git ""
+#define HELP_grep ""
+#define HELP_gzip ""
+#define HELP_head ""
+#define HELP_ld ""
+#define HELP_ln ""
+#define HELP_ls ""
+#define HELP_make ""
+#define HELP_mkdir ""
+#define HELP_nproc ""
+#define HELP_od ""
+#define HELP_readlink ""
+#define HELP_rm ""
+#define HELP_sed ""
+#define HELP_sort ""
+#define HELP_strip ""
+#define HELP_tail ""
+#define HELP_tee ""
+#define HELP_tr ""
+#define HELP_uname ""
+#define HELP_wc ""
+#define HELP_which ""
+#define HELP_xargs ""
diff --git a/scripts/prereq/generated/newtoys.h b/scripts/prereq/generated/newtoys.h
new file mode 100644
index 00000000..289a3c5e
--- /dev/null
+++ b/scripts/prereq/generated/newtoys.h
@@ -0,0 +1,124 @@
+USE_TOYBOX(NEWTOY(toybox, 0, TOYFLAG_STAYROOT|TOYFLAG_NOHELP))
+USE_SH(OLDTOY(-bash, sh, 0))
+USE_SH(OLDTOY(-sh, sh, 0))
+USE_SH(OLDTOY(-toysh, sh, 0))
+USE_SH(OLDTOY(., source, TOYFLAG_NOFORK))
+USE_TRUE(OLDTOY(:, true, TOYFLAG_NOFORK|TOYFLAG_NOHELP))
+USE_TEST_GLUE(OLDTOY([, test, TOYFLAG_BIN|TOYFLAG_MAYFORK|TOYFLAG_NOHELP))
+USE_SH(OLDTOY([[, test, TOYFLAG_NOFORK|TOYFLAG_NOHELP))
+USE_GROUPADD(OLDTOY(addgroup, groupadd, TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
+USE_USERADD(OLDTOY(adduser, useradd, TOYFLAG_NEEDROOT|TOYFLAG_UMASK|TOYFLAG_SBIN))
+USE_ASCII(NEWTOY(ascii, 0, TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
+USE_BASE32(NEWTOY(base32, "diw#<0=76[!dw]", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
+USE_BASE64(NEWTOY(base64, "diw#<0=76[!dw]", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
+USE_BASENAME(NEWTOY(basename, "^<1as:", TOYFLAG_USR|TOYFLAG_BIN))
+USE_SH(OLDTOY(bash, sh, TOYFLAG_BIN))
+USE_BZCAT(NEWTOY(bzcat, 0, TOYFLAG_USR|TOYFLAG_BIN))
+USE_CAT(NEWTOY(cat, "uvte", TOYFLAG_BIN))
+USE_CHATTR(NEWTOY(chattr, "?p#v#R", TOYFLAG_BIN))
+USE_CHMOD(NEWTOY(chmod, "<2?vfR[-vf]", TOYFLAG_BIN))
+USE_CHOWN(OLDTOY(chown, chgrp, TOYFLAG_BIN))
+USE_CKSUM(NEWTOY(cksum, "HIPLN", TOYFLAG_BIN))
+USE_CMP(NEWTOY(cmp, "<1>4ls(silent)(quiet)n#<1[!ls]", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_ARGFAIL(2)))
+USE_CROND(NEWTOY(crond, "fbSl#<0=8d#<0L:c:[-bf][-LS][-ld]", TOYFLAG_USR|TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
+USE_GROUPDEL(OLDTOY(delgroup, groupdel, TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
+USE_USERDEL(OLDTOY(deluser, userdel, TOYFLAG_NEEDROOT|TOYFLAG_SBIN))
+USE_DEMO_UTF8TOWC(NEWTOY(demo_utf8towc, 0, TOYFLAG_USR|TOYFLAG_BIN))
+USE_DIRNAME(NEWTOY(dirname, "<1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_DUMPLEASES(NEWTOY(dumpleases, ">0arf:[!ar]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_ECHO(NEWTOY(echo, "^?Een[-eE]", TOYFLAG_BIN|TOYFLAG_MAYFORK|TOYFLAG_LINEBUF))
+USE_EGREP(OLDTOY(egrep, grep, TOYFLAG_BIN|TOYFLAG_ARGFAIL(2)|TOYFLAG_LINEBUF))
+USE_FALLOCATE(NEWTOY(fallocate, ">1l#|o#", TOYFLAG_USR|TOYFLAG_BIN))
+USE_FALSE(NEWTOY(false, NULL, TOYFLAG_BIN|TOYFLAG_NOHELP|TOYFLAG_MAYFORK))
+USE_FGREP(OLDTOY(fgrep, grep, TOYFLAG_BIN|TOYFLAG_ARGFAIL(2)|TOYFLAG_LINEBUF))
+USE_FOLD(NEWTOY(fold, "bsw#<1=80", TOYFLAG_USR|TOYFLAG_BIN))
+USE_FTPPUT(OLDTOY(ftpput, ftpget, TOYFLAG_USR|TOYFLAG_BIN))
+USE_GETFATTR(NEWTOY(getfattr, "(only-values)dhn:", TOYFLAG_USR|TOYFLAG_BIN))
+USE_GITCHECKOUT(NEWTOY(gitcheckout, "<1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_GITCLONE(NEWTOY(gitclone, "<1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_GITFETCH(NEWTOY(gitfetch, 0, TOYFLAG_USR|TOYFLAG_BIN))
+USE_GITINIT(NEWTOY(gitinit, "<1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_GITREMOTE(NEWTOY(gitremote, "<1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_GPIODETECT(NEWTOY(gpiodetect, ">0", TOYFLAG_USR|TOYFLAG_BIN))
+USE_GREP(NEWTOY(grep, "(line-buffered)(color):;(exclude-dir)*S(exclude)*M(include)*ZzEFHIab(byte-offset)h(no-filename)ino(only-matching)rRsvwc(count)L(files-without-match)l(files-with-matches)q(quiet)(silent)e*f*C#B#A#m#x[!wx][!EF]", TOYFLAG_BIN|TOYFLAG_ARGFAIL(2)|TOYFLAG_LINEBUF))
+USE_GZIP(NEWTOY(gzip, "n(no-name)cdfkt123456789[-123456789]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_REBOOT(OLDTOY(halt, reboot, TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
+USE_HD(OLDTOY(hd, hexdump, TOYFLAG_USR|TOYFLAG_BIN))
+USE_HEAD(NEWTOY(head, "?n(lines)#<0=10c(bytes)#<0qv[-nc]", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
+USE_HWCLOCK(NEWTOY(hwclock, ">0(fast)f(rtc):u(utc)l(localtime)t(systz)s(hctosys)r(show)w(systohc)[-ul][!rtsw]", TOYFLAG_SBIN))
+USE_I2CTRANSFER(NEWTOY(i2ctransfer, "<2vfy", TOYFLAG_USR|TOYFLAG_SBIN))
+USE_INSMOD(NEWTOY(insmod, "<1", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
+USE_IP(OLDTOY(ipaddr, ip, TOYFLAG_SBIN))
+USE_IPCRM(NEWTOY(ipcrm, "m*M*s*S*q*Q*", TOYFLAG_USR|TOYFLAG_BIN))
+USE_IP(OLDTOY(iplink, ip, TOYFLAG_SBIN))
+USE_IP(OLDTOY(iproute, ip, TOYFLAG_SBIN))
+USE_IP(OLDTOY(iprule, ip, TOYFLAG_SBIN))
+USE_IP(OLDTOY(iptunnel, ip, TOYFLAG_SBIN))
+USE_LAST(NEWTOY(last, "f:W", TOYFLAG_BIN))
+USE_LN(NEWTOY(ln, "<1rt:Tvnfs", TOYFLAG_BIN))
+USE_LS(NEWTOY(ls, "(sort):(color):;(full-time)(show-control-chars)\377(block-size)#=1024<1\241(group-directories-first)\376ZgoACFHLNRSUXabcdfhikl@mnpqrstuw#=80<0x1[-Cxm1][-Cxml][-Cxmo][-Cxmg][-cu][-ftS][-HL][-Nqb][-k\377]", TOYFLAG_BIN))
+USE_LSATTR(NEWTOY(lsattr, "ldapvR", TOYFLAG_BIN))
+USE_LSMOD(NEWTOY(lsmod, NULL, TOYFLAG_SBIN))
+USE_LSOF(NEWTOY(lsof, "lp*t", TOYFLAG_USR|TOYFLAG_BIN))
+USE_LSPCI(NEWTOY(lspci, "emkn@x@i:", TOYFLAG_USR|TOYFLAG_BIN))
+USE_LSUSB(NEWTOY(lsusb, "i:", TOYFLAG_USR|TOYFLAG_BIN))
+USE_MAKEDEVS(NEWTOY(makedevs, "<1>1d:", TOYFLAG_USR|TOYFLAG_BIN))
+USE_MDEV(NEWTOY(mdev, "s", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_UMASK))
+USE_MKDIR(NEWTOY(mkdir, "<1"USE_MKDIR_Z("Z:")"vp(parent)(parents)m:", TOYFLAG_BIN|TOYFLAG_UMASK))
+USE_MKNOD(NEWTOY(mknod, "<2>4m(mode):"USE_MKNOD_Z("Z:"), TOYFLAG_BIN|TOYFLAG_UMASK))
+USE_MKPASSWD(NEWTOY(mkpasswd, ">2S:m:P#=0<0", TOYFLAG_USR|TOYFLAG_BIN))
+USE_MODINFO(NEWTOY(modinfo, "<1b:k:F:0", TOYFLAG_SBIN))
+USE_MODPROBE(NEWTOY(modprobe, "alrqvsDbd*", TOYFLAG_SBIN))
+USE_NBD_CLIENT(OLDTOY(nbd-client, nbd_client, TOYFLAG_USR|TOYFLAG_BIN))
+USE_NBD_SERVER(OLDTOY(nbd-server, nbd_server, TOYFLAG_USR|TOYFLAG_BIN))
+USE_NETCAT(OLDTOY(nc, netcat, TOYFLAG_USR|TOYFLAG_BIN))
+USE_NETCAT(NEWTOY(netcat, "^tElLw#<1W#<1p#<1>65535q#<1s:f:46uUnvz[!tlL][!Lw][!Lu][!46U]", TOYFLAG_BIN))
+USE_NPROC(NEWTOY(nproc, "(all)", TOYFLAG_USR|TOYFLAG_BIN))
+USE_OD(NEWTOY(od, "j#vw#<1=16N#xsodcbA:t*", TOYFLAG_USR|TOYFLAG_BIN))
+USE_PASSWD(NEWTOY(passwd, ">1a:dlu", TOYFLAG_STAYROOT|TOYFLAG_USR|TOYFLAG_BIN))
+USE_PASTE(NEWTOY(paste, "d:s", TOYFLAG_USR|TOYFLAG_BIN))
+USE_PGREP(NEWTOY(pgrep, "?cld:u*U*t*s*P*g*G*fnovxL:[-no]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_PING(OLDTOY(ping6, ping, TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
+USE_REBOOT(OLDTOY(poweroff, reboot, TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
+USE_ULIMIT(OLDTOY(prlimit, ulimit, TOYFLAG_USR|TOYFLAG_BIN))
+USE_READAHEAD(NEWTOY(readahead, NULL, TOYFLAG_BIN))
+USE_READLINK(NEWTOY(readlink, "<1vnf(canonicalize)emqz[-mef][-qv]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_RM(NEWTOY(rm, "f(force)iRrv[-fi]", TOYFLAG_BIN))
+USE_RMDIR(NEWTOY(rmdir, "<1(ignore-fail-on-non-empty)p(parents)", TOYFLAG_BIN))
+USE_RMMOD(NEWTOY(rmmod, "<1wf", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
+USE_SED(NEWTOY(sed, "(help)(version)(tarxform)e*f*i:;nErz(null-data)s[+Er]", TOYFLAG_BIN|TOYFLAG_NOHELP))
+USE_SETFATTR(NEWTOY(setfattr, "hn:|v:x:|[!xv]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_SHA1SUM(OLDTOY(sha1sum, md5sum, TOYFLAG_USR|TOYFLAG_BIN))
+USE_SHA224SUM(OLDTOY(sha224sum, md5sum, TOYFLAG_USR|TOYFLAG_BIN))
+USE_SHA256SUM(OLDTOY(sha256sum, md5sum, TOYFLAG_USR|TOYFLAG_BIN))
+USE_SHA384SUM(OLDTOY(sha384sum, md5sum, TOYFLAG_USR|TOYFLAG_BIN))
+USE_SHA512SUM(OLDTOY(sha512sum, md5sum, TOYFLAG_USR|TOYFLAG_BIN))
+USE_SKELETON_ALIAS(NEWTOY(skeleton_alias, "b#dq", TOYFLAG_USR|TOYFLAG_BIN))
+USE_SORT(NEWTOY(sort, USE_SORT_FLOAT("g")"S:T:m" "o:k*t:" "xVbMCcszdfirun", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_ARGFAIL(2)))
+USE_STRACE(NEWTOY(strace, "^p#s#v", TOYFLAG_USR|TOYFLAG_SBIN))
+USE_STRINGS(NEWTOY(strings, "t:an#=4<1fo", TOYFLAG_USR|TOYFLAG_BIN))
+USE_SYSLOGD(NEWTOY(syslogd,">0l#<1>8=8R:b#<0>99=1s#<0=200m#<0>71582787=20O:p:f:a:nSKLD", TOYFLAG_SBIN|TOYFLAG_STAYROOT))
+USE_TAIL(NEWTOY(tail, "?fFs:c(bytes)-n(lines)-[-cn][-fF]", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
+USE_TASKSET(NEWTOY(taskset, "<1^pa", TOYFLAG_USR|TOYFLAG_BIN))
+USE_TEE(NEWTOY(tee, "ia", TOYFLAG_USR|TOYFLAG_BIN))
+USE_TELNET(NEWTOY(telnet, "<1>2", TOYFLAG_BIN))
+USE_TELNETD(NEWTOY(telnetd, "w#<0b:p#<0>65535=23f:l:FSKi[!wi]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_SH(OLDTOY(toysh, sh, TOYFLAG_BIN))
+USE_TR(NEWTOY(tr, "^<1>2Ccstd[+cC]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_TRACEROUTE(NEWTOY(traceroute, "<1>2i:f#<1>255=1z#<0>86400=0g*w#<0>86400=5t#<0>255=0s:q#<1>255=3p#<1>65535=33434m#<1>255=30rvndlIUF64", TOYFLAG_STAYROOT|TOYFLAG_USR|TOYFLAG_BIN))
+USE_TRACEROUTE(OLDTOY(traceroute6,traceroute, TOYFLAG_STAYROOT|TOYFLAG_USR|TOYFLAG_BIN))
+USE_TRUE(NEWTOY(true, NULL, TOYFLAG_BIN|TOYFLAG_NOHELP|TOYFLAG_MAYFORK))
+USE_TRUNCATE(NEWTOY(truncate, "<1s:|c", TOYFLAG_USR|TOYFLAG_BIN))
+USE_TSORT(NEWTOY(tsort, ">1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_TCPSVD(OLDTOY(udpsvd, tcpsvd, TOYFLAG_USR|TOYFLAG_BIN))
+USE_UNAME(NEWTOY(uname, "paomvrns", TOYFLAG_BIN))
+USE_UNICODE(NEWTOY(unicode, "<1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_USERADD(NEWTOY(useradd, "<1>2u#<0G:s:g:h:SDH", TOYFLAG_NEEDROOT|TOYFLAG_UMASK|TOYFLAG_SBIN))
+USE_UUDECODE(NEWTOY(uudecode, ">1o:", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_UMASK))
+USE_UUENCODE(NEWTOY(uuencode, "<1>2m", TOYFLAG_USR|TOYFLAG_BIN))
+USE_WC(NEWTOY(wc, "Lcmwl", TOYFLAG_USR|TOYFLAG_BIN))
+USE_WHICH(NEWTOY(which, "<1a", TOYFLAG_USR|TOYFLAG_BIN))
+USE_WHOAMI(OLDTOY(whoami, logname, TOYFLAG_USR|TOYFLAG_BIN))
+USE_XARGS(NEWTOY(xargs, "^E:P#<0(null)=1optr(no-run-if-empty)n#<1(max-args)s#0[!0E]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_XZCAT(NEWTOY(xzcat, NULL, TOYFLAG_USR|TOYFLAG_BIN))
+USE_ZCAT(NEWTOY(zcat, "cdfkt123456789[-123456789]", TOYFLAG_USR|TOYFLAG_BIN))
diff --git a/scripts/prereq/generated/tags.h b/scripts/prereq/generated/tags.h
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/scripts/prereq/generated/tags.h
@@ -0,0 +1 @@
+
diff --git a/scripts/probes/cmd2dpkg b/scripts/probes/cmd2dpkg
new file mode 100755
index 00000000..6a9c3489
--- /dev/null
+++ b/scripts/probes/cmd2dpkg
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Show debian packages host versions of each command live in
+# (Alas, not as useful as I thought it would be.)
+
+[ -x toybox ] || { echo "no ./toybox" >&2; exit 1; }
+
+declare -A ray
+
+# Sad that this is NOT in the default path, but less dumb than /bin/sh->dash
+PATH="$PATH":/sbin:/usr/sbin
+
+# Only checks installed packages, puts anything it can't find in none:
+for i in $(./toybox)
+do
+ tty -s && echo -n . >&2
+ which $i >/dev/null || { ray["none:"]+=" $i"; continue; }
+
+ ray[$(dpkg-query -S $(readlink -f $(which $i)) | toybox cut -DF 1)]+=" $i"
+done
+
+# Print results
+for i in ${!ray[@]}
+do
+ echo $i ${ray[$i]}
+done
diff --git a/scripts/recreate-prereq.sh b/scripts/recreate-prereq.sh
new file mode 100755
index 00000000..328290ef
--- /dev/null
+++ b/scripts/recreate-prereq.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# Regenerate scripts/prereq (hopefully) portable build.
+
+# Detect toybox prerequisites using record-commands
+
+mkroot/record-commands make clean defconfig toybox
+sed -i 's/default y/default n/' generated/Config.probed
+CMDLIST="$(echo toybox; ./toybox cut -DF 1 log.txt | sort -u)"
+{
+ for i in $(tr '[:lower:]' '[:upper:]' <<<"$CMDLIST")
+ do
+ grep -qi CONFIG_$i'[= ]' .config && echo CONFIG_$i=y
+ done
+} > prereq.mini
+
+# Create minimal dependency-free build
+
+make clean allnoconfig KCONFIG_ALLCONFIG=prereq.mini
+make toybox
+cat > scripts/prereq/build.sh << 'EOF'
+#!/bin/sh
+
+BUILD='cc -funsigned-char -I scripts/prereq -I . -Os -ffunction-sections -fdata-sections -fno-asynchronous-unwind-tables -fno-strict-aliasing -DTOYBOX_VERSION=""'
+LINK=''
+EOF
+
+# harvest stripped down headers
+
+grep -A999 FILES= generated/build.sh >> scripts/prereq/build.sh
+echo > scripts/prereq/generated/tags.h
+sed 's/.*/#define HELP_& ""/' <<<"$CMDLIST" > scripts/prereq/generated/help.h
+egrep "($(xargs <<<"$CMDLIST"|tr ' [:lower:]' '|[:upper:]'))" \
+ generated/newtoys.h > scripts/prereq/generated/newtoys.h
+FORS="$(sed -n 's/#define FOR_//p' $(grep -o 'toys/[^/]*/[^.]*\.c' scripts/prereq/build.sh) | xargs | tr ' ' '|')"
+sed -En '1,/^$/p;/\/\/ ('"$FORS"') /,/^$/p;/#ifdef FOR_('"$FORS"')$/,/^$/p' generated/flags.h > scripts/prereq/generated/flags.h
+egrep "OPTSTR_($(egrep -v "($FORS)" <<<"$CMDLIST" | xargs | tr ' ' '|'))" \
+ generated/flags.h >> scripts/prereq/generated/flags.h
+# TODO: slim down config.h
+cp generated/{globals,config}.h scripts/prereq/generated/
diff --git a/toys/other/inotifyd.c b/toys/other/inotifyd.c
index 3dc66025..4e886bc5 100644
--- a/toys/other/inotifyd.c
+++ b/toys/other/inotifyd.c
@@ -5,7 +5,7 @@
*
* No Standard.
-USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN))
+USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
config INOTIFYD
bool "inotifyd"
@@ -55,7 +55,6 @@ void inotifyd_main(void)
if (!masks) mask = 0xfff; // default to all
else{
- *masks++ = 0;
for (*masks++ = 0; *masks; masks++) {
i = stridx(masklist, *masks);;
if (i == -1) error_exit("bad mask '%c'", *masks);
diff --git a/www/faq.html b/www/faq.html
index 84cf3107..c39ae274 100644
--- a/www/faq.html
+++ b/www/faq.html
@@ -826,7 +826,7 @@ should list all the available cross compilers it recognizes under ccc,
something like:</p>
<blockquote><b><p>
-aarch64 armv4l armv5l armv7l armv7m armv7r i486 i686 m68k microblaze mips mips64 mipsel or1k powerpc powerpc64 powerpc64le s390x sh2eb sh4 x32 x86_64
+aarch64 armv4l armv5l armv7l armv7m armv7r i486 i686 m68k microblaze mips mips64 mipsel or1k powerpc powerpc64 powerpc64le riscv32 riscv64 s390x sh2eb sh4 sh4eb x32 x86_64
</p></b></blockquote>
<p>(A long time ago I