CXX = g++
CXXFLAGS = -std=c++14 -Wall -O3
CXXFLAGSLIB = -std=c++14 -Wall -Wextra -fPIC -fpermissive
LDFLAGS = -lboost_thread -lboost_system -lboost_chrono -lpthread

LIB  = librow.so     
LIB3 = libutila.so    


SHM_TOOLS = shm_generator shm_print
TESTAPP   = program


BENCH = shm_benchmark


SCHED_OBJS = scheduler_iface.o \
             static_scheduler.o \
             dynamic_scheduler.o \
             chunk_scheduler.o \
             chunk_steal_scheduler.o \
             guided_scheduler.o \
             adaptive_scheduler.o \
             aimd.o

LIBS_ALL = -L. -lrow -lutila -lboost_chrono -lboost_system -lboost_thread -lpthread

all: $(SHM_TOOLS) $(LIB) $(LIB3) $(TESTAPP) $(BENCH)



shm_generator: shm_generator.cpp shm_keys.hpp
	$(CXX) $(CXXFLAGS) $< -o $@ -lpthread

shm_print: shm_print.cpp shm_keys.hpp
	$(CXX) $(CXXFLAGS) $< -o $@


row.o: row.cpp row.hpp
	$(CXX) $(CXXFLAGSLIB) -c $< -o $@

$(LIB): row.o
	$(CXX) -shared -o $(LIB) row.o

utilization_monitor.o: utilization_monitor.cpp utilization_monitor.hpp
	$(CXX) $(CXXFLAGSLIB) -c $< -o $@

$(LIB3): utilization_monitor.o
	$(CXX) -shared -o $(LIB3) utilization_monitor.o $(LDFLAGS)


scheduler_iface.o: scheduler_iface.cpp scheduler_iface.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

static_scheduler.o: static_scheduler.cpp static_scheduler.hpp scheduler_iface.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

dynamic_scheduler.o: dynamic_scheduler.cpp dynamic_scheduler.hpp scheduler_iface.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

chunk_scheduler.o: chunk_scheduler.cpp chunk_scheduler.hpp scheduler_iface.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

chunk_steal_scheduler.o: chunk_steal_scheduler.cpp chunk_steal_scheduler.hpp scheduler_iface.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

guided_scheduler.o: guided_scheduler.cpp guided_scheduler.hpp scheduler_iface.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

adaptive_scheduler.o: adaptive_scheduler.cpp adaptive_scheduler.hpp scheduler_iface.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

aimd.o: aimd.cpp aimd.hpp scheduler_iface.hpp utilization_monitor.hpp
	$(CXX) $(CXXFLAGS) -c $< -o $@



$(TESTAPP): main.cpp $(LIB)
	$(CXX) $(CXXFLAGS) $< -L. -lrow -Wl,-rpath=. -o $@ $(LDFLAGS)

$(BENCH): shm_benchmark.cpp $(SCHED_OBJS) $(LIB) $(LIB3)
	$(CXX) $(CXXFLAGS) shm_benchmark.cpp $(SCHED_OBJS) -Wl,-rpath=. $(LIBS_ALL) -o $@


clean:
	rm -f *.o *.so $(SHM_TOOLS) $(TESTAPP) $(BENCH)