# Modified from Roboop Makefile for GNU g++

TEKKOTSU_ROOT ?= ../..
TEKKOTSU_TARGET_MODEL ?= TGT_ERS7
ROBOOP_ROOT := $(TEKKOTSU_ROOT)/Motion/roboop
NEWMAT_ROOT := $(TEKKOTSU_ROOT)/Shared/newmat

CXX = g++
CXXFLAGS = -I $(NEWMAT_ROOT) -I $(ROBOOP_ROOT) -I $(TEKKOTSU_ROOT) -Wall -D_REENTRANT -g \
	-Wall -W -Wlarger-than-8192 -Wpointer-arith -Wcast-qual \
	-D$(TEKKOTSU_TARGET_MODEL) \

#  -O2 -frename-registers -fomit-frame-pointer -ffast-math -fno-common \

#-Wno-long-double
LIBS = -L./ -ltekkotsu -lroboop -lnewmat -lm
AR = ar
AR2= ranlib

all: test_kinematics

test_kinematics: test_kinematics.o libnewmat.a libroboop.a libtekkotsu.a
	$(CXX) test_kinematics.o $(LIBS) -g -Wall -o $@

Deprobooplib = \
   roboop/gnugraph.o   roboop/comp_dq.o   roboop/comp_dqp.o   roboop/delta_t.o \
   roboop/dynamics.o   roboop/homogen.o   roboop/kinemat.o    roboop/robot.o   \
   roboop/sensitiv.o   roboop/utils.o     roboop/quaternion.o roboop/config.o  \
   roboop/trajectory.o roboop/clik.o      roboop/controller.o roboop/invkine.o \
   roboop/control_select.o roboop/dynamics_sim.o

Depnewmatlib = \
   newmat/bandmat.o    newmat/cholesky.o   newmat/evalue.o     newmat/fft.o\
   newmat/hholder.o    newmat/jacobi.o     newmat/myexcept.o   newmat/newmat1.o\
   newmat/newmat2.o    newmat/newmat3.o    newmat/newmat4.o    newmat/newmat5.o\
   newmat/newmat6.o    newmat/newmat7.o    newmat/newmat8.o    newmat/newmat9.o\
   newmat/newmatex.o   newmat/newmatnl.o   newmat/newmatrm.o   \
   newmat/sort.o       newmat/submat.o     newmat/svd.o        newmat/newfft.o
   
Deptekkotsulib = \
   tekkotsu/Motion/Kinematics.o   tekkotsu/Motion/PostureEngine.o  \
   tekkotsu/Shared/Config.o       tekkotsu/Wireless/Socket.o       \
   tekkotsu/Shared/WorldState.o   tekkotsu/Shared/get_time.o       \
   tekkotsu/Shared/Profiler.o     tekkotsu/Events/EventBase.o      \
   tekkotsu/Shared/LoadSave.o     tekkotsu/Shared/TimeET.o

DEPENDS = $(Deptekkotsulib:.o=.d)

test_kinematics.o: $(Deproboooplib) $(Depnewmatlib) $(Deptekkotsulib)

roboop/%.o : $(ROBOOP_ROOT)/%.cpp $(Depnewmatlib)
	@if [ ! -e $(dir $@) ] ; then mkdir -p $(dir $@) ; fi
	$(CXX) -c $(CXXFLAGS) -o $@ $<

newmat/%.o : $(NEWMAT_ROOT)/%.cpp
	@if [ ! -e $(dir $@) ] ; then mkdir -p $(dir $@) ; fi
	$(CXX) -c $(CXXFLAGS) -o $@ $<

tekkotsu/%.o :
	@if [ ! -e $(dir $@) ] ; then mkdir -p $(dir $@) ; fi
	$(CXX) -c $(CXXFLAGS) -o $@ $<

%.o : %.cpp
	$(CXX) -c $(CXXFLAGS) -o $@ $<

%.d :
	@src=$(patsubst %.d,%.cc,$(patsubst tekkotsu/%,$(TEKKOTSU_ROOT)/%,$@)); \
	echo "$@..." | sed 's@.*$(TGT_BD)/@Generating @'; \
	if [ ! -e $(dir $@) ] ; then mkdir -p $(dir $@) ; fi ; \
	$(CXX) $(CXXFLAGS) -MP -MG -MT "$@" -MT "$(@:.d=.o)" -MM "$$src" > $@

ifeq ($(findstring clean,$(MAKECMDGOALS)),)
-include $(DEPENDS)
endif

