109 lines
2.7 KiB
Makefile
109 lines
2.7 KiB
Makefile
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
|