2026-09-11 12:57:14 +03:00

105 lines
2.6 KiB
Makefile

.DEFAULT_GOAL := all
.PHONY: all asms binary clean size test prog_flash prog_test format compiledb
TARGET=firmware
PLATFORM?=ch32
BUILD_CONFIGS_MK=$(basename $(notdir $(shell find ./build_config -name "*.mk")))
# === Directories path =============================================================================
SRC_DIR=./src
OBJ_DIR=./obj/$(PLATFORM)
ASM_DIR=./asm/$(PLATFORM)
OUT_DIR=./build/$(PLATFORM)
# ==================================================================================================
# === Compiler options =============================================================================
CC_FLAGS=-Wall -Wextra
ifeq ($(DEBUG), true)
CC_FLAGS+=-ggdb -Og
CC_FLAGS+=-Wl,-Map=$(OUT_DIR)/$(TARGET).map
CC_FLAGS+=-DDEBUG_BUILD=TRUE
else
CC_FLAGS+=-Os
CC_FLAGS+=-flto
endif
CC_FLAGS+=-std=gnu11
CC_FLAGS+=-MMD -MP
CC_FLAGS+=-I$(SRC_DIR)
CC_FLAGS+=-Wno-unused-parameter
CC_FLAGS+=-ffunction-sections
CC_FLAGS+=-fdata-sections
# ==================================================================================================
# === Linker options ===============================================================================
LD_FLAGS+=--specs=nano.specs # Use optimized standard C library
LD_FLAGS+=-nostartfiles
LD_FLAGS+=-Wl,--relax
LD_FLAGS+=-Wl,--gc-sections
# ==================================================================================================
PROJ_SRCS=$(shell find $(SRC_DIR) -name "*.c")
OBJS=$(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(PROJ_SRCS))
ASMS=$(patsubst $(SRC_DIR)/%.c,$(ASM_DIR)/%.S,$(PROJ_SRCS))
ifneq (, $(filter $(PLATFORM), $(BUILD_CONFIGS_MK)))
include build_config/$(PLATFORM).mk
else
$(error Cannot find build config for platform: $(PLATFORM))
endif
DEPS=$(OBJS:.o=.d)
all: binary size
binary: $(OUT_DIR)/$(TARGET).bin
asms: $(ASMS)
$(OUT_DIR)/$(TARGET).bin: $(OUT_DIR)/$(TARGET).elf $(OUT_DIR)/$(TARGET).S
$(OBJCOPY) -O binary $< $@
$(OUT_DIR)/$(TARGET).elf: $(OBJS) | $(OUT_DIR)
$(CC) $(CC_FLAGS) $(LD_FLAGS) $^ -o $@
$(OUT_DIR)/$(TARGET).S: $(OUT_DIR)/$(TARGET).elf | $(OUT_DIR)
$(OBJDUMP) -D $< > $@
## Compile to object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CC_FLAGS) -c $< -o $@
## Compile to assembler files (optional)
$(ASM_DIR)/%.S: $(SRC_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) -S -fverbose-asm $(CC_FLAGS) -c $< -o $@
$(OUT_DIR):
mkdir -p $@
clean:
rm -rf $(OBJ_DIR)
rm -rf $(OUT_DIR)
rm -rf $(ASM_DIR)
size: $(OUT_DIR)/$(TARGET).elf
$(SIZE) -B $<
format:
find . -type f \( -name "*.cpp" -o -name "*.hpp" -o -name "*.c" -o -name "*.h" \) -exec clang-format --style=file:.clang-format -i {} +
compiledb:
@make clean
@bear -- make all
-include $(DEPS)