mirror of
https://github.com/edera-dev/sprout.git
synced 2025-12-19 08:30:16 +00:00
initial commit
This commit is contained in:
17
hack/autofix.sh
Executable file
17
hack/autofix.sh
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
cd "$(dirname "${0}")/.." || exit 1
|
||||
|
||||
NATIVE_ARCH="$(uname -m)"
|
||||
[ "${NATIVE_ARCH}" = "arm64" ] && NATIVE_ARCH="aarch64"
|
||||
[ "${NATIVE_ARCH}" = "amd64" ] && NATIVE_ARCH="x86_64"
|
||||
|
||||
if [ "$(uname)" != "Linux" ]; then
|
||||
cargo clippy --workspace --fix --allow-dirty --allow-staged \
|
||||
--target "${NATIVE_ARCH}-unknown-uefi"
|
||||
else
|
||||
cargo clippy --workspace --fix --allow-dirty --allow-staged
|
||||
fi
|
||||
|
||||
./hack/format.sh
|
||||
48
hack/boot.sh
Executable file
48
hack/boot.sh
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
cd "$(dirname "${0}")/.." || exit 1
|
||||
|
||||
. "hack/common.sh"
|
||||
|
||||
./hack/build.sh "${TARGET_ARCH}" "${RUST_PROFILE}"
|
||||
|
||||
clear
|
||||
|
||||
set --
|
||||
|
||||
if [ "${TARGET_ARCH}" = "x86_64" ]; then
|
||||
set -- "${@}" qemu-system-x86_64 -M q35
|
||||
elif [ "${TARGET_ARCH}" = "aarch64" ]; then
|
||||
set -- "${@}" qemu-system-aarch64 -M virt -cpu cortex-a57
|
||||
fi
|
||||
|
||||
set -- "${@}" -smp 2 -m 4096
|
||||
|
||||
if [ "${NO_GRAPHICAL_BOOT}" = "1" ]; then
|
||||
set -- "${@}" -nographic
|
||||
else
|
||||
set -- "${@}" -serial stdio -vga none -device "virtio-gpu,edid=on,xres=1024,yres=768"
|
||||
fi
|
||||
|
||||
rm -f "${FINAL_DIR}/ovmf-boot.fd"
|
||||
cp "${FINAL_DIR}/ovmf.fd" "${FINAL_DIR}/ovmf-boot.fd"
|
||||
if [ "${TARGET_ARCH}" = "aarch64" ]; then
|
||||
dd if=/dev/zero of="${FINAL_DIR}/ovmf-boot.fd" bs=1 count=1 seek=67108863 >/dev/null 2>&1
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
set -- "${@}" \
|
||||
-drive "if=pflash,file=${FINAL_DIR}/ovmf-boot.fd,format=raw,readonly=on" \
|
||||
-device nvme,drive=disk1,serial=cafebabe
|
||||
|
||||
if [ "${DISK_BOOT}" = "1" ]; then
|
||||
set -- "${@}" \
|
||||
-drive "if=none,file=${FINAL_DIR}/sprout.img,format=raw,id=disk1,readonly=on"
|
||||
else
|
||||
set -- "${@}" \
|
||||
-drive "if=none,file=fat:rw:${FINAL_DIR}/efi,format=raw,id=disk1"
|
||||
fi
|
||||
|
||||
set -- "${@}" -name "sprout ${TARGET_ARCH}"
|
||||
|
||||
exec "${@}"
|
||||
72
hack/build.sh
Executable file
72
hack/build.sh
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
cd "$(dirname "${0}")/.." || exit 1
|
||||
|
||||
. "hack/common.sh"
|
||||
|
||||
EFI_NAME="BOOTX64"
|
||||
if [ "${TARGET_ARCH}" = "aarch64" ]; then
|
||||
EFI_NAME="BOOTAA64"
|
||||
fi
|
||||
|
||||
echo "[build] ${TARGET_ARCH} ${RUST_PROFILE}"
|
||||
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
echo "ERROR: docker is required to build sprout." >/dev/stderr
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export DOCKER_CLI_HINTS="0"
|
||||
|
||||
if [ "${SKIP_CLEANUP}" != 1 ]; then
|
||||
rm -rf "${FINAL_DIR}"
|
||||
fi
|
||||
mkdir -p "${FINAL_DIR}"
|
||||
|
||||
if [ "${SKIP_KERNEL_BUILD}" != "1" ] || [ "${SKIP_VM_BUILD}" != "1" ] || [ "${SKIP_SPROUT_BUILD}" != "1" ]; then
|
||||
docker build -t "${DOCKER_PREFIX}/sprout-utils-copy:${DOCKER_TAG}" -f hack/utils/Dockerfile.copy hack
|
||||
fi
|
||||
|
||||
if [ "${SKIP_KERNEL_BUILD}" != "1" ]; then
|
||||
echo "[kernel build] ${TARGET_ARCH} ${RUST_PROFILE}"
|
||||
docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-kernel-${TARGET_ARCH}:${DOCKER_TAG}" -f kernel/Dockerfile kernel
|
||||
|
||||
if [ "${KERNEL_BUILD_TAG}" = "1" ]; then
|
||||
docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-kernel-build-${TARGET_ARCH}:${DOCKER_TAG}" -f kernel/Dockerfile --target
|
||||
build kernel
|
||||
fi
|
||||
|
||||
docker run --rm -i \
|
||||
--mount="type=image,source=${DOCKER_PREFIX}/sprout-kernel-${TARGET_ARCH}:${DOCKER_TAG},target=/image" \
|
||||
"${DOCKER_PREFIX}/sprout-utils-copy:${DOCKER_TAG}" cat /image/kernel.efi >"${FINAL_DIR}/kernel.efi"
|
||||
fi
|
||||
|
||||
if [ "${SKIP_VM_BUILD}" != "1" ]; then
|
||||
echo "[vm build] ${TARGET_ARCH} ${RUST_PROFILE}"
|
||||
docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-ovmf-${TARGET_ARCH}:${DOCKER_TAG}" -f vm/Dockerfile.ovmf "${FINAL_DIR}"
|
||||
docker run --rm -i \
|
||||
--mount="type=image,source=${DOCKER_PREFIX}/sprout-ovmf-${TARGET_ARCH}:${DOCKER_TAG},target=/image" \
|
||||
"${DOCKER_PREFIX}/sprout-utils-copy:${DOCKER_TAG}" cat /image/ovmf.fd >"${FINAL_DIR}/ovmf.fd"
|
||||
fi
|
||||
|
||||
if [ "${SKIP_SPROUT_BUILD}" != "1" ]; then
|
||||
echo "[sprout build] ${TARGET_ARCH} ${RUST_PROFILE}"
|
||||
docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-${TARGET_ARCH}:${DOCKER_TAG}" --build-arg="RUST_TARGET_SUBDIR=${RUST_TARGET_SUBDIR}" -f Dockerfile .
|
||||
docker run --rm -i \
|
||||
--mount="type=image,source=${DOCKER_PREFIX}/sprout-${TARGET_ARCH}:${DOCKER_TAG},target=/image" \
|
||||
"${DOCKER_PREFIX}/sprout-utils-copy:${DOCKER_TAG}" cat /image/sprout.efi >"${FINAL_DIR}/sprout.efi"
|
||||
mkdir -p "${FINAL_DIR}/efi/EFI/BOOT"
|
||||
cp "${FINAL_DIR}/sprout.efi" "${FINAL_DIR}/efi/EFI/BOOT/${EFI_NAME}.EFI"
|
||||
if [ -f "${FINAL_DIR}/kernel.efi" ]; then
|
||||
cp "${FINAL_DIR}/kernel.efi" "${FINAL_DIR}/efi/EFI/BOOT/KERNEL.EFI"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${SKIP_BOOT_BUILD}" != "1" ]; then
|
||||
echo "[boot build] ${TARGET_ARCH} ${RUST_PROFILE}"
|
||||
docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-boot-${TARGET_ARCH}:${DOCKER_TAG}" --build-arg "EFI_NAME=${EFI_NAME}" -f boot/Dockerfile "${FINAL_DIR}"
|
||||
docker run --rm -i \
|
||||
--mount="type=image,source=${DOCKER_PREFIX}/sprout-boot-${TARGET_ARCH}:${DOCKER_TAG},target=/image" \
|
||||
"${DOCKER_PREFIX}/sprout-utils-copy:${DOCKER_TAG}" cat /image/sprout.img >"${FINAL_DIR}/sprout.img"
|
||||
fi
|
||||
20
hack/clean.sh
Executable file
20
hack/clean.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
cd "$(dirname "${0}")/.." || exit 1
|
||||
|
||||
. "hack/common.sh"
|
||||
|
||||
delete_image() {
|
||||
IMAGE="${1}"
|
||||
docker image ls -q --no-trunc --filter "reference=${DOCKER_PREFIX}/${IMAGE}" | xargs -rn1 docker image rm
|
||||
}
|
||||
|
||||
cargo clean || true
|
||||
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
delete_image sprout-utils-copy || true
|
||||
delete_image sprout-ovmf || true
|
||||
delete_image sprout-x86_64 || true
|
||||
delete_image sprout-aarch64 || true
|
||||
fi
|
||||
31
hack/common.sh
Normal file
31
hack/common.sh
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
# shellcheck disable=SC2034
|
||||
set -e
|
||||
|
||||
DOCKER_PREFIX="ghcr.io/edera-dev/sprout"
|
||||
DEFAULT_RUST_PROFILE="release"
|
||||
DEFAULT_DOCKER_TAG="latest"
|
||||
|
||||
[ -z "${TARGET_ARCH}" ] && TARGET_ARCH="${1}"
|
||||
{ [ -z "${TARGET_ARCH}" ] || [ "${TARGET_ARCH}" = "native" ]; } && TARGET_ARCH="$(uname -m)"
|
||||
[ -z "${RUST_PROFILE}" ] && RUST_PROFILE="${2}"
|
||||
[ -z "${RUST_PROFILE}" ] && RUST_PROFILE="${DEFAULT_RUST_PROFILE}"
|
||||
|
||||
[ "${TARGET_ARCH}" = "arm64" ] && TARGET_ARCH="aarch64"
|
||||
[ "${TARGET_ARCH}" = "amd64" ] && TARGET_ARCH="x86_64"
|
||||
|
||||
if [ "${TARGET_ARCH}" != "x86_64" ] && [ "${TARGET_ARCH}" != "aarch64" ]; then
|
||||
echo "Unsupported Architecture: ${TARGET_ARCH}" >/dev/stderr
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[ "${RUST_PROFILE}" = "debug" ] && RUST_PROFILE="dev"
|
||||
|
||||
RUST_TARGET_SUBDIR="${RUST_PROFILE}"
|
||||
[ "${RUST_PROFILE}" = "dev" ] && RUST_TARGET_SUBDIR="debug"
|
||||
|
||||
RUST_TARGET="${TARGET_ARCH}-unknown-uefi"
|
||||
|
||||
[ -z "${DOCKER_TAG}" ] && DOCKER_TAG="${DEFAULT_DOCKER_TAG}"
|
||||
DOCKER_TARGET="linux/${TARGET_ARCH}"
|
||||
FINAL_DIR="target/final/${TARGET_ARCH}"
|
||||
7
hack/format.sh
Executable file
7
hack/format.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
cd "$(dirname "${0}")/.." || exit 1
|
||||
|
||||
cargo fmt --all
|
||||
shfmt -w hack/*.sh
|
||||
1
hack/utils/Dockerfile.copy
Normal file
1
hack/utils/Dockerfile.copy
Normal file
@@ -0,0 +1 @@
|
||||
FROM --platform=$BUILDPLATFORM debian:trixie@sha256:fd8f5a1df07b5195613e4b9a0b6a947d3772a151b81975db27d47f093f60c6e6
|
||||
Reference in New Issue
Block a user