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