Makefile: start moving to macro based Makefile target generation

- libam-riscv32-nemu is working.
- libam on platforms other than riscv32-nemu has not been worked on yet.
- klib has not been worked on yet.
This commit is contained in:
xinyangli 2024-12-10 17:45:52 +08:00
parent 1e69b23756
commit 54ee5d6c31
Signed by: xin
SSH key fingerprint: SHA256:UU5pRTl7NiLFJbWJZa+snLylZSXIz5rgHmwjzv8v4oE
5 changed files with 93 additions and 92 deletions

47
scripts/helpers/rules.mk Normal file
View file

@ -0,0 +1,47 @@
# Usage:
# $(1): Target prefix
#
# Generate build rules for files in variable <PREFIX>_SRCS. Use <PREFIX>_CFLAGS,
# <PREFIX>_CXXFLAGS, <PREFIX>_ASFLAGS to control build flags.
# E.g:
# $(eval $(call COMPILE_RULES,AM_))
define COMPILE_RULES
AM_OBJS := $(addprefix $(DST_DIR)/, $(addsuffix .o, $(AM_SRCS)))
### Rule (compile): a single `.c` -> `.c.o` (gcc)
$$(filter %.c.o, $$($(1)OBJS)): $$(DST_DIR)/%.c.o: %.c
@mkdir -p $$(dir $$@) && echo + CC $$<
@$$(CC) $$($(1)CFLAGS) -c -o $$@ $$(realpath $$<)
### Rule (compile): a single `.cc` -> `.cc.o` (g++)
$$(filter %.cc.o, $$($(1)OBJS)): $$(DST_DIR)/%.cc.o: %.cc
@mkdir -p $$(dir $$@) && echo + CXX $$<
@$$(CXX) $$($(1)CXXFLAGS) -c -o $$@ $$(realpath $$<)
### Rule (compile): a single `.cpp` -> `.cpp.o` (g++)
$$(filter %.cpp.o, $$($(1)OBJS)): $$(DST_DIR)/%.cpp.o: %.cpp
@mkdir -p $$(dir $$@) && echo + CXX $$<
@$$(CXX) $$($(1)CXXFLAGS) -c -o $$@ $$(realpath $$<)
### Rule (compile): a single `.S` -> `.S.o` (gcc, which preprocesses and calls as)
$$(filter %.S.o, $$($(1)OBJS)): $$(DST_DIR)/%.S.o: %.S
@mkdir -p $$(dir $$@) && echo + AS $$<
@$$(AS) $$($(1)ASFLAGS) -c -o $$@ $$(realpath $$<)
### Rule (`#include` dependencies): paste in `.d` files generated by gcc on `-MMD`
-include $$(addprefix $$(DST_DIR)/, $$(addsuffix .d, $$(filter %.c %.cc, $$(AM_SRCS))))
endef
# Usage:
# $(1): Library name
# $(2): Library variable prefix
# E.g:
# $(eval $(call ADD_LIBRARY,am-riscv,AM_))
define ADD_LIBRARY
$(eval $(call COMPILE_RULES,$(2)))
$(1): $$($(2)OBJS)
@mkdir -p $$(dir $$@)
@echo + AR "->" $$(patsubst $$(CURDIR)/%,%,$(1))
@$$(AR) rcs $$@ $$($(2)OBJS)
endef

View file

@ -1,8 +1,7 @@
CROSS_COMPILE := riscv64-linux-gnu-
COMMON_CFLAGS := -fno-pic -march=rv64g -mcmodel=medany -mstrict-align
CFLAGS += $(COMMON_CFLAGS) -static
ASFLAGS += $(COMMON_CFLAGS) -O0
LDFLAGS += -melf64lriscv -O2
AM_CFLAGS += -static -fno-pic -march=rv64g -mcmodel=medany -mstrict-align
AM_ASFLAGS += -static -fno-pic -march=rv32g_zicsr -mcmodel=medany -O0
AM_LDFLAGS += -melf64lriscv -O2
# overwrite ARCH_H defined in $(AM_HOME)/Makefile
ARCH_H := arch/riscv.h

View file

@ -1,21 +1,19 @@
AM_SRCS := platform/nemu/trm.c \
platform/nemu/ioe/ioe.c \
platform/nemu/ioe/timer.c \
platform/nemu/ioe/input.c \
platform/nemu/ioe/gpu.c \
platform/nemu/ioe/audio.c \
platform/nemu/ioe/disk.c \
platform/nemu/mpe.c
AM_SRCS := am/src/platform/nemu/trm.c \
am/src/platform/nemu/ioe/ioe.c \
am/src/platform/nemu/ioe/timer.c \
am/src/platform/nemu/ioe/input.c \
am/src/platform/nemu/ioe/gpu.c \
am/src/platform/nemu/ioe/audio.c \
am/src/platform/nemu/ioe/disk.c \
am/src/platform/nemu/mpe.c
CFLAGS += -fdata-sections -ffunction-sections
LDFLAGS += -T $(AM_HOME)/scripts/linker.ld \
AM_CFLAGS += -fdata-sections -ffunction-sections
AM_LDFLAGS += -T $(AM_HOME)/scripts/linker.ld \
--defsym=_pmem_start=0x80000000 --defsym=_entry_offset=0x0
LDFLAGS += --gc-sections -e _start
NEMUFLAGS += -b
#-l $(shell dirname $(IMAGE).elf)/nemu-log.txt
AM_LDFLAGS += --gc-sections -e _start
CFLAGS += -DMAINARGS=\"$(mainargs)\"
CFLAGS += -I$(AM_HOME)/am/src/platform/nemu/include
AM_CFLAGS += -DMAINARGS=\"$(mainargs)\"
AM_INCPATH += $(AM_HOME)/am/src/platform/nemu/include
.PHONY: $(AM_HOME)/am/src/platform/nemu/trm.c
image: $(IMAGE).elf
@ -23,6 +21,9 @@ image: $(IMAGE).elf
@echo + OBJCOPY "->" $(IMAGE_REL).bin
@$(OBJCOPY) -S --set-section-flags .bss=alloc,contents -O binary $(IMAGE).elf $(IMAGE).bin
NEMUFLAGS += -b
#-l $(shell dirname $(IMAGE).elf)/nemu-log.txt
run: image
$(MAKE) -C $(NEMU_HOME) ISA=$(ISA) run ARGS="$(NEMUFLAGS)" IMG=$(IMAGE).bin

View file

@ -1,10 +1,9 @@
include $(AM_HOME)/scripts/isa/riscv.mk
include $(AM_HOME)/scripts/platform/nemu.mk
CFLAGS += -DISA_H=\"riscv/riscv.h\"
COMMON_CFLAGS += -march=rv32im_zicsr -mabi=ilp32 # overwrite
LDFLAGS += -melf32lriscv # overwrite
AM_CFLAGS += -DISA_H=\"riscv/riscv.h\" -march=rv32im_zicsr -mabi=ilp32 # overwrite
AM_LDFLAGS += -melf32lriscv # overwrite
AM_SRCS += riscv/nemu/start.S \
riscv/nemu/cte.c \
riscv/nemu/trap.S \
riscv/nemu/vme.c
AM_SRCS += am/src/riscv/nemu/start.S \
am/src/riscv/nemu/cte.c \
am/src/riscv/nemu/trap.S \
am/src/riscv/nemu/vme.c