162 lines
4.8 KiB
Makefile
162 lines
4.8 KiB
Makefile
ARTIFACTS_PATH ?= bin
|
|
IMAGE_NAME ?= dusk.iso
|
|
MODE ?= debug
|
|
ARCH ?= x86_64
|
|
MEMORY ?= 512M
|
|
# In MB
|
|
ISO_SIZE ?= 512
|
|
QEMU_OPTS ?=
|
|
GDB ?=
|
|
CPUS ?= 1
|
|
# FAT type
|
|
ESP_BITS ?= 32
|
|
#EXPORT_SYMBOLS = true
|
|
|
|
ISO_PATH = ${ARTIFACTS_PATH}/iso_root
|
|
INITRAMFS_PATH = ${ARTIFACTS_PATH}/initramfs
|
|
IMAGE_PATH = ${ARTIFACTS_PATH}/${IMAGE_NAME}
|
|
ESP_IMAGE = ${ARTIFACTS_PATH}/esp.img
|
|
USERSPACE_CARGO_OPTS = --target ${ARCH}-unknown-none
|
|
CARGO_OPTS = -Zjson-target-spec --target=src/arch/${ARCH}/${ARCH}-unknown-none.json
|
|
QEMU_OPTS += -m ${MEMORY} -drive id=hd0,format=raw,file=${IMAGE_PATH}
|
|
LIMINE_BOOT_VARIATION = X64
|
|
LIMINE_VERSION = v12.5.2
|
|
LIMINE_URL = https://github.com/limine-bootloader/limine/releases/download/${LIMINE_VERSION}/limine-binary.zip
|
|
|
|
KERNEL_FILE = target/${ARCH}-unknown-none/${MODE}/dusk.elf
|
|
|
|
ifeq (${MODE},release)
|
|
CARGO_OPTS += --release
|
|
USERSPACE_CARGO_OPTS += --release
|
|
endif
|
|
|
|
ifneq (${CPUS},1)
|
|
QEMU_OPTS += -smp ${CPUS}
|
|
endif
|
|
|
|
ifneq (${GDB},)
|
|
QEMU_OPTS += -s -S
|
|
endif
|
|
|
|
ifneq (${KVM},)
|
|
QEMU_OPTS += -accel kvm -cpu host
|
|
endif
|
|
|
|
ifneq (${UEFI},)
|
|
RUN_OPTS := ovmf-${ARCH}
|
|
QEMU_OPTS += -bios ovmf/ovmf-${ARCH}/OVMF.fd
|
|
endif
|
|
|
|
.PHONY: all build
|
|
|
|
all: build
|
|
|
|
build: prepare-bin-files compile-bootloader compile-binaries compile-initramfs build-iso
|
|
|
|
check:
|
|
cargo check -Zjson-target-spec
|
|
|
|
prepare-bin-files:
|
|
# Remove ISO and everything in the bin directory
|
|
rm -f ${IMAGE_PATH}
|
|
rm -rf ${ARTIFACTS_PATH}/*
|
|
|
|
# Make bin/ and bin/iso_root
|
|
mkdir -p ${ARTIFACTS_PATH}
|
|
mkdir -p ${ISO_PATH}
|
|
mkdir -p ${INITRAMFS_PATH}
|
|
|
|
compile-user:
|
|
RUSTFLAGS="-C relocation-model=static" cargo build --package omega3 ${USERSPACE_CARGO_OPTS}
|
|
RUSTFLAGS="-C relocation-model=static" cargo build --package client ${USERSPACE_CARGO_OPTS}
|
|
RUSTFLAGS="-C relocation-model=static" cargo build --package echo ${USERSPACE_CARGO_OPTS}
|
|
|
|
copy-initramfs-files: compile-user
|
|
cp -v target/${ARCH}-unknown-none/${MODE}/omega3 ${INITRAMFS_PATH}/omega3.elf
|
|
cp -v target/${ARCH}-unknown-none/${MODE}/client ${INITRAMFS_PATH}/client.elf
|
|
cp -v target/${ARCH}-unknown-none/${MODE}/echo ${INITRAMFS_PATH}/echo.elf
|
|
|
|
compile-initramfs: copy-initramfs-files
|
|
(cd ${INITRAMFS_PATH} && find . -mindepth 1 | cpio -o -H newc) > ${ARTIFACTS_PATH}/initramfs.img
|
|
|
|
copy-iso-files:
|
|
# Limine files
|
|
mkdir -p ${ISO_PATH}/boot/limine
|
|
mkdir -p ${ISO_PATH}/EFI/BOOT
|
|
|
|
cp -v limine.conf limine/limine-bios.sys ${ISO_PATH}/boot/limine
|
|
cp -v limine/BOOT${LIMINE_BOOT_VARIATION}.EFI ${ISO_PATH}/EFI/BOOT/
|
|
|
|
# OS files
|
|
cp -v ${KERNEL_FILE} ${ISO_PATH}/boot
|
|
cp -v ${ARTIFACTS_PATH}/initramfs.img ${ISO_PATH}/boot
|
|
|
|
build-esp: copy-iso-files
|
|
# Create and populate formatted FAT image for ESP partition (130048 1K-blocks = ~127MiB)
|
|
mkfs.fat -F ${ESP_BITS} -C ${ESP_IMAGE} 130048
|
|
mcopy -s -i ${ESP_IMAGE} ${ISO_PATH}/* ::
|
|
|
|
partition-iso:
|
|
# Make empty disk image
|
|
dd if=/dev/zero of=${IMAGE_PATH} bs=1M count=0 seek=${ISO_SIZE}
|
|
ifneq (${UEFI},)
|
|
parted -s ${IMAGE_PATH} mklabel gpt
|
|
parted -s ${IMAGE_PATH} mkpart ESP fat${ESP_BITS} 2048s 262144s
|
|
parted -s ${IMAGE_PATH} set 1 esp on
|
|
else
|
|
parted -s ${IMAGE_PATH} mklabel msdos
|
|
parted -s ${IMAGE_PATH} mkpart primary fat${ESP_BITS} 2048s 262144s
|
|
parted -s ${IMAGE_PATH} set 1 boot on
|
|
endif
|
|
|
|
# Make second partition spanning the rest of the disk
|
|
parted -s ${IMAGE_PATH} mkpart primary 262145s 100%
|
|
|
|
build-iso: partition-iso build-esp
|
|
# Splice ESP partition into sector 2048 of the disk image
|
|
dd if=${ESP_IMAGE} of=${IMAGE_PATH} bs=512 seek=2048 conv=notrunc
|
|
ifeq (${UEFI},)
|
|
# install limine for legacy bios
|
|
./limine/limine bios-install ${IMAGE_PATH}
|
|
endif
|
|
|
|
compile-bootloader:
|
|
@if [ ! -f "limine/.version" ] || [ "$$(cat limine/.version)" != "${LIMINE_VERSION}" ]; then \
|
|
echo "Downloading Limine ${LIMINE_VERSION}..."; \
|
|
rm -rf limine limine-binary limine-binary.zip; \
|
|
curl -fLo limine-binary.zip "${LIMINE_URL}"; \
|
|
unzip -q limine-binary.zip; \
|
|
mv limine-binary limine; \
|
|
rm limine-binary.zip; \
|
|
printf '%s\n' "${LIMINE_VERSION}" > limine/.version; \
|
|
fi
|
|
${MAKE} -C limine
|
|
|
|
compile-binaries:
|
|
cargo build ${CARGO_OPTS}
|
|
|
|
ovmf-x86_64:
|
|
mkdir -p ovmf/ovmf-x86_64
|
|
@if [ ! -d "ovmf/ovmf-x86_64/OVMF.fd" ]; then \
|
|
cd ovmf/ovmf-x86_64 && curl -Lo OVMF.fd https://retrage.github.io/edk2-nightly/bin/RELEASEX64_OVMF.fd; \
|
|
fi
|
|
|
|
# In debug mode, open a terminal and run this command:
|
|
# gdb target/x86_64-unknown-none/debug/CappuccinOS.elf -ex "target remote :1234"
|
|
|
|
run: build ${RUN_OPTS} run-${ARCH}
|
|
run-serial: build ${RUN_OPTS} run-${ARCH}-serial
|
|
|
|
run-x86_64:
|
|
tmux new-session -d -s qemu 'qemu-system-x86_64 ${QEMU_OPTS}'
|
|
|
|
run-x86_64-serial:
|
|
qemu-system-x86_64 ${QEMU_OPTS} -boot d -display none -serial stdio -monitor none -no-reboot
|
|
|
|
line-count:
|
|
cloc --quiet --exclude-dir=bin --include-lang=Rust --csv src/ | tail -n 1 | awk -F, '{print $$5}'
|
|
clean:
|
|
cargo clean
|
|
rm -rf ${ARTIFACTS_PATH}
|
|
@if [ -d "limine" ]; then ${MAKE} clean -C limine; fi
|