libroboop.a : $(Deprobooplib)
	rm -f $@
	$(AR) rc $@ $(Deprobooplib)
	$(AR2) $@

libnewmat.a: $(Depnewmatlib)
	rm -f $@
	$(AR) rc $@ $(Depnewmatlib)
	$(AR2) $@

libtekkotsu.a: $(Deptekkotsulib)
	rm -f $@
	$(AR) rc $@ $(Deptekkotsulib)
	$(AR2) $@

roboop/controller.o: $(ROBOOP_ROOT)/controller.cpp $(ROBOOP_ROOT)/controller.h

roboop/control_select.o: $(ROBOOP_ROOT)/control_select.cpp $(ROBOOP_ROOT)/control_select.h

roboop/dynamics_sim.o: $(ROBOOP_ROOT)/dynamics_sim.cpp $(ROBOOP_ROOT)/dynamics_sim.h

roboop/trajectory.o: $(ROBOOP_ROOT)/trajectory.cpp $(ROBOOP_ROOT)/trajectory.h

roboop/clik.o :  $(ROBOOP_ROOT)/clik.cpp $(ROBOOP_ROOT)/clik.h $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/robot.o :  $(ROBOOP_ROOT)/robot.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/config.o : $(ROBOOP_ROOT)/config.cpp $(ROBOOP_ROOT)/config.h

roboop/quaternion.o : $(ROBOOP_ROOT)/quaternion.cpp $(ROBOOP_ROOT)/quaternion.h

roboop/gnugraph.o :  $(ROBOOP_ROOT)/gnugraph.cpp $(ROBOOP_ROOT)/gnugraph.h $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/comp_dq.o :  $(ROBOOP_ROOT)/comp_dq.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/comp_dqp.o :  $(ROBOOP_ROOT)/comp_dqp.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/delta_t.o :  $(ROBOOP_ROOT)/delta_t.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/dynamics.o :  $(ROBOOP_ROOT)/dynamics.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/homogen.o :  $(ROBOOP_ROOT)/homogen.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/invkine.o :  $(ROBOOP_ROOT)/invkine.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/kinemat.o :  $(ROBOOP_ROOT)/kinemat.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/sensitiv.o :  $(ROBOOP_ROOT)/sensitiv.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

roboop/utils.o :  $(ROBOOP_ROOT)/utils.cpp $(ROBOOP_ROOT)/utils.h $(ROBOOP_ROOT)/robot.h

newmat/bandmat.o :  $(NEWMAT_ROOT)/bandmat.cpp

newmat/cholesky.o :  $(NEWMAT_ROOT)/cholesky.cpp

newmat/evalue.o :  $(NEWMAT_ROOT)/evalue.cpp

newmat/fft.o :  $(NEWMAT_ROOT)/fft.cpp

newmat/newfft.o :  $(NEWMAT_ROOT)/newfft.cpp

newmat/hholder.o :  $(NEWMAT_ROOT)/hholder.cpp

newmat/jacobi.o :  $(NEWMAT_ROOT)/jacobi.cpp

newmat/myexcept.o :  $(NEWMAT_ROOT)/myexcept.cpp

newmat/newmat1.o :  $(NEWMAT_ROOT)/newmat1.cpp

newmat/newmat2.o :  $(NEWMAT_ROOT)/newmat2.cpp

newmat/newmat3.o :  $(NEWMAT_ROOT)/newmat3.cpp

newmat/newmat4.o :  $(NEWMAT_ROOT)/newmat4.cpp

newmat/newmat5.o :  $(NEWMAT_ROOT)/newmat5.cpp

newmat/newmat6.o :  $(NEWMAT_ROOT)/newmat6.cpp

newmat/newmat7.o :  $(NEWMAT_ROOT)/newmat7.cpp

newmat/newmat8.o :  $(NEWMAT_ROOT)/newmat8.cpp

newmat/newmat9.o :  $(NEWMAT_ROOT)/newmat9.cpp

newmat/newmatex.o :  $(NEWMAT_ROOT)/newmatex.cpp

newmat/newmatnl.o :  $(NEWMAT_ROOT)/newmatnl.cpp

newmat/newmatrm.o :  $(NEWMAT_ROOT)/newmatrm.cpp

newmat/sort.o :  $(NEWMAT_ROOT)/sort.cpp

newmat/submat.o :  $(NEWMAT_ROOT)/submat.cpp

newmat/svd.o :  $(NEWMAT_ROOT)/svd.cpp

clean:
	rm -f *.o *.a
	rm -rf newmat roboop tekkotsu
