commit 069c8e72faf2338ad8487d2b67889397805ee05e
parent cb6e92262b43b3a82752785ab5e3de0dd8772ec6
Author: Brian Swetland <swetland@frotz.net>
Date: Thu, 5 May 2022 10:58:24 -0700
build: build system overhaul
- fix build.opts whitespace issues
- add support for building libraries
- app support for depending on libraries
- add libc
- adjust projects to use libc
Diffstat:
15 files changed, 110 insertions(+), 67 deletions(-)
diff --git a/Makefile b/Makefile
@@ -28,6 +28,7 @@ endif
XGCC := $(XTOOLCHAIN)gcc
XOBJDUMP := $(XTOOLCHAIN)objdump
XOBJCOPY := $(XTOOLCHAIN)objcopy
+XAR := $(XTOOLCHAIN)ar
ARCHFLAGS := -march=rv32im -mabi=ilp32 -mcmodel=medany
ARCHFLAGS += -static -nostdlib -nostartfiles -ffreestanding
@@ -39,13 +40,14 @@ LDSCRIPT := hw/simple.ld
BUILD := out
CFLAGS := -g -Wall -Ilibc/inc -Ihw/inc
-CFLAGS += -O2
+CFLAGS += -O1
ALL :=
LIBC_SRC := libc/src/printf.c $(wildcard libc/src/string/*.c)
-include $(wildcard project/*.mk)
+include $(wildcard project/*.lib.mk)
+include $(wildcard project/*.app.mk)
build-all: $(ALL)
diff --git a/make/app.mk b/make/app.mk
@@ -9,34 +9,14 @@ MOD_LDSCRIPT := $(if $(MOD_LDSCRIPT),$(MOD_LDSCRIPT),$(LDSCRIPT))
ALL += $(MOD_ELF) $(MOD_LST) $(MOD_BIN)
-# Generate objects from sources.
-MOD_OBJ := $(patsubst %.c,$(MOD_DIR)/%.o,$(MOD_SRC))
-MOD_OBJ := $(patsubst %.S,$(MOD_DIR)/%.o,$(MOD_OBJ))
+include make/rules.mk
-# Assemble compile and link flags.
-MOD_CFLAGS := $(ARCHFLAGS) $(CFLAGS) $(patsubst %,-I%,$(MOD_INC))
-MOD_LDFLAGS := $(ARCHFLAGS) -Wl,--gc-sections
-
-$(shell mkdir -p $(MOD_DIR))
-
-OPTS.A := $(MOD_CFLAGS) $(MOD_LDFLAGS)
-OPTS.B := $(file <$(MOD_DIR)/build.opts)
-
-ifneq ($(OPTS.A),$(OPTS.B))
-$(info generating $(MOD_DIR)/build.opts)
-$(file >$(MOD_DIR)/build.opts,$(OPTS.A))
-endif
-
-# Track flags in a build.opts file so we can depend on it.
-# Write the file only if it does not already contain the
-# same options as currently defined.
-$(MOD_OBJ): $(MOD_DIR)/build.opts
-$(MOD_ELF): $(MOD_DIR)/build.opts
+$(MOD_ELF): $(MOD_DIR)/build.opts $(patsubst %,$(BUILD)/lib%.a,$(MOD_LIB))
$(MOD_ELF): _OBJ := $(MOD_OBJ)
$(MOD_ELF): _LDFLAGS := $(MOD_LDFLAGS) -T $(MOD_LDSCRIPT)
-$(MOD_LIB): _LIB := -lgcc
-$(MOD_ELF): $(MOD_OBJ) $(MOD_LDSCRIPT) $(MOD_DIR)/build.opts
+$(MOD_ELF): _LIB := -L$(BUILD) $(patsubst %,-l%,$(MOD_LIB)) -lgcc
+$(MOD_ELF): $(MOD_OBJ) $(MOD_LDSCRIPT)
@$(info linking $@)
$(V)$(XGCC) $(_LDFLAGS) -o $@ $(_OBJ) $(_LIB)
@@ -46,21 +26,6 @@ $(MOD_LST): $(MOD_ELF)
$(MOD_BIN): $(MOD_ELF)
$(V)$(XOBJCOPY) -O binary $< $@
-$(MOD_DIR)/%.o: _CFLAGS := $(MOD_CFLAGS)
-
-$(MOD_DIR)/%.o: %.c
- @mkdir -p $(dir $@)
- @$(info compiling $<)
- $(V)$(XGCC) -c -o $@ $< $(_CFLAGS) -MD -MP -MT $@ -MF $(@:%o=%d)
-
-$(MOD_DIR)/%.o: %.S
- @mkdir -p $(dir $@)
- @$(info compiling $<)
- $(V)$(XGCC) -c -o $@ $< $(_CFLAGS) -D__ASSEMBLY__ -MD -MP -MT $@ -MF $(@:%o=%d)
-
-# include compiler auto-deps
--include $(patsubst %.o,%.d,$(MOD_OBJ))
-
run.$(MOD_NAME):: $(QEMUBIOS)
run.$(MOD_NAME):: _BIN := $(MOD_ELF)
run.$(MOD_NAME):: $(MOD_ELF) $(MOD_LST)
@@ -74,4 +39,5 @@ debug.$(MOD_NAME):: $(MOD_ELF) $(MOD_LST)
MOD_NAME :=
MOD_INC :=
MOD_SRC :=
+MOD_LIB :=
MOD_LDSCRIPT :=
diff --git a/make/lib.mk b/make/lib.mk
@@ -0,0 +1,23 @@
+## Copyright 2022, Brian Swetland <swetland@frotz.net>
+## Licensed under the Apache License, Version 2.0
+
+MOD_DIR := $(BUILD)/lib$(MOD_NAME)
+MOD_LIB := $(BUILD)/lib$(MOD_NAME).a
+
+ALL += $(MOD_LIB)
+
+include make/rules.mk
+
+$(MOD_LIB): $(MOD_DIR)/build.opts
+
+$(MOD_LIB): _OBJ := $(MOD_OBJ)
+$(MOD_LIB): $(MOD_OBJ) $(MOD_DIR)/build.opts
+ @$(info linking $@)
+ @rm -f $@
+ $(V)$(XAR) -crs $@ -o $@ $(_OBJ)
+
+MOD_NAME :=
+MOD_INC :=
+MOD_SRC :=
+MOD_LIB :=
+MOD_LDSCRIPT :=
diff --git a/make/rules.mk b/make/rules.mk
@@ -0,0 +1,43 @@
+## Copyright 2022, Brian Swetland <swetland@frotz.net>
+## Licensed under the Apache License, Version 2.0
+
+# Todo: check for missing inputs, duplicate module names, etc
+
+# Assemble compile and link flags.
+MOD_CFLAGS := $(ARCHFLAGS) $(CFLAGS) $(patsubst %,-I%,$(MOD_INC))
+MOD_LDFLAGS := $(ARCHFLAGS) -Wl,--gc-sections
+
+# Generate objects from sources.
+MOD_OBJ := $(patsubst %.c,$(MOD_DIR)/%.o,$(MOD_SRC))
+MOD_OBJ := $(patsubst %.S,$(MOD_DIR)/%.o,$(MOD_OBJ))
+
+# Track flags in a build.opts file so we can depend on it.
+# Write the file only if it does not already contain the
+# same options as currently defined.
+$(shell mkdir -p $(MOD_DIR))
+
+OPTS.A := $(strip $(MOD_CFLAGS) $(MOD_LDFLAGS))
+OPTS.B := $(strip $(file <$(MOD_DIR)/build.opts))
+
+ifneq ($(OPTS.A),$(OPTS.B))
+$(info generating $(MOD_DIR)/build.opts)
+$(file >$(MOD_DIR)/build.opts,$(OPTS.A))
+endif
+
+$(MOD_DIR)/%.o: _CFLAGS := $(MOD_CFLAGS)
+
+$(MOD_DIR)/%.o: %.c
+ @mkdir -p $(dir $@)
+ @$(info compiling $<)
+ $(V)$(XGCC) -c -o $@ $< $(_CFLAGS) -MD -MP -MT $@ -MF $(@:%o=%d)
+
+$(MOD_DIR)/%.o: %.S
+ @mkdir -p $(dir $@)
+ @$(info compiling $<)
+ $(V)$(XGCC) -c -o $@ $< $(_CFLAGS) -D__ASSEMBLY__ -MD -MP -MT $@ -MF $(@:%o=%d)
+
+# include compiler auto-deps
+-include $(patsubst %.o,%.d,$(MOD_OBJ))
+
+$(MOD_OBJ): $(MOD_DIR)/build.opts
+
diff --git a/project/bios.app.mk b/project/bios.app.mk
@@ -0,0 +1,7 @@
+
+MOD_NAME := bios
+MOD_SRC := hw/src/start.S bios/entry.S bios/bios.c
+MOD_SRC += hw/src/debug.c
+MOD_LIB := c
+MOD_LDSCRIPT := hw/bios.ld
+include make/app.mk
diff --git a/project/bios.mk b/project/bios.mk
@@ -1,6 +0,0 @@
-
-MOD_NAME := bios
-MOD_SRC := hw/src/start.S bios/entry.S bios/bios.c
-MOD_SRC += hw/src/debug.c $(LIBC_SRC)
-MOD_LDSCRIPT := hw/bios.ld
-include make/app.mk
diff --git a/project/c.lib.mk b/project/c.lib.mk
@@ -0,0 +1,4 @@
+
+MOD_NAME := c
+MOD_SRC := libc/src/printf.c $(wildcard libc/src/string/*.c)
+include make/lib.mk
diff --git a/project/devicetree.app.mk b/project/devicetree.app.mk
@@ -0,0 +1,6 @@
+
+MOD_NAME := devicetree
+MOD_SRC := hw/src/start.S misc/devicetree.c
+MOD_SRC += hw/src/debug.c
+MOD_LIB := c
+include make/app.mk
diff --git a/project/devicetree.mk b/project/devicetree.mk
@@ -1,5 +0,0 @@
-
-MOD_NAME := devicetree
-MOD_SRC := hw/src/start.S misc/devicetree.c
-MOD_SRC += hw/src/debug.c $(LIBC_SRC)
-include make/app.mk
diff --git a/project/info.app.mk b/project/info.app.mk
@@ -0,0 +1,6 @@
+
+MOD_NAME := info
+MOD_SRC := hw/src/start.S misc/info.c
+MOD_SRC += hw/src/debug.c
+MOD_LIB := c
+include make/app.mk
diff --git a/project/info.mk b/project/info.mk
@@ -1,5 +0,0 @@
-
-MOD_NAME := info
-MOD_SRC := hw/src/start.S misc/info.c
-MOD_SRC += hw/src/debug.c $(LIBC_SRC)
-include make/app.mk
diff --git a/project/mandelbrot.app.mk b/project/mandelbrot.app.mk
@@ -0,0 +1,6 @@
+
+MOD_NAME := mandelbrot
+MOD_SRC := hw/src/start.S misc/mandelbrot.c
+MOD_SRC += hw/src/debug.c
+MOD_LIB := c
+include make/app.mk
diff --git a/project/mandelbrot.mk b/project/mandelbrot.mk
@@ -1,5 +0,0 @@
-
-MOD_NAME := mandelbrot
-MOD_SRC := hw/src/start.S misc/mandelbrot.c
-MOD_SRC += hw/src/debug.c $(LIBC_SRC)
-include make/app.mk
diff --git a/project/traps.app.mk b/project/traps.app.mk
@@ -0,0 +1,6 @@
+
+MOD_NAME := traps
+MOD_SRC := hw/src/start.S misc/traps-entry.S misc/traps.c
+MOD_SRC += hw/src/debug.c
+MOD_LIB := c
+include make/app.mk
diff --git a/project/traps.mk b/project/traps.mk
@@ -1,5 +0,0 @@
-
-MOD_NAME := traps
-MOD_SRC := hw/src/start.S misc/traps-entry.S misc/traps.c
-MOD_SRC += hw/src/debug.c $(LIBC_SRC)
-include make/app.mk