Files
cxos-vendor-busybox/build.sh
T
2026-04-26 16:35:08 +00:00

86 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# cxos/vendor/busybox/build.sh — build a static busybox + install into rootfs.
#
# Usage:
# build.sh # x86_64, install into dist/cxos/rootfs
# build.sh --arch aarch64
# build.sh --rootfs /path/to/rootfs
# build.sh --dry
#
# After install:
# <rootfs>/bin/busybox static binary (~1 MB)
# <rootfs>/bin/* ./sbin/* symlinks to busybox (one per applet)
set -euo pipefail
ARCH="x86_64"
DRY=0
ROOTFS=""
for ((i=1; i<=$#; i++)); do
case "${!i}" in
--arch) ((i++)); ARCH="${!i}" ;;
--rootfs) ((i++)); ROOTFS="${!i}" ;;
--dry) DRY=1 ;;
-h|--help) sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
*) echo "build.sh: unknown arg: ${!i}" >&2; exit 2 ;;
esac
done
HERE="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$HERE/../../.." && pwd)"
PINNED="$HERE/PINNED.json"
FRAGMENT="$HERE/cxos.config.fragment"
VERSION="$(python3 -c 'import json,sys;print(json.load(open(sys.argv[1]))["version"])' "$PINNED")"
EXTRACTED_DIR="$(python3 -c 'import json,sys;print(json.load(open(sys.argv[1]))["extracted_dir"])' "$PINNED")"
SRC="$HERE/src/$EXTRACTED_DIR"
ROOTFS="${ROOTFS:-$REPO_ROOT/dist/cxos/rootfs}"
case "$ARCH" in
x86_64) CROSS="" ;;
aarch64) CROSS="${CROSS_COMPILE:-aarch64-linux-gnu-}" ;;
*) echo "build.sh: unsupported arch: $ARCH" >&2; exit 2 ;;
esac
JOBS="${JOBS:-$(nproc 2>/dev/null || echo 2)}"
echo "==> busybox ${VERSION} (${ARCH}) -> ${ROOTFS}"
echo " src : ${SRC}"
echo " fragment: ${FRAGMENT}"
echo " cross : ${CROSS:-<native>}"
echo " jobs : ${JOBS}"
if [[ "$DRY" == "1" ]]; then
echo "==> dry-run; not compiling"
exit 0
fi
[[ -d "$SRC" ]] || { echo "build.sh: source not extracted; run fetch.sh first" >&2; exit 1; }
cd "$SRC"
make CROSS_COMPILE="$CROSS" defconfig
# Apply fragment overrides line-by-line. Lines that start with '#' or are
# blank are skipped. KEY=VALUE lines replace any existing KEY= line, or are
# appended if absent.
while IFS= read -r line; do
[[ -z "$line" || "$line" == \#* ]] && continue
key="${line%%=*}"
if grep -qE "^# ${key} is not set$|^${key}=" .config; then
sed -i -E "s|^# ${key} is not set\$|${line}|; s|^${key}=.*|${line}|" .config
else
printf '%s\n' "$line" >> .config
fi
done < "$FRAGMENT"
make CROSS_COMPILE="$CROSS" oldconfig
make CROSS_COMPILE="$CROSS" -j"$JOBS" busybox
mkdir -p "$ROOTFS"
make CROSS_COMPILE="$CROSS" CONFIG_PREFIX="$ROOTFS" install
# busybox install creates /linuxrc symlink — pointless on initramfs (we have
# our own /init). Drop it.
rm -f "$ROOTFS/linuxrc"
echo "==> installed: $(find "$ROOTFS/bin" "$ROOTFS/sbin" -maxdepth 1 -mindepth 1 2>/dev/null | wc -l) applets"