diff --git a/examples/make/computer-engineering/Makefile b/examples/make/computer-engineering/Makefile new file mode 100644 index 0000000..0563f2b --- /dev/null +++ b/examples/make/computer-engineering/Makefile @@ -0,0 +1,18 @@ + +SHELL := /usr/bin/env bash + +SRC_DIR := ./src +INC_DIR := ./inc +OBJ_DIR := ./obj +BIN_DIR := ./bin +LIB_DIR := ../../libctboard +COMMON_DIR := ../../common + +AS_SRC := table.s + +C_DEF := PLATFORM_M0 +C_INC := +C_SRC := + +include $(COMMON_DIR)/root.mk +include $(COMMON_DIR)/pdf.mk diff --git a/examples/make/computer-engineering/pdf.mk b/examples/make/computer-engineering/pdf.mk new file mode 100644 index 0000000..aca1a69 --- /dev/null +++ b/examples/make/computer-engineering/pdf.mk @@ -0,0 +1,40 @@ +SHELL := /usr/bin/env bash + +MD_FILES += readme.md + +PDF_FILES := $(MD_FILES:.md=.pdf) + +VERBOSITY := + + +.PHONY: all clean clean_all test pdf repdf remove_pdf debug_pdf gfm + + +clean_all:: remove_pdf + + +pdf: $(PDF_FILES) + + +repdf: remove_pdf pdf + + +remove_pdf: + @rm -f $(PDF_FILES) || true + + +debug_pdf: VERBOSITY := --verbose +debug_pdf: $(PDF_FILES) + + +%.pdf: %.md + pandoc \ + --pdf-engine pdflatex \ + --listings \ + --template $(COMMON_DIR)/template.tex \ + -f markdown \ + -t pdf \ + $(VERBOSITY) \ + -o $@ \ + $< + diff --git a/examples/make/computer-engineering/root.mk b/examples/make/computer-engineering/root.mk new file mode 100644 index 0000000..46ba2c6 --- /dev/null +++ b/examples/make/computer-engineering/root.mk @@ -0,0 +1,187 @@ + +SHELL := /usr/bin/env bash + +PREFIX := arm-none-eabi- +CC := $(PREFIX)gcc +COPY := $(PREFIX)objcopy +SIZE := $(PREFIX)size +GDB := $(PREFIX)gdb + +OCD := openocd + +NAME := application + +OPT_LEVEL_CC := -g \ + -O0 + +TARGET_FLAGS := -mcpu=cortex-m4 \ + -mthumb \ + -mfpu=fpv4-sp-d16 \ + -mfloat-abi=hard + +WG := -Wall \ + -Wextra \ + -Wpedantic \ + -Werror + +WCC := -Wconversion \ + -Wsign-conversion \ + -Wsign-compare \ + -Wcast-align=strict \ + -Wfloat-equal \ + -Wlogical-op + +AS_FLAGS := $(TARGET_FLAGS) \ + $(OPT_LEVEL_CC) \ + $(VERB_LEVEL) \ + $(WG) \ + -Wa,-a,-ad,-alms=$(BIN_DIR)/$(NAME).lst \ + -x assembler-with-cpp + +C_DEF := $(addprefix -D, $(C_DEF)) +C_INC := $(addprefix -I, $(C_INC)) +C_FLAGS := $(TARGET_FLAGS) \ + $(OPT_LEVEL_CC) \ + $(VERB_LEVEL) \ + $(WG) \ + $(WCC) \ + -Wa,-a,-ad,-alms=$(BIN_DIR)/$(NAME).lst \ + $(C_DEF) \ + $(C_INC) + +FLAGS_FILE := ./compile_flags.txt + +LST_DIR := $(BIN_DIR)/list-files + +LIBCTBOARD := $(LIB_DIR)/lib/libctboard.a +LIB_PATHS += $(LIB_DIR)/lib +LIB_NAMES += ctboard + +LINKER_FLAGS := $(TARGET_FLAGS) \ + -static \ + -nostartfiles \ + $(addprefix -L, $(LIB_PATHS)) \ + -lm \ + -lnosys \ + -Wl,--start-group \ + $(addprefix -l, $(LIB_NAMES)) \ + -Wl,--end-group \ + -specs=nosys.specs \ + -specs=nano.specs \ + -Wl,-Map,$(BIN_DIR)/$(NAME).map \ + -Wl,-e,Reset_Handler \ + -Wl,--gc-sections + +LD_SCRIPT := $(LIB_DIR)/lib/linker-script.ld +GDB_INIT := $(COMMON_DIR)/.gdbinit +OCD_CONFIG := $(COMMON_DIR)/openocd.cfg + +OBJ := $(addprefix $(OBJ_DIR)/, $(AS_SRC:.s=.o)) \ + $(addprefix $(OBJ_DIR)/, $(C_SRC:.c=.o)) + +ELF := $(BIN_DIR)/$(NAME).elf +BIN := $(basename $(ELF)).bin + +MKDIR := $(OBJ_DIR) \ + $(BIN_DIR) \ + $(LST_DIR) + +VPATH := $(SRC_DIR) + + +.PHONY: all clean clean_all dbgsrv flash launchgdb rebuild test + + +all: $(LIBCTBOARD) $(MKDIR) $(BIN) $(FLAGS_FILE) + + +flash: $(MKDIR) $(BIN) + -$(OCD) -f $(OCD_CONFIG) \ + -c "program $(BIN) verify exit 0x08000000" + + +dbgsrv: flash + -$(OCD) -f $(OCD_CONFIG) \ + -c "gdb_port 4500" \ + -c "init; reset run;" + + +launchgdb: $(ELF) $(BIN) $(GDB_INIT) + $(GDB) --command=$(GDB_INIT) $< + + +$(MKDIR): + mkdir -p $@ + + +# +# The sections have to correspond with the +# sections defined in the linker script who +# are directed to be located in the flash +# memory area. +# +$(BIN): $(ELF) + $(COPY) --output-target=binary \ + -j .isr_vector \ + -j .stack \ + -j .heap \ + -j .text \ + -j .my_code \ + -j .my_const \ + -j .my_var \ + -j .rodata\ + -j .ARM.extab \ + -j .ARM \ + -j .preinit_array \ + -j .init_array \ + -j .fini_array \ + -j .data \ + -j .ccmram \ + -j .ARM.extab \ + -j .ARM \ + $< $@ + chmod -x $@ + @printf "\n" + + +$(ELF): $(OBJ) + $(CC) -o $@ $^ $(LINKER_FLAGS) -T $(LD_SCRIPT) + chmod -x $@ + + +$(OBJ_DIR)/%.o: %.s + $(CC) \ + $(AS_FLAGS) \ + -Wa,-a,-ad,-alms=$(LST_DIR)/$*.lst \ + -c $< \ + -o $@ + + +$(OBJ_DIR)/%.o: %.c + $(CC) \ + $(C_FLAGS) \ + -Wa,-a,-ad,-alms=$(LST_DIR)/$*.lst \ + -c $< \ + -o $@ + + +$(LIBCTBOARD): + echo "$(LIB_DIR)" + make -C "$(LIB_DIR)" rebuild + + +# this is to satisfy clangd (lsp client) +$(FLAGS_FILE): + @echo "$(C_FLAGS)" | sed 's/ /\n/g' > $@ + + +clean: + -rm -rf $(MKDIR) $(FLAGS_FILE) + + +clean_all:: clean + + +rebuild: clean all + +