diff options
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 49 |
1 files changed, 39 insertions, 10 deletions
@@ -18,15 +18,19 @@ endif # no `-mcpu`, no `-mtune`, no funny business. CC = $(CROSS_COMPILE)gcc$(CC_SUFFIX) +AS = $(CROSS_COMPILE)as$(CC_SUFFIX) LD = $(CROSS_COMPILE)ld QEMU ?= qemu-system-riscv64 ISA ?= rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb -CCFLAGS = -march=$(ISA) -Iinclude/ -mabi=lp64d +ASFLAGS = -march=$(ISA) -mabi=lp64d +CCFLAGS = $(ASFLAGS) -Iinclude/ CCFLAGS += -Werror -Wpedantic -Wall -Wextra -Wcast-align -Wcast-qual -Winit-self \ -Wmissing-include-dirs -Wredundant-decls -Wshadow -Wsign-conversion \ - -Wswitch-default -Wundef -Wunreachable-code -Wmissing-noreturn -LDFLAGS = -Iinclude/ -static -nostdlib -melf64lriscv -z noexecstack + -Wswitch-default -Wundef -Wunreachable-code -Wmissing-noreturn \ + -nostdinc -nostdlib -std=gnu17 +LDFLAGS = -Iinclude/ -static -melf64lriscv -z noexecstack +USRFLAGS = -static -melf64lriscv ## # Optional parameters for QEMU and gdb. @@ -42,26 +46,29 @@ GDB_EXTRA_FLAGS ?= DEBUG = ifeq ($(strip $(DEBUG)),) CCFLAGS += -O3 + QEMU_FLAGS += -nographic else CCFLAGS += -g QEMU_FLAGS += -s -S endif ## -# Paths. +# Paths SRC = $(wildcard kernel/head.S kernel/*.c) OBJ = $(patsubst %.c,%.o,$(patsubst %.S,%.o,$(SRC))) LINKER = kernel/fbos.ld KRNL = fbos +USR = usr/bin/foo +INIT = usr/initramfs.cpio LDFLAGS += -T $(LINKER) ## -# Targets +# Kernel .PHONY: all -all: clean $(KRNL) +all: clean $(KRNL) usr .PHONY: $(KRNL) $(KRNL): $(OBJ) $(LINKER).S @@ -78,12 +85,34 @@ $(KRNL): $(OBJ) $(LINKER).S $(E) " CC " $(*F) $(Q) $(CC) $(CCFLAGS) -c $< -o $@ +## +# User space + +.PHONY: usr +usr: $(USR) + $(E) " CPIO " $(INIT) + $(Q) find usr/bin/ -type f -executable | cpio -o --quiet -H newc > $(INIT) + +usr/src/%.o: usr/src/%.S + $(E) " AS " $(basename $@) + $(Q) $(AS) $(ASFLAGS) -c $< -o $@ + +usr/bin/%: usr/src/%.o + $(E) " LD " $@ + $(Q) $(LD) $(USRFLAGS) $< -o $@ + +# HACK: do not remove object files from usr/src/. +.SECONDARY: + +## +# Hacking + .PHONY: qemu -qemu: $(KRNL) +qemu: $(KRNL) usr ifeq ($(strip $(QEMU_BIOS)),) - $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -kernel $(KRNL) -nographic + $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -kernel $(KRNL) -initrd $(INIT) else - $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -bios $(QEMU_BIOS) -kernel $(KRNL) -nographic + $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -bios $(QEMU_BIOS) -kernel $(KRNL) -initrd $(INIT) endif .PHONY: gdb @@ -92,7 +121,7 @@ gdb: .PHONY: clean clean: - $(Q) rm -f $(OBJ) $(KRNL) $(LINKER) + $(Q) rm -f $(OBJ) $(KRNL) $(LINKER) $(USR) usr/src/*.o $(INIT) .PHONY: lint lint: |
