REPO_DIR ?= $(abspath ../../..) include $(REPO_DIR)/tools/project.mk CC := $(CROSS)gcc OBJCOPY := $(CROSS)objcopy OBJDUMP := $(CROSS)objdump SIZE := $(CROSS)size BUILD_DIR ?= build COMMON_DIR ?= ../common BSP_DIR ?= ../bsp LINKER_SCRIPT ?= $(COMMON_DIR)/linker_ram.ld MARCH ?= rv64imafdc_zicsr_zifencei MABI ?= lp64d BSP_UART_CLOCK_HZ ?= 100000000 BSP_UART_BAUDRATE ?= 460800 BSP_CLINT_TIMEBASE_HZ ?= 1000000 BSP_DTIM_BASE ?= 0x80000000 BSP_DTIM_SIZE ?= 0x00100000 CONFIG_STAMP := $(BUILD_DIR)/build_config.txt # C sees BSP_DTIM_* while ld sees __dtim_*; both come from the same Makefile knobs. CFLAGS ?= -march=$(MARCH) -mabi=$(MABI) -mcmodel=medany -Os -ffreestanding -fno-builtin -fno-common -Wall -Wextra -I$(BSP_DIR)/include -DBSP_UART_CLOCK_HZ=$(BSP_UART_CLOCK_HZ)UL -DBSP_UART_BAUDRATE=$(BSP_UART_BAUDRATE)UL -DBSP_CLINT_TIMEBASE_HZ=$(BSP_CLINT_TIMEBASE_HZ)UL -DBSP_DTIM_BASE=$(BSP_DTIM_BASE)UL -DBSP_DTIM_SIZE=$(BSP_DTIM_SIZE)UL LDFLAGS ?= -T $(LINKER_SCRIPT) -nostartfiles -static -Wl,--gc-sections -Wl,--defsym=__dtim_base=$(BSP_DTIM_BASE) -Wl,--defsym=__dtim_size=$(BSP_DTIM_SIZE) -Wl,-Map,$(BUILD_DIR)/$(TARGET).map LDLIBS ?= -Wl,--start-group -lc -lgcc -Wl,--end-group APP_SRCS ?= main.c BSP_SRCS ?= init.c uart.c plic.c irq.c spi_flash.c APP_OBJS := $(addprefix $(BUILD_DIR)/,$(APP_SRCS:=.o)) COMMON_OBJS := $(BUILD_DIR)/common_start.S.o $(BUILD_DIR)/common_syscalls.c.o BSP_OBJS := $(addprefix $(BUILD_DIR)/bsp_,$(BSP_SRCS:=.o)) OBJS := $(COMMON_OBJS) $(BSP_OBJS) $(APP_OBJS) DEPS := $(OBJS:.o=.d) DEPFLAGS := -MMD -MP .PHONY: all clean FORCE all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).img $(BUILD_DIR)/$(TARGET).dump $(SIZE) $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR): mkdir -p $@ $(CONFIG_STAMP): FORCE | $(BUILD_DIR) @tmp="$@.tmp.$$$$"; \ printf '%s\n' \ 'MARCH=$(MARCH)' \ 'MABI=$(MABI)' \ 'BSP_UART_CLOCK_HZ=$(BSP_UART_CLOCK_HZ)' \ 'BSP_UART_BAUDRATE=$(BSP_UART_BAUDRATE)' \ 'BSP_CLINT_TIMEBASE_HZ=$(BSP_CLINT_TIMEBASE_HZ)' \ 'BSP_DTIM_BASE=$(BSP_DTIM_BASE)' \ 'BSP_DTIM_SIZE=$(BSP_DTIM_SIZE)' \ 'GPS_DEBUG=$(GPS_DEBUG)' \ 'GPS_DEBUG_LEVEL=$(GPS_DEBUG_LEVEL)' \ 'CFLAGS=$(CFLAGS)' \ 'LDFLAGS=$(LDFLAGS)' \ 'LDLIBS=$(LDLIBS)' > "$$tmp"; \ if ! cmp -s "$$tmp" "$@"; then mv "$$tmp" "$@"; else rm "$$tmp"; fi FORCE: $(BUILD_DIR)/common_start.S.o: $(COMMON_DIR)/start.S $(CONFIG_STAMP) | $(BUILD_DIR) mkdir -p $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD_DIR)/common_syscalls.c.o: $(COMMON_DIR)/syscalls.c $(CONFIG_STAMP) | $(BUILD_DIR) mkdir -p $(dir $@) $(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@ $(BUILD_DIR)/bsp_%.c.o: $(BSP_DIR)/drivers/%.c $(CONFIG_STAMP) | $(BUILD_DIR) mkdir -p $(dir $@) $(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@ $(BUILD_DIR)/%.c.o: %.c $(CONFIG_STAMP) | $(BUILD_DIR) mkdir -p $(dir $@) $(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@ $(BUILD_DIR)/%.S.o: %.S $(CONFIG_STAMP) | $(BUILD_DIR) mkdir -p $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD_DIR)/$(TARGET).elf: $(OBJS) $(LINKER_SCRIPT) $(CONFIG_STAMP) $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS) -o $@ $(BUILD_DIR)/$(TARGET).img: $(BUILD_DIR)/$(TARGET).elf $(OBJCOPY) -O binary $< $@ $(BUILD_DIR)/$(TARGET).dump: $(BUILD_DIR)/$(TARGET).elf $(OBJDUMP) -d -S $< > $@ # Header-only firmware changes must invalidate their objects. Without these # generated dependencies, `debug-load` could silently reload an older ELF even # though a configuration header had changed. -include $(DEPS) clean: rm -rf $(BUILD_DIR)