#!/bin/bash

CC=clang
CXX=clang++
CFLAGS="-Wall -Wextra -I$(realpath ./include) "

ASM=nasm
ASM_FLAGS="-f elf64 "

AR=ar
AR_FLAGS="rcs"

# PARSE ARGUMENTS
# From this StackOverflow answer https://stackoverflow.com/a/14203146
while [[ $# > 0 ]];do
	case $1 in
		--release)
			RELEASE=true
			shift
			;;
		--basic-profiling)
			BASIC_PROFILING=true
			shift
			;;
		--full-profiling)
			FULL_PROFILING=true
			shift
			;;
		*|-*|--*)
			echo "Unknown option $1"
			exit 1
			;;
	esac
done


# BUILD TYPE
if [[ $RELEASE == true ]]; then
	CFLAGS+="-g -O1"
else
	CFLAGS+="-g"
fi


# GENERATOR
GENSRC="./src/generator/gen_argparser.cpp \
	./src/generator/generator.cpp \
	./src/haversine.cpp \
	./src/point_types.cpp \
	./src/generator/main.cpp"
GENOUT=genhavr

(set -x ; $CXX $CFLAGS $GENSRC -o $GENOUT)
echo

# PROFILER
PROFSRC="../src/profiler/timer.c"
PROFFLAGS="-c "
PROF_BUILD_DIR=prof_build

# PROCESSOR
JSONSRC="../src/json/*.c "
JSONFLAGS="-c "
JSON_BUILD_DIR=json_build

PROCSRC="./$JSON_BUILD_DIR/*.o \
	./src/haversine.cpp \
	./src/point_types.cpp \
	./src/processor/proc_argparser.cpp \
	./src/processor/main.cpp "
PROCOUT=prochavr

# MEMTESTER
MEMTESTSRC="./src/memtester/*.c"
MEMTESTOUT=memtest

(set -x ; $CC $CFLAGS $MEMTESTSRC -o $MEMTESTOUT)
echo

# REPTEST ASSEMBLY
ASM_BUILD_DIR=reptest_build
ASM_SRC="./src/repetition_testing/reptest_functions.asm"
ASM_OBJ="./$ASM_BUILD_DIR/funcs.o"
ASM_LIB="./$ASM_BUILD_DIR/libfuncs.a"

mkdir $ASM_BUILD_DIR

(set -x ; $ASM $ASM_FLAGS $ASM_SRC -o $ASM_OBJ)
(set -x ; $AR $AR_FLAGS $ASM_LIB $ASM_OBJ)
echo

if [[ $BASIC_PROFILING == true ]] || [[ $FULL_PROFILING == true ]]; then
	if [[ $FULL_PROFILING == true ]]; then
		JSONFLAGS+="-DFULL_PROFILING"
		PROCFLAGS="-DFULL_PROFILING"
		REPTESTFLAGS="-DFULL_PROFILING"
		PROFFLAGS+="-DFULL_PROFILING"
	elif [[ $BASIC_PROFILING == true ]]; then
		JSONFLAGS+="-DBASIC_PROFILING"
		PROCFLAGS="-DBASIC_PROFILING"
		REPTESTFLAGS="-DBASIC_PROFILING"
		PROFFLAGS+="-DBASIC_PROFILING"
	fi

	PROCSRC+=./$PROF_BUILD_DIR/*.o

	mkdir $PROF_BUILD_DIR
	cd $PROF_BUILD_DIR

	(set -x ; $CC $CFLAGS $PROFFLAGS $PROFSRC)
	echo

	cd ../

	# REPETITION TESTING
	REPTESTSRC="./src/repetition_testing/*.cpp ./$PROF_BUILD_DIR/*.o $ASM_LIB"
	REPTESTOUT=reptest

	(set -x ; $CXX $CFLAGS $REPTESTFLAGS $REPTESTSRC -o $REPTESTOUT)
	echo
fi

mkdir $JSON_BUILD_DIR
cd $JSON_BUILD_DIR

(set -x ; $CC $CFLAGS $JSONFLAGS $JSONSRC)
echo

cd ../

(set -x ; $CXX $CFLAGS $PROCFLAGS $PROCSRC -o $PROCOUT)
echo

# CLEAR BUILD FILES
rm -rvf $JSON_BUILD_DIR $PROF_BUILD_DIR $ASM_BUILD_DIR