SHELL = /bin/bash ## compiler ### ifeq ($(gcc), arm) CC = arm-none-eabi-gcc GLOBAL_MACRO = CM3 else ifeq ($(target), kunlun2) CC = riscv64-unknown-elf-gcc ifeq ($(soft_float_enable), 1) ISA = rv32imc ABI = ilp32 else ISA = rv32imafc ABI = ilp32f endif RISCV_VER = riscv2 else ifeq ($(target), kunlun3) CC = riscv64-unknown-elf-gcc ifeq ($(soft_float_enable), 1) ISA = rv32imc ABI = ilp32 else ISA = rv32imafc ABI = ilp32f endif RISCV_VER = riscv3 else CC = riscv64-unknown-elf-gcc gcc_version=$(shell (${CC} -dumpversion | awk -F. '{print $1}')) # $(info "gcc version is " ${gcc_version}) ifeq ($(gcc_version), 15.0.0) ISA = rv32imc_zicsr else ISA = rv32imc endif ABI = ilp32 RISCV_VER = riscv endif endif GLOBAL_MACRO = RISCV endif GDB_FLAG = -g ### shell command ### RM = rm -rf ifeq ($(target), kunlun3) ifeq ($(build_amp_type), 1) OUTDIR = .output/cus else OUTDIR = .output/plc endif else OUTDIR = .output endif # obj output folder BIN_DIR = $(OUTDIR)/$(ASSIGNED_DIR)obj # image output folder OUTPUT_DIR = $(OUTDIR)/lib EXT_SRC ?= ifneq ($(OUTPUT_TYPE), 0) # .files to compile if need GET_SRCS = $(wildcard $(1)/*.c) $(wildcard $(1)/*.cpp) $(wildcard $(1)/*.S) # local .c SRCS += $(call GET_SRCS, .) # every sub dir's .c # 如果子文件夹包含makefile文件 则不包含这个目录的源文件 SRC_DIRS = $(shell for dir in $(SUB_DIRS); do \ if [ ! -f "$$dir/Makefile" ]; then \ echo "$$dir"; \ fi \ done) SRCS += $(foreach dirname, $(SRC_DIRS), $(call GET_SRCS, $(dirname))) # ext src SRCS += $(EXT_SRC) # all the obj names OBJECTS = $(addprefix $(BIN_DIR)/, $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SRCS))))) $(shell echo $(SRCS) > "src_files.txt") $(shell echo $(ADD_INCLUDE) >> "src_files.txt") endif PLATFORM ?= FPGA ifeq ($(PLATFORM), ) GLOBAL_MACRO = HW_PLATFORM=1 endif ifeq ($(PLATFORM), FPGA) GLOBAL_MACRO += HW_PLATFORM=1 endif ifeq ($(PLATFORM), CHIP) GLOBAL_MACRO += HW_PLATFORM=2 endif HW_CHIP_ID ?= HZ ifeq ($(HW_CHIP_ID), HZ) GLOBAL_MACRO += HW_CHIP_ID=1 else ifeq ($(HW_CHIP_ID), WQ) GLOBAL_MACRO += HW_CHIP_ID=2 else GLOBAL_MACRO += HW_CHIP_ID=3 endif endif ifeq ($(product_line), PLC) ifeq ($(APP), ) GLOBAL_MACRO += IOT_APP_SELECTION=0 else GLOBAL_MACRO += IOT_APP_SELECTION=$(APP) endif endif #FLASH_SIZE=1 -> 1M. ifeq ($(FLASH_SIZE), ) GLOBAL_MACRO += IOT_FLASH_SIZE=1 else GLOBAL_MACRO += IOT_FLASH_SIZE=$(FLASH_SIZE) endif ifeq ($(PLC_SUPPORT_3_PHASE), ) ifeq ($(cco), 1) GLOBAL_MACRO += PLC_SUPPORT_3_PHASE=1 endif else GLOBAL_MACRO += PLC_SUPPORT_3_PHASE=$(PLC_SUPPORT_3_PHASE) endif ifeq ($(RISCV_VER), riscv2) GLOBAL_MACRO += TARGET_VERSION=2 else ifeq ($(RISCV_VER), riscv3) GLOBAL_MACRO += TARGET_VERSION=3 else GLOBAL_MACRO += TARGET_VERSION=1 endif endif ifeq ($(smart_cco_sta), ) smart_cco_sta = 0 endif ifeq ($(ckb), 1) MODE_TYPE=sta else ifneq ($(smart_cco_sta), 0) ifeq ($(cco), 1) MODE_TYPE=smart_cco else MODE_TYPE=smart_sta endif else ifeq ($(cco), 1) MODE_TYPE=cco else MODE_TYPE=sta endif endif endif BIN2HEX = $(TOPDIR)/tools/bin_tool/bin2hex # the variable needs to be exported to sub dirs by default export ADD_INCLUDE PRE_MARCO OPT_FLAG ####################################################### LD_SCRIPT ?= link.lds #ifeq ($LD_SCRIPT), ) #LD_SCRIPT = link.lds #endif ifeq ($(LD_ALL_SECTION), 1) LD_SECTION_FLAG = -Wl,--whole-archive LD_SECTION_FLAG2 = -Wl,--no-whole-archive else LD_SECTION_FLAG = -Wl,--gc-sections endif ifeq ($(DISABLE_BACKTRACE), 1) OPT_FLAG = -Os $(EXTRA_OPT_FLAG) ifeq ($(psram_enable), 0) ifeq ($(flash_size), 1) OPT_FLAG = -Os -msave-restore else ifeq ($(flash_size), 2) OPT_FLAG = -Os -msave-restore endif endif endif # strip is to remove the space on the head and tail OUTPUT_FULL_NAME =\ $(strip $(OUTPUT_DIR))/$(shell if [ 2 -eq $(OUTPUT_TYPE) -o 3 -eq $(OUTPUT_TYPE) ];then echo -n "lib";fi)$(strip $(OUTPUT_NAME)).$(shell if [ 1 -eq $(OUTPUT_TYPE) ];then echo -n "out";elif [ 2 -eq $(OUTPUT_TYPE) ];then echo -n "a";elif [ 3 -eq $(OUTPUT_TYPE) ];then echo -n "so";fi) LIBDIRS =\ $(foreach lib_dir, $(ADD_LIBDIR), $(addprefix -L, $(lib_dir)/$(OUTPUT_DIR))) OUTPUT_MAP = $(OUTPUT_FULL_NAME:.out=.map) ################################ # consider the multiple compiler # if GCC ifeq ($(CC), gcc) AR = ar SIZE = size OBJCOPY = objcopy STRIP = strip MAKEDEP = -MM FLAGS = -Wall -g $(OPT_FLAG) -std=c99\ -fmessage-length=0 -fsigned-char -ffreestanding -fno-move-loop-invariants\ $(addprefix -D, $(PRE_MARCO))\ $(addprefix -D, $(GLOBAL_MACRO))\ $(addprefix -I, $(ADD_INCLUDE)) FLAGS_LINK = $(FLAGS) $(LIBDIRS)\ $(addprefix -l, $(ADD_LIB))\ -Wl,--gc-sections -Wall -Wextra -nostartfiles -Wl,-Map,"$(OUTPUT_MAP)" endif # if arm GCC ifeq ($(CC), arm-none-eabi-gcc) AR = arm-none-eabi-ar SIZE = arm-none-eabi-size OBJCOPY = arm-none-eabi-objcopy STRIP = arm-none-eabi-strip MAKEDEP = -MM FLAGS = -mcpu=cortex-m3 -mthumb -Wall -Werror -g $(OPT_FLAG) \ -fmessage-length=0 -fsigned-char -ffreestanding -fno-move-loop-invariants\ $(addprefix -D, $(PRE_MARCO))\ $(addprefix -D, $(GLOBAL_MACRO))\ $(addprefix -I, $(ADD_INCLUDE)) FLAGS_LINK = $(FLAGS) $(LIBDIRS)\ $(addprefix -l, $(ADD_LIB))\ -T$(LD_SCRIPT) -Wl,--gc-sections -Wall -Wextra -nostartfiles -L"$(TOPDIR)/startup/ldscripts/cm3" -Wl,-Map,"$(OUTPUT_MAP)" endif # if ARMCC ifeq ($(CC), armcc) AR = arm-none-eabi-ar SIZE = arm-none-eabi-size STRIP = arm-none-eabi-strip MAKEDEP = -M -c OBJCOPY = arm-none-eabi-objcopy FLAGS = \ --cpu=Cortex-M3 --thumb --fpmode=std --fpu=vfpv4_d16 -g $(OPT_FLAG)\ $(addprefix -D, $(PRE_MARCO))\ $(addprefix -D, $(GLOBAL_MACRO))\ $(addprefix -I, $(ADD_INCLUDE)) FLAGS_LINK = $(FLAGS) $(LIBDIRS)\ $(addprefix -l, $(ADD_LIB)) endif # if MSC ifeq ($(CC), cl) AR = FLAGS = FLAGS_LINK = endif # if risc-v ifeq ($(CC), riscv32-unknown-elf-gcc) AR = riscv32-unknown-elf-ar SIZE = riscv32-unknown-elf-size OBJCOPY = riscv32-unknown-elf-objcopy STRIP = riscv32-unknown-elf-strip MAKEDEP = -MM FLAGS = -march=$(ISA) -mabi=ilp32 -ffunction-sections -fdata-sections -ffast-math -fno-common -fno-builtin-printf -Wall -Werror $(GDB_FLAG) $(OPT_FLAG)\ $(addprefix -D, $(PRE_MARCO))\ $(addprefix -D, $(GLOBAL_MACRO))\ $(addprefix -I, $(ADD_INCLUDE)) FLAGS_LINK = $(FLAGS) $(LIBDIRS)\ $(ADD_OBJ) \ $(LD_SECTION_FLAG) \ $(addprefix -l, $(ADD_LIB))\ $(LD_SECTION_FLAG2) \ -T$(LD_SCRIPT) -Wall -Wextra -nostartfiles -L$(TOPDIR)/startup/ldscripts/$(RISCV_VER) -Wl,-Map,"$(OUTPUT_MAP)" endif ifeq ($(CC), riscv64-unknown-elf-gcc) AR = riscv64-unknown-elf-ar SIZE = riscv64-unknown-elf-size OBJCOPY = riscv64-unknown-elf-objcopy STRIP = riscv64-unknown-elf-strip MAKEDEP = -MM FLAGS = -march=$(ISA) -mabi=$(ABI) -ffunction-sections -fdata-sections -ffast-math -fno-common -Wno-array-bounds -fno-builtin-printf -Wall $(GDB_FLAG) $(OPT_FLAG)\ $(addprefix -D, $(PRE_MARCO))\ $(addprefix -D, $(GLOBAL_MACRO))\ $(addprefix -I, $(ADD_INCLUDE)) FLAGS_LINK = $(FLAGS) $(LIBDIRS)\ $(ADD_OBJ) \ $(LD_SECTION_FLAG) \ -Wl,--start-group \ $(addprefix -l, $(ADD_LIB))\ -Wl,--end-group \ $(LD_SECTION_FLAG2) \ -T$(LD_SCRIPT) -Wall -Wextra -nostartfiles -L$(TOPDIR)/startup/ldscripts/$(RISCV_VER) -Wl,-Map,"$(OUTPUT_MAP)" \ -Wl,-print-memory-usage endif ########################### $(OUTPUT_FULL_NAME): $(OUTPUT_DIR) $(BIN_DIR)/.sub_dirs $(BIN_DIR)/.ext_src $(OBJECTS) @echo '$(FLAGS)' >> $(TOPDIR)/make_flags.txt @echo 'build $@' @python3 $(TOPDIR)/praper_vscode.py $(TOPDIR)/make_flags.txt $@ >> $(TOPDIR)/python_script_log.log @for d in $(SUB_DIRS); do\ if [ -e "$$d/Makefile" ]; then\ echo "enter $$d";\ $(MAKE) -C $$d || exit 1;\ if [ 2 -eq $(OUTPUT_TYPE) ];then\ if [ -e $(OUTPUT_FULL_NAME) ]; then \ echo "open $(OUTPUT_FULL_NAME)">tmp.mri;\ else echo "create $(OUTPUT_FULL_NAME)">tmp.mri;fi;\ for a in `ls $$d/$(OUTPUT_DIR)/*.a 2>/dev/null`; do \ $(AR) -t $$a | xargs $(AR) -d $(OUTPUT_FULL_NAME);\ echo "addlib $$a" >> tmp.mri;\ done;\ echo "save" >> tmp.mri;\ echo "end" >> tmp.mri;\ $(AR) -M < tmp.mri;\ $(RM) tmp.mri;\ fi;\ fi; \ done;\ if [ -n "$(OBJECTS)" -o -n "$(ADD_LIB)" ]; then \ if [ 0 -eq $(OUTPUT_TYPE) ]; then \ echo "";\ elif [ 1 -eq $(OUTPUT_TYPE) ]; then\ $(CC) -o $(OUTPUT_FULL_NAME) $(OBJECTS) $(FLAGS_LINK) || exit 1;\ $(SIZE) $(OUTPUT_FULL_NAME) ;\ $(OBJCOPY) -O binary $(OUTPUT_FULL_NAME) $(OUTPUT_DIR)/$(OUTPUT_NAME).bin ;\ $(BIN2HEX) $(OUTPUT_DIR)/$(OUTPUT_NAME).bin $(OUTPUT_DIR)/$(OUTPUT_NAME).hex;\ elif [ 2 -eq $(OUTPUT_TYPE) ];then\ $(AR) -rc $(OUTPUT_FULL_NAME) $(OBJECTS) || exit 1;\ elif [ 3 -eq $(OUTPUT_TYPE) ];then\ $(CC) -fPIC -shared -o $(OUTPUT_FULL_NAME) $(OBJECTS) || exit 1;\ else\ echo "please input the correct OUTPUT_TYPE";\ exit 1;\ fi;\ `echo ${extra_work}`;\ fi # create the output folder $(BIN_DIR)/.sub_dirs: $(BIN_DIR) $(shell if [ -n "$(SUB_DIRS)" ];then \ echo $(foreach dirname, $(SUB_DIRS), \ $(shell if [ ! -e "$(addprefix $(BIN_DIR)/, $(dirname))" ];then \ mkdir -p $(addprefix $(BIN_DIR)/, $(dirname)); fi )); \ fi; touch $@) $(BIN_DIR)/.ext_src: $(BIN_DIR) $(shell if [ -n "$(EXT_SRC)" ];then \ echo $(foreach dirname, $(EXT_SRC), \ $(shell if [ ! -e "$(addprefix $(BIN_DIR)/, $(shell dirname $(dirname)))" ];then \ mkdir -p $(addprefix $(BIN_DIR)/, $(shell dirname $(dirname))); fi )); \ fi; touch $@) $(OUTPUT_DIR): $(BIN_DIR) $(shell if [ -n "$(OUTPUT_DIR)" -a ! -e "$(OUTPUT_DIR)" ];then mkdir -p $(OUTPUT_DIR); fi ) $(BIN_DIR): $(shell if [ -n "$(BIN_DIR)" -a ! -e "$(BIN_DIR)" ];then mkdir -p $(BIN_DIR); fi) # .d files handler DEPS = $(addprefix $(BIN_DIR)/, $(patsubst %.S, %.d, $(patsubst %.c, %.d, $(patsubst %.cpp, %.d, $(SRCS))))) sinclude $(DEPS) $(BIN_DIR)/%.d: %.c $(shell if [ -n "$(BIN_DIR)" -a ! -e "$(BIN_DIR)" ];then mkdir -p $(BIN_DIR); fi) $(shell if [ -n "$(SUB_DIRS)" ];then echo $(foreach dirname, $(SUB_DIRS), $(shell if [ ! -e "$(addprefix $(BIN_DIR)/, $(dirname))" ];then mkdir -p $(addprefix $(BIN_DIR)/, $(dirname)); fi )); fi ) $(shell if [ -n "$(EXT_SRC)" ];then echo $(foreach dirname, $(EXT_SRC), $(shell if [ ! -e "$(addprefix $(BIN_DIR)/, $(shell dirname $(dirname)))" ];then mkdir -p $(addprefix $(BIN_DIR)/, $(shell dirname $(dirname))); fi )); fi ) @set -e; rm -f $@; \ $(CC) $(FLAGS) $(MAKEDEP) $< > $@.$$$$; \ sed 's,\($(notdir $*)\.o\)[: ]*,$(BIN_DIR)\/$*\.o : ,' < $@.$$$$ > $@; \ echo -e -n "\t@echo 'build \x24<'\x0a" >> $@; \ echo -e -n "\t@\x24(CC) \x24(FLAGS) -c \x24< -o \x24@" >> $@; \ $(RM) $@.$$$$ $(BIN_DIR)/%.d: %.S $(shell if [ -n "$(BIN_DIR)" -a ! -e "$(BIN_DIR)" ];then mkdir -p $(BIN_DIR); fi) $(shell if [ -n "$(SUB_DIRS)" ];then echo $(foreach dirname, $(SUB_DIRS), $(shell if [ ! -e "$(addprefix $(BIN_DIR)/, $(dirname))" ];then mkdir -p $(addprefix $(BIN_DIR)/, $(dirname)); fi )); fi ) @set -e; rm -f $@; \ $(CC) $(MAKEDEP) $(FLAGS) $< > $@.$$$$; \ sed 's,\($(notdir $*)\.o\)[ : ]*,$(BIN_DIR)\/$*\.o : ,' < $@.$$$$ > $@; \ echo -e -n "\t@echo 'build \x24<'\x0a" >> $@; \ echo -e -n "\t@\x24(CC) \x24(FLAGS) -c \x24< -o \x24@" >> $@; \ $(RM) $@.$$$$ # dummy object .PHONY: clean clean_objs clobber $(OUTPUT_FULL_NAME) # clean all clean: -$(RM) $(OUTPUT_FULL_NAME) $(OBJECTS) $(DEPS) $(BIN_DIR)/.sub_dirs $(BIN_DIR)/.ext_src @for d in $(SUB_DIRS) ; do\ if [ -e "$$d/Makefile" ]; then\ echo "clean $$d";\ $(MAKE) -C $$d $@ ;\ fi;\ done -$(RM) $(OUTDIR) clobber: @echo clobber # clean obj files only clean_objs: -$(RM) $(OBJECTS) @for d in $(SUB_DIRS); do\ if [ -e "$$d/Makefile" ]; then\ echo "clean_objs $$d";\ $(MAKE) -C $$d $@ ;\ fi;\ done install: mkdir ./bin && \ cp $(OUTPUT_FULL_NAME) ./bin