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

81 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# cxos/vendor/linux/build.sh — build the pinned Linux kernel for CxOS.
#
# Prerequisites:
# * `cxos/vendor/linux/fetch.sh` already ran (source extracted)
# * Host has gcc, make, bc, bison, flex, libssl-dev, libelf-dev
#
# Usage:
# build.sh # x86_64
# build.sh --arch aarch64
# build.sh --dry # print plan, don't compile
#
# Outputs (relative to repo root):
# dist/cxos/vmlinuz (x86_64 bzImage / aarch64 Image)
# dist/cxos/System.map
set -euo pipefail
ARCH="x86_64"
DRY=0
for ((i=1; i<=$#; i++)); do
case "${!i}" in
--arch) ((i++)); ARCH="${!i}" ;;
--dry) DRY=1 ;;
-h|--help)
sed -n '2,15p' "$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"
case "$ARCH" in
x86_64) KARCH="x86_64"; IMAGE_REL="arch/x86/boot/bzImage" ;;
aarch64) KARCH="arm64"; IMAGE_REL="arch/arm64/boot/Image" ;;
*) echo "build.sh: unsupported arch: $ARCH" >&2; exit 2 ;;
esac
OUT_DIR="$REPO_ROOT/dist/cxos"
JOBS="${JOBS:-$(nproc 2>/dev/null || echo 2)}"
echo "==> linux ${VERSION} (${KARCH}) -> ${OUT_DIR}/vmlinuz"
echo " src : ${SRC}"
echo " fragment: ${FRAGMENT}"
echo " jobs : ${JOBS}"
if [[ "$DRY" == "1" ]]; then
echo "==> dry-run; not compiling"
exit 0
fi
if [[ ! -d "$SRC" ]]; then
echo "build.sh: source not extracted; run fetch.sh first" >&2
exit 1
fi
mkdir -p "$OUT_DIR"
# Honor SOURCE_DATE_EPOCH for reproducibility.
KBUILD_BUILD_TIMESTAMP="$(date -u -d "@${SOURCE_DATE_EPOCH:-1700000000}" '+%Y-%m-%d %H:%M:%S UTC')"
export KBUILD_BUILD_TIMESTAMP
export KBUILD_BUILD_USER="cxos"
export KBUILD_BUILD_HOST="cxos-build"
cd "$SRC"
make ARCH="$KARCH" defconfig
"$SRC/scripts/kconfig/merge_config.sh" -O . .config "$FRAGMENT"
make ARCH="$KARCH" olddefconfig
make ARCH="$KARCH" -j"$JOBS"
cp -f "$IMAGE_REL" "$OUT_DIR/vmlinuz"
cp -f "System.map" "$OUT_DIR/System.map"
echo "==> wrote ${OUT_DIR}/vmlinuz ($(stat -c%s "$OUT_DIR/vmlinuz") bytes)"