This repository has been archived on 2026-09-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

134 lines
5.5 KiB
Makefile

# ──────────────────────────────────────────────────────────────
# Makefile — opencoreRS build system
# ──────────────────────────────────────────────────────────────
ARCH := x86_64
TARGET := x86_64-unknown-none
PROFILE := debug
KERNEL_ELF := target/$(TARGET)/$(PROFILE)/kernel
INIT_ELF := target/$(TARGET)/$(PROFILE)/init
VFS_ELF := target/$(TARGET)/$(PROFILE)/vfs
SH_ELF := target/$(TARGET)/$(PROFILE)/sh
QEMU := qemu-system-x86_64
QEMU_FLAGS := \
-machine q35,i8042=on \
-m 256M \
-smp 2 \
-netdev user,id=net0 \
-device e1000,netdev=net0 \
-device ahci,id=ahci0 \
-serial mon:stdio \
-display none \
-no-reboot \
-no-shutdown
# Limine bootloader paths
LIMINE_DIR := limine
LIMINE_BIN := $(LIMINE_DIR)/limine
HDD_IMAGE := opencoreRS.hdd
ISO_DIR := iso_root
ISO_IMAGE := opencoreRS.iso
.PHONY: all kernel init-server vfs-server sh-server check check-all clean run hdd iso limine-install help
## Сборка ядра и userspace серверов
all: hdd
kernel:
@echo " BUILD kernel ($(PROFILE))"
cargo rustc -p kernel --target $(TARGET) \
$(if $(filter release,$(PROFILE)),--release,) \
-- -C link-arg=-Tkernel/linker.ld -C code-model=kernel -C relocation-model=static
init-server:
@echo " BUILD init server ($(PROFILE))"
cargo rustc -p init --target $(TARGET) \
$(if $(filter release,$(PROFILE)),--release,) \
-- -C link-arg=-Tservers/init/user.ld -C code-model=small -C relocation-model=static
vfs-server:
@echo " BUILD vfs server ($(PROFILE))"
cargo rustc -p vfs --target $(TARGET) \
$(if $(filter release,$(PROFILE)),--release,) \
-- -C link-arg=-Tservers/vfs/user.ld -C code-model=small -C relocation-model=static
sh-server:
@echo " BUILD sh server ($(PROFILE))"
cargo rustc -p sh --target $(TARGET) \
$(if $(filter release,$(PROFILE)),--release,) \
-- -C link-arg=-Tservers/sh/user.ld -C code-model=small -C relocation-model=static
## Проверка без сборки бинарника
check:
@echo " CHECK kernel"
cargo check -p kernel --target $(TARGET)
## Проверка всего workspace (серверы, libs)
check-all:
@echo " CHECK workspace (servers / libs)"
cargo check --target $(TARGET) \
-p syscall-abi -p ipc-client -p init -p vfs -p sh
## Клонирование / сборка Limine
limine-install:
@if [ ! -d "$(LIMINE_DIR)" ]; then \
git clone https://github.com/limine-bootloader/limine.git \
--branch=v8.x-binary --depth=1 $(LIMINE_DIR); \
fi
$(MAKE) -C $(LIMINE_DIR)
## Создание bootable HDD образа (MBR + FAT32 + Limine)
hdd: kernel init-server vfs-server sh-server limine-install
@echo " IMAGE $(HDD_IMAGE)"
@rm -f $(HDD_IMAGE)
dd if=/dev/zero of=$(HDD_IMAGE) bs=1M count=64 status=none
parted -s $(HDD_IMAGE) mklabel msdos
parted -s $(HDD_IMAGE) mkpart primary fat32 2048s 100%
parted -s $(HDD_IMAGE) set 1 boot on
mformat -i $(HDD_IMAGE)@@1M -F
mmd -i $(HDD_IMAGE)@@1M ::/boot ::/boot/limine ::/limine ::/EFI ::/EFI/BOOT
mcopy -i $(HDD_IMAGE)@@1M $(KERNEL_ELF) ::/boot/kernel.elf
mcopy -i $(HDD_IMAGE)@@1M $(INIT_ELF) ::/boot/init.elf
mcopy -i $(HDD_IMAGE)@@1M $(VFS_ELF) ::/boot/vfs.elf
mcopy -i $(HDD_IMAGE)@@1M $(SH_ELF) ::/boot/sh.elf
mcopy -i $(HDD_IMAGE)@@1M config/limine.conf ::/boot/limine/limine.conf
mcopy -i $(HDD_IMAGE)@@1M config/limine.conf ::/limine.conf
mcopy -i $(HDD_IMAGE)@@1M config/limine.cfg ::/boot/limine/limine.cfg
mcopy -i $(HDD_IMAGE)@@1M config/limine.cfg ::/limine.cfg
mcopy -i $(HDD_IMAGE)@@1M $(LIMINE_DIR)/limine-bios.sys ::/boot/limine/limine-bios.sys
mcopy -i $(HDD_IMAGE)@@1M $(LIMINE_DIR)/limine-bios.sys ::/limine-bios.sys
mcopy -i $(HDD_IMAGE)@@1M $(LIMINE_DIR)/BOOTX64.EFI ::/EFI/BOOT/BOOTX64.EFI
$(LIMINE_BIN) bios-install $(HDD_IMAGE)
## Запуск в QEMU (интерактивная консоль прямо в терминале)
run: hdd
@echo " QEMU $(HDD_IMAGE) (Выход: Ctrl+A затем X)"
$(QEMU) -machine pc -m 256M -smp 2 -netdev user,id=net0 -device e1000,netdev=net0 -device ahci,id=ahci0 -drive file=$(HDD_IMAGE),format=raw -serial mon:stdio -display none -no-reboot -no-shutdown
## Запуск в QEMU с графическим дисплеем (GUI + Framebuffer)
run-gui: hdd
@echo " QEMU GUI $(HDD_IMAGE) (Кликните в окно или Ctrl+Alt+G для захвата клавиатуры)"
$(QEMU) -machine pc -m 256M -smp 2 -netdev user,id=net0 -device e1000,netdev=net0 -device ahci,id=ahci0 -drive file=$(HDD_IMAGE),format=raw -serial mon:stdio -k en-us
## Запуск в Bochs эмуляторе
run-bochs: hdd
@echo " BOCHS $(HDD_IMAGE)"
@rm -f $(HDD_IMAGE).lock
bochs -q -unlock -f bochsrc.txt
clean:
cargo clean
rm -rf $(ISO_DIR) $(ISO_IMAGE) $(HDD_IMAGE)
help:
@echo "opencoreRS build targets:"
@echo " make hdd — собрать bootable HDD образ"
@echo " make run — запустить в QEMU"
@echo " make kernel — собрать ELF ядра"
@echo " make init-server — собрать ELF init сервера"
@echo " make vfs-server — собрать ELF vfs сервера"
@echo " make sh-server — собрать ELF userspace shell"
@echo " make check — cargo check ядра"
@echo " make clean — очистить артефакты"