# Declaration of variables

# Generic Variables
GCC=gcc
GXX=g++
CFLAGS= -Wall -pedantic -Wextra -std=gnu99 -g -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable
CXXFLAGS= -Wall -pedantic -Wextra -Wno-reorder -Wno-unused-variable -std=c++0x -g
INCLUDES = $(foreach dir, $(INCDIR), -I$(dir))
INCDIR= src/vrpn src/vrpn/quat src/vrpn/build $(BESRCDIR) $(CLISRCDIR) $(FESRCDIR) $(MASRCDIR) ../quad/inc 
LIBS= -lpthread -lbluetooth -lvrpn -lquat -Lsrc/vrpn/build -Lsrc/vrpn/build/quat -L../quad/lib -lquad_app -lcommands -lgraph_blocks -lcomputation_graph -lm
OBJDIR=obj

# Manual Assist Specific Variables
MABINARY=ManualAssist
MASRCDIR=src/manual_assist
MASOURCES := $(wildcard $(MASRCDIR)/*.c)
MAOBJECTS = $(MASOURCES:$(MASRCDIR)/%.c=$(OBJDIR)/%.o)

# Backend Specific Variables
BEBINARY=BackEnd
BESRCDIR=src/backend
BECSOURCES := $(wildcard $(BESRCDIR)/*.c )
BECOBJECTS = $(BECSOURCES:$(BESRCDIR)/%.c=$(OBJDIR)/%.o)
BECPPSOURCES := $(wildcard $(BESRCDIR)/*.cpp )
BECPPOBJECTS = $(BECPPSOURCES:$(BESRCDIR)/%.cpp=$(OBJDIR)/%.o)

# CLI Specific Variables
CLIBINARY=Cli
CLISRCDIR=src/cli
CLISOURCES := $(wildcard $(CLISRCDIR)/*.c)
CLIOBJECTS = $(CLISOURCES:$(CLISRCDIR)/%.c=$(OBJDIR)/%.o)
SYMLINKS= getnodes addnode getparam setparam getsource setsource getoutput gettrackable settrackable

# Frontend-common stuff
FESRCDIR=src/frontend
FECSOURCES := $(wildcard $(FESRCDIR)/*.c )
FECOBJECTS = $(FECSOURCES:$(FESRCDIR)/%.c=$(OBJDIR)/%.o)


OBJECTS=$(CLIOBJECTS) $(BECOBJECTS) $(BECPPOBJECTS) $(FECOBJECTS)

# Default target
all: quad logs objdir backend cli $(SYMLINKS) frontend.a GroundStation manualassist

quad:
	$(MAKE) -C ../quad

$(SYMLINKS): $(CLIBINARY)
	$(foreach symlink, $(SYMLINKS), ln -s $(CLIBINARY) $(symlink);)

vrpn: vrpn/build

frontend.a: $(FECOBJECTS)
	ar rvs frontend.a $(wildcard $(OBJDIR)/frontend_*.o)

cli:  $(CLIOBJECTS) $(FECOBJECTS)
	$(GCC) $(CFLAGS) $^ -o $(CLIBINARY) $(INCLUDES) $(LIBS)

$(CLIOBJECTS) : $(OBJDIR)/%.o : $(CLISRCDIR)/%.c
	$(GCC)  $(CFLAGS) -c $^ -o $@ $(INCLUDES) $(LIBS)

backend: $(BECPPOBJECTS) $(BECOBJECTS)
	$(GXX) $(CXXFLAGS) $^ -o $(BEBINARY) $(INCLUDES) $(LIBS)

$(FECOBJECTS) : $(OBJDIR)/%.o : $(FESRCDIR)/%.c
	$(GCC)  $(CFLAGS) -c $^ -o $@ $(INCLUDES) $(LIBS)

$(BECOBJECTS) : $(OBJDIR)/%.o : $(BESRCDIR)/%.c
	$(GCC)  $(CFLAGS) -c $^ -o $@ $(INCLUDES) $(LIBS)

$(BECPPOBJECTS) : $(OBJDIR)/%.o : $(BESRCDIR)/%.cpp
	$(GXX)  $(CXXFLAGS) -c $^ -o $@ $(INCLUDES) $(LIBS)

manualassist: $(MAOBJECTS) $(FECOBJECTS)
	$(GCC) $(CFLAGS) $^ -o $(MABINARY) $(INCLUDES) $(LIBS)

$(MAOBJECTS) : $(OBJDIR)/%.o : $(MASRCDIR)/%.c
	$(GCC)  $(CFLAGS) -c $^ -o $@ $(INCLUDES) $(LIBS)

vrpn/build:
	mkdir -p src/vrpn/build
	cd src/vrpn/build && cmake .. && make

GroundStation:
	cd gui/MicroCART && qmake
	cd gui/MicroCART && make
	ln -s gui/MicroCART/MicroCART GroundStation

logs:
	mkdir -p logs

objdir:
	mkdir -p obj

clean_logs:
	rm -f logs/*

clean:
	rm -rf $(OBJDIR)/ $(BEBINARY) $(CLIBINARY) $(SYMLINKS) $(MABINARY)

debug: