CXX = g++
CXXFLAGS = -std=c++1z -Wall  
CXXFLAGSLIB = -std=c++1z -Wall -Wextra -fPIC -fpermissive
LDFLAGS = -shared
LIB = librow.so
LIB2 = libprocessor2.so
LIB3= libutila.so
TESTAPP = program
EXECS = static_scheduler dynamic_scheduler chunk_scheduler chunk_steal_scheduler adaptive_scheduler aimd
LIBS = -I/usr/include/opencv -lopencv_core -lopencv_imgcodecs -lopencv_videoio -lboost_chrono -lboost_system -lboost_thread -lpthread 

all: $(LIB) $(LIB2) $(LIB3) $(TESTAPP) $(EXECS) 

# Build object file
#	$(CXX) $(CXXFLAGS) -c row.cpp -o row.o
row.o: row.cpp row.hpp
	$(CXX) $(CXXFLAGSLIB) -c $< -o $@

# Build shared library
#	$(CXX) $(LDFLAGS) row.o -o $(LIB)
$(LIB): row.o
	$(CXX) $(LDFLAGS) $< -o $(LIB)
#Process library
processor.o: processor.cpp
	$(CXX) $(CXXFLAGSLIB) -c $< -o $@
$(LIB2): processor.o
	$(CXX) $(LDFLAGS) $< -o $(LIB2) $(LIBS)
#UTILIZATION LIBRARY
utilization_monitor.o: utilization_monitor.cpp
	$(CXX) $(CXXFLAGSLIB) -c $< -o $@
$(LIB3): utilization_monitor.o
	$(CXX) $(LDFLAGS) $< -o $(LIB3) $(LIBS)

# Build executable for row sorting
$(TESTAPP): main.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $(TESTAPP)

#Static Sched
static_scheduler:static_scheduler.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LIBS) -lrow -lprocessor2
#Dynamic Sched
dynamic_scheduler:dynamic_scheduler.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LIBS) -lrow -lprocessor2
#Chunk Sched
chunk_scheduler:chunk_scheduler.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LIBS) -lrow -lprocessor2
#Chunk steal Sched
chunk_steal_scheduler:chunk_steal_scheduler.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LIBS) -lrow -lprocessor2
#Guided Scheduler
guided_scheduler:guided_scheduler.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LIBS) -lrow -lprocessor2
#Adaptive Scheduler
adaptive_scheduler:adaptive_scheduler.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LIBS) -lrow -lprocessor2 -lutila
#AIMD Utilization scheduler
aimd:aimd.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LIBS) -lrow -lprocessor2 -lutila
clean:
	rm -f *.o *.so $(APP)
