#!/usr/bin/env bash set -euo pipefail builder_image="" linux_version="" source_url="" config_url="" workdir="" output="" 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 ;; *) 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}" 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"$(nproc)" vmlinux cp vmlinux /work/out/vmlinux SCRIPT chmod +x "$container_script" mkdir -p "$workdir/out" docker run --rm \ -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"