mouse/src

Blob: scripts/build-in-container.sh

Raw · Blame

#!/bin/sh
set -eu

script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
repo_dir=$(dirname "$script_dir")
source_parent=$(dirname "$repo_dir")
output_dir=${MOUSE_BUILD_DIR:-"$repo_dir/build"}

if [ -n "${MOUSE_BUILDER_PLATFORM:-}" ]; then
    builder_platform=$MOUSE_BUILDER_PLATFORM
else
    case "$(uname -m)" in
        arm64|aarch64) builder_platform=linux/arm64 ;;
        x86_64|amd64) builder_platform=linux/amd64 ;;
        *)
            printf '%s\n' "unsupported container host architecture: $(uname -m)" >&2
            exit 1
            ;;
    esac
fi

if [ ! -d "$source_parent/cheesed" ]; then
    printf '%s\n' "cheesed source tree not found: $source_parent/cheesed" >&2
    exit 1
fi

if [ -n "${CONTAINER_CLI:-}" ]; then
    container_cli=$CONTAINER_CLI
elif command -v container >/dev/null 2>&1; then
    container_cli=$(command -v container)
elif [ -x /usr/local/bin/container ]; then
    container_cli=/usr/local/bin/container
elif command -v docker >/dev/null 2>&1; then
    container_cli=$(command -v docker)
elif command -v podman >/dev/null 2>&1; then
    container_cli=$(command -v podman)
else
    printf '%s\n' "no supported container CLI found (container, docker, or podman)" >&2
    exit 1
fi

case "$(basename "$container_cli")" in
    container)
        "$container_cli" system start >/dev/null
        ;;
esac

mkdir -p "$output_dir"
build_context=$(mktemp -d "$output_dir/.container-context.XXXXXX")
build_context=$(CDPATH= cd -- "$build_context" && pwd)
export_dir=$(mktemp -d "$output_dir/.container-output.XXXXXX")
export_dir=$(CDPATH= cd -- "$export_dir" && pwd)

cleanup() {
    rm -rf "$build_context" "$export_dir"
}
trap cleanup EXIT HUP INT TERM

(
    cd "$source_parent"
    tar -cf - \
        --exclude='mouse-src/.git/*' \
        --exclude='mouse-src/build/*' \
        --exclude='mouse-src/sources/*' \
        --exclude='mouse-src/Containerfile' \
        --exclude='mouse-src/.containerignore' \
        --exclude='mouse-src/scripts/build-in-container.sh' \
        --exclude='cheesed/.git/*' \
        --exclude='cheesed/target/*' \
        mouse-src cheesed
) | tar -xf - -C "$build_context"

cp "$repo_dir/Containerfile" "$build_context/Dockerfile"
cp "$repo_dir/.containerignore" "$build_context/.dockerignore"

(
    cd "$build_context"
    "$container_cli" build \
        --platform "$builder_platform" \
        --output "type=local,dest=$export_dir" \
        .
)

artifacts_dir=$export_dir
if [ ! -f "$artifacts_dir/vmlinuz-virt" ]; then
    platform_dir=$(printf '%s\n' "$builder_platform" | tr / _)
    artifacts_dir="$export_dir/out.tar/$platform_dir"
fi

for artifact in vmlinuz-virt mouse-initramfs.cpio.gz; do
    if [ ! -f "$artifacts_dir/$artifact" ]; then
        printf '%s\n' "container build did not export $artifact" >&2
        exit 1
    fi
    install -m 0644 "$artifacts_dir/$artifact" "$output_dir/$artifact"
done

printf '%s\n' "exported $output_dir/vmlinuz-virt"
printf '%s\n' "exported $output_dir/mouse-initramfs.cpio.gz"