92 lines
2.6 KiB
Bash
Executable file
92 lines
2.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
builder_image=""
|
|
linux_version=""
|
|
source_url=""
|
|
config_url=""
|
|
workdir=""
|
|
output=""
|
|
jobs="${PYRO_KERNEL_BUILD_JOBS:-}"
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--builder-image) builder_image="$2"; shift 2 ;;
|
|
--linux-version) linux_version="$2"; shift 2 ;;
|
|
--source-url) source_url="$2"; shift 2 ;;
|
|
--config-url) config_url="$2"; shift 2 ;;
|
|
--workdir) workdir="$2"; shift 2 ;;
|
|
--output) output="$2"; shift 2 ;;
|
|
--jobs) jobs="$2"; shift 2 ;;
|
|
*) echo "unknown arg: $1" >&2; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
: "${builder_image:?missing --builder-image}"
|
|
: "${linux_version:?missing --linux-version}"
|
|
: "${source_url:?missing --source-url}"
|
|
: "${config_url:?missing --config-url}"
|
|
: "${workdir:?missing --workdir}"
|
|
: "${output:?missing --output}"
|
|
|
|
if [[ -z "$jobs" ]]; then
|
|
cpu_jobs="$(nproc)"
|
|
mem_available_kib="$(awk '/MemAvailable:/ { print $2; exit }' /proc/meminfo || true)"
|
|
jobs="$cpu_jobs"
|
|
if [[ "$mem_available_kib" =~ ^[0-9]+$ ]]; then
|
|
# Keep kernel compilation conservative by default; high parallelism can trigger
|
|
# compiler crashes on memory-constrained hosts even when CPU count is high.
|
|
mem_jobs="$(( mem_available_kib / (1536 * 1024) ))"
|
|
if (( mem_jobs < 1 )); then
|
|
mem_jobs=1
|
|
fi
|
|
if (( mem_jobs < jobs )); then
|
|
jobs="$mem_jobs"
|
|
fi
|
|
fi
|
|
if (( jobs > 2 )); then
|
|
jobs=2
|
|
fi
|
|
fi
|
|
|
|
if ! [[ "$jobs" =~ ^[1-9][0-9]*$ ]]; then
|
|
echo "invalid --jobs value: $jobs" >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$workdir" "$(dirname "$output")"
|
|
workdir="$(cd "$workdir" && pwd)"
|
|
output_dir="$(cd "$(dirname "$output")" && pwd)"
|
|
output="$output_dir/$(basename "$output")"
|
|
container_script="$workdir/build-kernel-container.sh"
|
|
cat > "$container_script" <<'SCRIPT'
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends \
|
|
bc bison build-essential ca-certificates curl flex libelf-dev libssl-dev pahole python3 rsync xz-utils
|
|
cd /work
|
|
curl -fsSL "$KERNEL_SOURCE_URL" -o linux.tar.xz
|
|
curl -fsSL "$KERNEL_CONFIG_URL" -o kernel.config
|
|
rm -rf linux-src out
|
|
mkdir -p linux-src out
|
|
tar -xf linux.tar.xz -C linux-src --strip-components=1
|
|
cd linux-src
|
|
cp /work/kernel.config .config
|
|
make olddefconfig
|
|
make -j"$KERNEL_MAKE_JOBS" vmlinux
|
|
cp vmlinux /work/out/vmlinux
|
|
SCRIPT
|
|
chmod +x "$container_script"
|
|
mkdir -p "$workdir/out"
|
|
|
|
docker run --rm \
|
|
-e KERNEL_MAKE_JOBS="$jobs" \
|
|
-e KERNEL_SOURCE_URL="$source_url" \
|
|
-e KERNEL_CONFIG_URL="$config_url" \
|
|
-v "$workdir:/work" \
|
|
"$builder_image" \
|
|
/work/build-kernel-container.sh
|
|
|
|
cp "$workdir/out/vmlinux" "$output"
|