81 lines
2.4 KiB
Bash
Executable File
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)"
|