# Location of ARM toolchain
SDK_PATH = /home/research/Xilinx/SDK/2019.1
ARM_TOOLS_PATH = $(SDK_PATH)/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin

MKDIR_P = mkdir -p

# Compilation tools
CC = gcc
CC_ARM = $(ARM_TOOLS_PATH)/arm-linux-gnueabihf-gcc
CXX_ARM = $(ARM_TOOLS_PATH)/arm-linux-gnueabihf-g++

CFLAGS = -Wall -std=c99 -Wno-format-overflow 
CXXFLAGS = -Wall -Wno-format-overflow

# DATABASE
DEFINES = 

# Needed by verifier_regeneration.c for Intel arch
LIB_PATHS = 
INCLUDE_PATHS = 
LINK_FLAGS = 

LIB_PATHS_ARM = 

# Only needed by ttp_DB.c but it's fine if included everywhere
INCLUDE_PATHS_ARM = 

LINK_FLAGS_ARM = -lm 

# All output binaries
BIN_KM = kmeans_codesign_starter.elf

TARGETS = $(BIN_KM)

# Object files required for each binary
#USER_OBJS_KM = common.o kmeans_codesign_starter.o
USER_OBJS_KM = kmeans_codesign_starter.o

# Build directory locations
OBJDIR_X86 = build/x86
OBJDIR_ARM_CXX = build/arm-g++
OBJDIR_ARM_CC = build/arm-gcc

# Append build directory paths to lists of object files
OBJS_KM = $(patsubst %, $(OBJDIR_ARM_CC)/%, $(USER_OBJS_KM))

# Create the build directory automatically
$(shell $(MKDIR_P) $(OBJDIR_X86) $(OBJDIR_ARM_CC) $(OBJDIR_ARM_CXX))

# Default target
.PHONY: all
all: $(TARGETS)

# Output binaries
$(BIN_KM): $(OBJS_KM)
	$(CC_ARM) $^ $(LIB_PATHS_ARM) $(LINK_FLAGS_ARM) -o $@

# ARM C object files
$(OBJDIR_ARM_CC)/kmeans_codesign_starter.o: kmeans_codesign_starter.c 
#$(OBJDIR_ARM_CC)/common.o: common.c common.h

$(OBJDIR_ARM_CC)/%.o:
	$(CC_ARM) $(CFLAGS) $(DEFINES) $(INCLUDE_PATHS_ARM) -c $< -o $@

# Utility
.PHONY: clean install

install: $(BIN_TRG) $(BIN_TTP)
	./copy_to_devices.sh $(BIN_TRG) $(BIN_TTP)

clean:
	-rm $(TARGETS)
	-rm -r build
