aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile49
1 files changed, 39 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index df82342..6799281 100644
--- a/Makefile
+++ b/Makefile
@@ -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: