MAKE := make ARCH := aarch64 GNU := $(ARCH)-linux-gnu GDB := $(GNU)-gdb QEMU := qemu-system-$(ARCH) QEMUFLAGS += -M raspi3b -display none -serial null -serial pty CC := $(GNU)-gcc CCFLAGS += -Wall -Wextra -O0 \ -nostdinc -nostdlib -nostartfiles -nodefaultlibs \ -Wno-unused-parameter -Wno-unused-value -Wno-main -g LD := $(GNU)-ld LDFLAGS += -g -nostdlib -no-pie OBJCOPY := $(GNU)-objcopy #TARGET := kernel8 #TARGET_DIR := ./kernel ELF := $(TARGET).elf IMG := $(TARGET).img LD_SCRIPT := $(TARGET_DIR)/linker.ld INCLUDE += -Iinclude LIB_DIR := ./lib MISC_DIR := ./misc QEMUFLAGS += -dtb $(MISC_DIR)/bcm2710-rpi-3-b-plus.dtb BOOTLOADER_DIR := ./bootloader ROOTFS_DIR := ./rootfs CPIO := initramfs.cpio QEMUFLAGS += -initrd $(CPIO) SRCS := $(shell find $(TARGET_DIR) -name '*.[cS]') \ $(shell find $(LIB_DIR) -name '*.c') OBJS := $(SRCS:%=%.o) .PHONY: all build clean clean_target run kernel debug gdb all: $(MAKE) build TARGET_DIR=./kernel TARGET=kernel8 $(MAKE) build TARGET_DIR=./bootloader TARGET=bootloader build: $(IMG) $(CPIO): $(shell find $(ROOTFS_DIR)) cd $(ROOTFS_DIR) && find . | cpio -o -H newc > ../$@ $(IMG): $(ELF) $(OBJCOPY) -O binary $< $@ $(ELF): $(LD_SCRIPT) $(OBJS) $(LD) -o $@ -T $^ $(LDFLAGS) %.S.o: %.S mkdir -p $(dir $@) $(CC) -c $< -o $@ $(INCLUDE) $(CCFLAGS) %.c.o: %.c mkdir -p $(dir $@) $(CC) -c $< -o $@ $(INCLUDE) $(CCFLAGS) clean: $(MAKE) clean_target TARGET_DIR=./kernel TARGET=kernel8 $(MAKE) clean_target TARGET_DIR=./bootloader TARGET=bootloader clean_target: -rm $(OBJS) $(ELF) $(IMG) $(CPIO) run: all $(CPIO) $(QEMU) -kernel bootloader.img $(QEMUFLAGS) kernel: all $(CPIO) -killall screen $(QEMU) -kernel kernel8.img $(QEMUFLAGS) debug: all $(CPIO) -killall screen $(QEMU) -kernel kernel8.img $(QEMUFLAGS) -S -s gdb: $(GDB)