Files
microchip-application-pec93…/Makefile
T
2026-02-03 11:37:13 +08:00

339 lines
8.2 KiB
Makefile

# ------------------------------------------------
# Generic Makefile (based on gcc)
# Copyright (c) 2022, All Rights Reserved.
# @file Makefile
# @author Wei-Lun Hsu
# @version 1.0
# ------------------------------------------------
RED="\033[0;31m"
GREEN="\033[0;32m"
LIGHT_GREEN="\033[1;32m"
YELLOW="\033[0;33m"
LIGHT_YELLOW="\033[1;33m"
GREY="\033[0;37m"
BWHITE="\033[1;37m"
MAGENTA="\033[1;35m"
CYAN="\033[1;36m"
NC="\033[0m"
PHONY := all flash flash_nvr clean help
PHONY += gdb_server gdb
PHONY += tags TAGS cscope gtags
PHONY += upload
######################################
# target
######################################
ifeq ("$(TARGET)","")
TARGET = Project
endif
SOC ?= pb5700
ifeq (,$(filter $(MAKECMDGOALS),clean help))
ifeq ("$(SOC)","pb5700")
SOC_DRIVER = PB5700
else
$(error "Unknown SoC, User MUST define 'SOC' name !")
endif
endif
srctree=$(shell pwd)
export SOC_CPU_NAME TARGET srctree SOC_DRIVER
######################################
# building variables
######################################
# debug build?
DEBUG = y
OPT =
ifeq ("$(D)","0")
DEBUG = n
OPT ?= -O2
endif
V ?= $(VERBOSE)
ifeq ("$(V)","1")
Q =
else
Q = @
endif
PLATFORM = $(shell uname -o)
ifeq ("$(findstring Linux, $(PLATFORM))","Linux")
ECHO = echo
TUI = -tui
else
ECHO = echo -e
TUI =
endif
PYTHON := python3
PYTHON_VER := $(wordlist 2,4,$(subst ., ,$(shell $(PYTHON) --version 2>&1)))
PYTHON_VER := $(word 1,${PYTHON_VER})$(word 2,${PYTHON_VER})
export PLATFORM ECHO Q PYTHON PYTHON_VER TUI DEBUG OPT
#######################################
# paths
#######################################
ifeq ("$(O)","")
OUT = out
else
OUT = $(O)
endif
ifeq ("$(P)","")
PROJ = Examples/template/demo_project
else
PROJ = $(P)
endif
$(info Active SoC=$(SOC) @$(PROJ))
export OUT PROJ LIBBIN
#######################################
# binaries
#######################################
PREFIX = riscv64-unknown-elf-
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
SZ = $(GCC_PATH)/$(PREFIX)size
GDB= $(GCC_PATH)/$(PREFIX)gdb
OBJCOPY = $(GCC_PATH)/$(PREFIX)objcopy
OBJDUMP = $(GCC_PATH)/$(PREFIX)objdump
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
SZ = $(PREFIX)size
GDB= $(PREFIX)gdb
OBJCOPY = $(PREFIX)objcopy
OBJDUMP = $(PREFIX)objdump
endif
HEX = $(OBJCOPY) -O ihex
BIN = $(OBJCOPY) -O binary -S
ifeq ("$(findstring Linux, $(PLATFORM))","Linux")
OPENOCD = openocd
else
OPENOCD = openocd.exe
endif
OPENOCDCFG := $(srctree)/Tools/openocd/scripts/target/$(SOC)
#######################################
# CFLAGS
#######################################
# mcu
MCU =
# AS defines
AS_DEFS =
# C defines
C_DEFS =
# AS includes
AS_INCLUDES =
# C includes
C_INCLUDES =
ifeq ("$(DEBUG)","y")
OPT += -g -ggdb -gdwarf-2 -O0
else
CFLAGS += -DNDEBUG
endif
ASFLAGS = $(MCU) $(OPT) -Wall -fdata-sections -ffunction-sections -fno-common
CFLAGS = $(MCU) $(OPT) -Wall -fdata-sections -ffunction-sections -fno-common
CFLAGS += -std=gnu99
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
export CFLAGS ASFLAGS C_INCLUDES AS_INCLUDES C_DEFS
#######################################
# LDFLAGS
#######################################
# link script
ifeq ("$(L)","")
LDSCRIPT = $(srctree)/Drivers/$(SOC_DRIVER)/gcc_flashxip.ld
else
LDSCRIPT = $(L)
endif
# libraries
LIBS =
LIBDIR =
LDFLAGS = $(MCU) -nodefaultlibs -nostartfiles -Wl,--cref \
$(LIBDIR) \
-Wl,-T$(LDSCRIPT) \
-Wl,-Map=$(OUT)/$(TARGET).map
export LDFLAGS LDSCRIPT LIBS
######################################
# source
######################################
# C sources
C_SOURCES :=
# ASM sources
ASM_SOURCES :=
include $(srctree)/Drivers/drivers.mk
include $(srctree)/Common/common.mk
ifeq ("$(PROJ)","")
$(error "Unknown project !!!")
else
include $(srctree)/$(PROJ)/component.mk
endif
OBJECTS = $(addprefix $(OUT)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
OBJECTS += $(addprefix $(OUT)/,$(notdir $(ASM_SOURCES:.S=.o)))
vpath %.S $(sort $(dir $(ASM_SOURCES)))
RELT_SOURCES = $(foreach srcpath,$(C_SOURCES),$(subst $(srctree), ,$(srcpath)))
RELT_SOURCES += $(foreach srcpath,$(ASM_SOURCES),$(subst $(srctree),,$(srcpath)))
RELT_INCLUDES = $(foreach incpath,$(C_INCLUDES),$(subst $(srctree),,$(incpath)))
TARGET_GDB_SCRIPT :=
#######################################
# build the application
#######################################
ASFLAGS += $(AS_DEFS) $(AS_INCLUDES)
CFLAGS += $(C_DEFS) $(C_INCLUDES)
LDFLAGS += \
-Wl,-gc-sections \
-Wl,--check-sections \
-Wl,--start-group \
-lc_nano -lgcc -lm \
-Wl,--end-group
LDFLAGS += \
-Wl,--no-warn-rwx-segments
# default action: build all
all: $(OUT) $(OUT)/$(TARGET).elf $(OUT)/$(TARGET).hex $(OUT)/$(TARGET).bin
$(OUT)/%.o: %.c Makefile | $(OUT)
@$(ECHO) " CC $@"
$(Q)$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(OUT)/$(notdir $(<:.c=.lst)) $< -o $@
$(OUT)/%.o: %.S Makefile | $(OUT)
@$(ECHO) " CC $@"
$(Q)$(AS) -c $(ASFLAGS) $(CFLAGS) $< -o $@
$(OUT)/$(TARGET).elf: $(OBJECTS) Makefile
$(Q)$(CC) -Wl,--whole-archive $(OBJECTS) $(LIBS) -Wl,--no-whole-archive $(LDFLAGS) -o $@
$(Q)$(OBJDUMP) -Sx $(OUT)/$(TARGET).elf > $(OUT)/$(TARGET).disa
@$(ECHO) $(GREEN)"\nSize $(OUT)/$(TARGET).elf" $(NC)
$(Q)$(SZ) $@
$(OUT)/%.hex: $(OUT)/%.elf | $(OUT)
@$(ECHO) $(YELLOW) "Generate $(OUT)/$(TARGET).hex" $(NC)
$(Q)$(HEX) $< $@
$(OUT)/%.bin: $(OUT)/%.elf | $(OUT)
@$(ECHO) $(YELLOW) "Generate $(OUT)/$(TARGET).bin" $(NC)
$(Q)$(BIN) $< $@
$(Q)od -A n -t x4 --width=4 -v $@ > $(OUT)/$(TARGET).txt
$(Q)$(ECHO) $(CYAN) "Project SoC=$(SOC) @$(PROJ)" $(NC)
$(OUT):
@mkdir -p $@
flash: $(OUT)/$(TARGET).bin
@$(ECHO) $(YELLOW) "Program $(OUT)/$(TARGET).elf to flash of DUT" $(NC)
@$(OPENOCD) -s Tools/openocd/scripts -f Tools/openocd/scripts/target/$(SOC).cfg \
-c "program $(OUT)/$(TARGET).bin verify 0; exit" 2>&1 | tee openocd.log
gdb_server: $(OUT)/$(TARGET).elf
@${OPENOCD} -s Tools/openocd/scripts -f Tools/openocd/scripts/target/$(SOC).cfg
gdb: $(OUT)/$(TARGET).elf
ifeq ("$(DEBUG)","y")
@$(ECHO) $(YELLOW) "Download and Run GDB" $(NC)
@$(ECHO) " load $(OUT)/$(TARGET).elf"
@$(GDB) $< $(TUI) --command=$(TARGET_GDB_SCRIPT) \
-ex "set remotetimeout 240" \
-ex "monitor reset halt resume" \
-ex "set mem inaccessible-by-default off" \
-ex "target remote | $(OPENOCD) -c \"gdb_port pipe; log_output openocd.log\" \
-s Tools/openocd/scripts \
-f Tools/openocd/scripts/target/$(SOC).cfg" \
-ex "j _start"
else
@$(ECHO) $(RED) "It MUST be compiled with debug mode !" $(NC)
endif
upload: $(OUT)/$(TARGET).bin
@$(ECHO) $(YELLOW) "Download $(OUT)/$(TARGET).elf to flash of DUT and Run" $(NC)
@$(OPENOCD) -s Tools/openocd/scripts -f Tools/openocd/scripts/target/$(SOC).cfg \
-c "program $(OUT)/$(TARGET).elf verify 0; reset run" 2>&1 | tee openocd.log
clean:
@$(ECHO) $(YELLOW) "Clean target" $(NC)
@$(ECHO) " Remove $(OUT)"
@rm -fR $(OUT)
@$(ECHO) " Done\n"
tags TAGS cscope gtags: $(OUT)
@rm -f GPATH GRTAGS GTAGS
@$(srctree)/Tools/scripts/tags.sh $@
help:
@$(ECHO) "----------------------------------------------------------------------"
@$(ECHO) "Useful make targets:"
@$(ECHO) ""
@$(ECHO) "Options:"
@$(ECHO) " SOC: $(SOC)"
@$(ECHO) " P: project path (root: $(srctree))"
@$(ECHO) " D: debug mode (0: release, default: 1)"
@$(ECHO) " O: output path (default: out)"
@$(ECHO) " L: link-script path (default: gcc_flashxip.ld in Drivers)"
@$(ECHO) ""
@$(ECHO) "e.g. make P=Examples/template/demo_project"
@$(ECHO) ""
@$(ECHO) " make clean - Remove most generated files"
@$(ECHO) ""
@$(ECHO) " make flash - Program ELF file to flash of DUT"
@$(ECHO) ""
@$(ECHO) " make upload - Program ELF file to flash of DUT and free-run"
@$(ECHO) ""
@$(ECHO) " make gdb_server - Start GDB server"
@$(ECHO) " make gdb - Download elf to flash and run GDB for development"
@$(ECHO) ""
@$(ECHO) " make tags/TAGS - Generate tags file for editors"
@$(ECHO) " make cscope - Generate cscope index"
@$(ECHO) ""
@$(ECHO) " make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build"
@$(ECHO) "----------------------------------------------------------------------"
#######################################
# dependencies
#######################################
-include $(wildcard $(OUT)/*.d)
.PHONY: $(PHONY)