##############################################################################
# GNU GCC ARM Embeded Toolchain base directories and binaries 
##############################################################################
FLAG_ABS_PATH = y

ifeq (${FLAG_ABS_PATH},y)
	TOOLCHAIN_PREFIX   = /opt/cross/arm-ronetix-eabi-8.1.0/bin/arm-ronetix-eabi
	TOOLCHAIN_PREFIX_AARCH64   = /opt/cross/aarch64-ronetix-elf/bin/aarch64-ronetix-elf
else
	TOOLCHAIN_PREFIX   = arm-ronetix-eabi
	TOOLCHAIN_PREFIX_AARCH64   = aarch64-ronetix-elf
endif

GCC      = $(TOOLCHAIN_PREFIX)-gcc
LD       = $(TOOLCHAIN_PREFIX)-ld
OBJCOPY  = $(TOOLCHAIN_PREFIX)-objcopy

LDS_PATH=ld-scripts
BUILD_PATH=build-$*

CFLAGS = -Wall -g3 -Wall -O0
CFLAGS_FPU  = -mfloat-abi=hard -mfpu=vfpv3 -mcpu=cortex-a9
CFLAGS_NEON = -mfloat-abi=hard -mfpu=neon  -mcpu=cortex-a9

all: mx6_c0 mx6_c1 mx6_c2 mx6_c3 mx6_fpu mx6_neon \
	mx8_c0_64 mx8_c1_64 mx8_c2_64 mx8_c3_64	\
	zynq_c0_64 zynq_c1_64 zynq_c2_64 zynq_c3_64

#-----------------------------------------------------------------------------
#						build-firmware()
#	Parameter:
#		$1 - toolchain prefix
#		$2 - source file
#		$3 - parameter for -D
#		$4 - extra CFLAGS
#	Description:
# 		Build one image
#-----------------------------------------------------------------------------
define build-image
	mkdir -p $(BUILD_PATH)
	$(eval PREFIX := $1)
	$(eval SRC := $2)
	$(eval SYMBOL := $3)
	$(eval CFLAGS_EXTRA := $4)
	$(PREFIX)-gcc $(CFLAGS) $(CFLAGS_EXTRA) -c -o $(BUILD_PATH)/start_$@.o start.S
	$(PREFIX)-gcc $(CFLAGS) $(CFLAGS_EXTRA) -D$(SYMBOL) -fverbose-asm -S -o $(BUILD_PATH)/$@.s $(SRC)
	$(PREFIX)-gcc $(CFLAGS) $(CFLAGS_EXTRA) -D$(SYMBOL) -c -o $(BUILD_PATH)/$@.o $(BUILD_PATH)/$@.s
	$(PREFIX)-ld $(LDFLAGS) -Map=$(BUILD_PATH)/$@.map -o $(BUILD_PATH)/$@.elf $(BUILD_PATH)/start_$@.o $(BUILD_PATH)/$@.o -T $(LDS_PATH)/$@.ld
	$(PREFIX)-objcopy -O binary $(BUILD_PATH)/$@.elf $(BUILD_PATH)/$@.bin
endef

%_c0:
	$(call build-image, $(TOOLCHAIN_PREFIX),main.c,DEFINED_CORE0)

%_c1:
	$(call build-image, $(TOOLCHAIN_PREFIX),main.c,DEFINED_CORE1)

%_c2:
	$(call build-image, $(TOOLCHAIN_PREFIX),main.c,DEFINED_CORE2)

%_c3:
	$(call build-image, $(TOOLCHAIN_PREFIX),main.c,DEFINED_CORE3)

%_fpu:
	$(call build-image, $(TOOLCHAIN_PREFIX),main_fpu.c,DEFINED_CORE0,$(CFLAGS_FPU))

%_neon:
	$(call build-image, $(TOOLCHAIN_PREFIX),main_neon.c,DEFINED_CORE0,$(CFLAGS_NEON))

%_c0_64:
	$(call build-image, $(TOOLCHAIN_PREFIX_AARCH64),main.c,DEFINED_CORE0)

%_c1_64:
	$(call build-image, $(TOOLCHAIN_PREFIX_AARCH64),main.c,DEFINED_CORE1)

%_c2_64:
	$(call build-image, $(TOOLCHAIN_PREFIX_AARCH64),main.c,DEFINED_CORE2)

%_c3_64:
	$(call build-image, $(TOOLCHAIN_PREFIX_AARCH64),main.c,DEFINED_CORE3)

clean:
	rm -f *.elf *.o *.map *.s *.bin
	rm -rf build-mx6 
	rm -rf build-mx8 
	rm -rf build-zynq
	