include Makefile.in

ifeq ($(SCHEDULING_SCHEME), CAR) 

OBJFILES = $(OBJ_DIR)/tid.o $(OBJ_DIR)/memory.o $(OBJ_DIR)/wlpdstm.o $(OBJ_DIR)/transaction.o $(OBJ_DIR)/ATSScheduler.o $(OBJ_DIR)/StmScheduler.o \
	$(OBJ_DIR)/RunnerThread.o $(OBJ_DIR)/ThreadLock.o $(OBJ_DIR)/Queue.o $(OBJ_DIR)/ThreadData.o $(OBJ_DIR)/cpuid.o

else

OBJFILES = $(OBJ_DIR)/tid.o $(OBJ_DIR)/memory.o $(OBJ_DIR)/wlpdstm.o $(OBJ_DIR)/transaction.o $(OBJ_DIR)/ATSScheduler.o 

endif

#OBJFILES = $(OBJ_DIR)/tid.o $(OBJ_DIR)/memory.o $(OBJ_DIR)/helpers.o $(OBJ_DIR)/transaction.o \
#	$(OBJ_DIR)/transaction_base.o $(OBJ_DIR)/wlpdstm.o $(OBJ_DIR)/object.o

MUBENCH_OBJFILES = $(OBJ_DIR)/intset-rbtree.o

.PHONY: clean $(OBJ_DIR) $(LIB_DIR) $(INCLUDE_DIR) $(INCLUDE_OUT_FILE)

all: $(INCLUDE_OUT_FILE) $(LIB_DIR)/libwlpdstm.a $(OBJ_DIR)/intset-rbtree

###############
# create dirs #
###############

$(OBJ_DIR):
	mkdir -p $(OBJ_DIR)

$(LIB_DIR):
	mkdir -p $(LIB_DIR)

$(INCLUDE_DIR):
	mkdir -p $(INCLUDE_DIR)


#######################
# create include file #
#######################

$(INCLUDE_OUT_FILE): $(INCLUDE_DIR)
	echo "#ifndef STM_H_" > $(INCLUDE_OUT_FILE)
	echo "#define STM_H_" >> $(INCLUDE_OUT_FILE)
	echo >> $(INCLUDE_OUT_FILE)
#	$(BUILD_DIR)/create_defs.py $(LPDSTM_CPPFLAGS) >> $(INCLUDE_OUT_FILE)
	echo | awk '{input = "$(LPDSTM_CPPFLAGS)";split(input, defs, " ");for(idx in defs) if(defs[idx] != "-D") print "#define " defs[idx]}' >> $(INCLUDE_OUT_FILE)
	cat $(INCLUDE_IN_FILE) >> $(INCLUDE_OUT_FILE)
	echo >> $(INCLUDE_OUT_FILE)
	echo "#endif" >> $(INCLUDE_OUT_FILE)

##################
# create library #
##################

# create lib
$(LIB_DIR)/libwlpdstm.a: $(LIB_DIR) $(OBJFILES)
	$(AR) cru $@ $(OBJFILES)

# compile

$(OBJ_DIR)/tid.o: $(OBJ_DIR) $(STM_SRC_DIR)/tid.cc $(STM_SRC_DIR)/tid.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/tid.cc -c -o $@

$(OBJ_DIR)/memory.o: $(OBJ_DIR) $(STM_SRC_DIR)/memory.cc $(STM_SRC_DIR)/memory.h $(STM_SRC_DIR)/tid.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/memory.cc -c -o $@

$(OBJ_DIR)/wlpdstm.o: $(OBJ_DIR) $(STM_SRC_DIR)/wlpdstm.cc $(STM_SRC_DIR)/wlpdstm.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/wlpdstm.cc -c -o $@

$(OBJ_DIR)/transaction.o: $(OBJ_DIR) $(STM_SRC_DIR)/transaction.cc $(STM_SRC_DIR)/transaction.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/transaction.cc -c -o $@

$(OBJ_DIR)/ATSScheduler.o: $(OBJ_DIR) $(STM_SRC_DIR)/ATSScheduler.cc $(STM_SRC_DIR)/ATSScheduler.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/ATSScheduler.cc -c -o $@

# CAR-STM files

ifeq ($(SCHEDULING_SCHEME), CAR) 

$(OBJ_DIR)/cpuid.o: $(OBJ_DIR) $(STM_SRC_DIR)/common/cpuid.cc $(STM_SRC_DIR)/common/cpuid.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/common/cpuid.cc -c -o $@

$(OBJ_DIR)/StmScheduler.o: $(OBJ_DIR) $(CAR_SRC_DIR)/StmScheduler.cpp $(CAR_SRC_DIR)/StmScheduler.h $(CAR_SRC_DIR)/scheduler_common.h 
	$(CPP)  $(CPPFLAGS) $(CAR_SRC_DIR)/StmScheduler.cpp -c -o $@
#$(CAR_SRC_DIR)/RunnerThread.o $(CAR_SRC_DIR)/ThreadLock.o $(CAR_SRC_DIR)/Queue.o $(CAR_SRC_DIR)/ThreadData.o

$(OBJ_DIR)/RunnerThread.o: $(OBJ_DIR) $(CAR_SRC_DIR)/RunnerThread.cpp $(CAR_SRC_DIR)/RunnerThread.h $(CAR_SRC_DIR)/scheduler_common.h 
	$(CPP) $(CPPFLAGS) $(CAR_SRC_DIR)/RunnerThread.cpp -c -o $@
#$(CAR_SRC_DIR)/Queue.o $(CAR_SRC_DIR)/ThreadData.o

$(OBJ_DIR)/ThreadLock.o: $(OBJ_DIR) $(CAR_SRC_DIR)/ThreadLock.cpp $(CAR_SRC_DIR)/ThreadLock.h
	$(CPP) $(CPPFLAGS) $(CAR_SRC_DIR)/ThreadLock.cpp -c -o $@

$(OBJ_DIR)/Queue.o: $(OBJ_DIR) $(CAR_SRC_DIR)/Queue.cpp $(CAR_SRC_DIR)/Queue.h
	$(CPP) $(CPPFLAGS) $(CAR_SRC_DIR)/Queue.cpp -c -o $@

$(OBJ_DIR)/ThreadData.o: $(OBJ_DIR) $(CAR_SRC_DIR)/ThreadData.cpp $(CAR_SRC_DIR)/ThreadData.h
	$(CPP) $(CPPFLAGS) $(CAR_SRC_DIR)/ThreadData.cpp -c -o $@

endif

##################
# create mubench #
##################

$(OBJ_DIR)/intset-rbtree: $(LIB_DIR)/libwlpdstm.a $(MUBENCH_OBJFILES)
	$(CPP) $(MUBENCH_CPPFLAGS) -o $@ $^ $(MUBENCH_LDFLAGS)
	cp $(OBJ_DIR)/intset-rbtree .

$(OBJ_DIR)/intset-rbtree.o: $(OBJ_DIR) $(MUBENCH_SRC_DIR)/intset-rbtree.c
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_SRC_DIR)/intset-rbtree.c -c -o $@

################
# common tasks #
################

clean:
	rm -rf $(TARGET_DIR)
	rm -rf $(LIB_DIR)
	rm -rf $(INCLUDE_DIR)
	rm -rf intset-rbtree


