Files
kunlun/build/makefile.cfg

435 lines
12 KiB
INI

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
SRCS += $(foreach dirname, $(SUB_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)))))
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\
$(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\
$(MAKE) -C $$d $@ ;\
fi;\
done
-$(RM) $(OUTDIR)
clobber:
@for d in $(SUB_DIRS); do\
if [ -e "$$d/Makefile" ]; then\
$(MAKE) -C $$d $@ ;\
fi;\
done
@-$(RM) $(TOPDIR)/make_flags.txt
@-$(RM) $(TOPDIR)/python_script_log.log
@-python3 $(TOPDIR)/praper_vscode.py clear >> $(TOPDIR)/python_script_log.log
@-$(RM) $(OUTDIR)
# clean obj files only
clean_objs:
-$(RM) $(OBJECTS)
@for d in $(SUB_DIRS); do\
if [ -e "$$d/Makefile" ]; then\
$(MAKE) -C $$d $@ ;\
fi;\
done
install:
mkdir ./bin && \
cp $(OUTPUT_FULL_NAME) ./bin