os-workshop

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
MMakefile | 6++++--
Mmake/app.mk | 44+++++---------------------------------------
Amake/lib.mk | 23+++++++++++++++++++++++
Amake/rules.mk | 43+++++++++++++++++++++++++++++++++++++++++++
Aproject/bios.app.mk | 7+++++++
Dproject/bios.mk | 6------
Aproject/c.lib.mk | 4++++
Aproject/devicetree.app.mk | 6++++++
Dproject/devicetree.mk | 5-----
Aproject/info.app.mk | 6++++++
Dproject/info.mk | 5-----
Aproject/mandelbrot.app.mk | 6++++++
Dproject/mandelbrot.mk | 5-----
Aproject/traps.app.mk | 6++++++
Dproject/traps.mk | 5-----
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