include Makefile.in

OBJFILES = $(OBJ_DIR)/tid.o $(OBJ_DIR)/memory.o $(OBJ_DIR)/helpers.o $(OBJ_DIR)/transaction.o \
	$(OBJ_DIR)/transaction_base.o $(OBJ_DIR)/swisstm.o

MUBENCH_RSTM_OBJFILES = $(OBJ_DIR)/BenchMain.o $(OBJ_DIR)/Benchmark.o $(OBJ_DIR)/CGHash.o $(OBJ_DIR)/FGL.o \
	$(OBJ_DIR)/LFUCache.o $(OBJ_DIR)/LinkedList.o $(OBJ_DIR)/RandomGraphList.o $(OBJ_DIR)/RBTree.o $(OBJ_DIR)/RBTreeLarge.o

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

all: $(INCLUDE_OUT_FILE) $(LIB_DIR)/libswisstm.a $(OBJ_DIR)/rstm_mubench

###############
# 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 $(SWISSTM_CPPFLAGS) >> $(INCLUDE_OUT_FILE)
	echo | awk '{input = "$(SWISSTM_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)/libswisstm.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)/helpers.o: $(OBJ_DIR) $(STM_SRC_DIR)/common/helpers.cc $(STM_SRC_DIR)/common/helpers.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/common/helpers.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)/transaction_base.o: $(OBJ_DIR) $(STM_SRC_DIR)/transaction_base.cc $(STM_SRC_DIR)/transaction_base.h
	$(CPP) $(CPPFLAGS) $(STM_SRC_DIR)/transaction_base.cc -c -o $@

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


#######################
# create rstm mubench #
#######################

$(OBJ_DIR)/rstm_mubench: $(LIB_DIR)/libswisstm.a $(MUBENCH_RSTM_OBJFILES)
	$(CPP) $(MUBENCH_CPPFLAGS) -o $@ $^ $(MUBENCH_LDFLAGS)
	cp $(OBJ_DIR)/rstm_mubench .

$(OBJ_DIR)/BenchMain.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/BenchMain.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/BenchMain.cpp -c -o $@

$(OBJ_DIR)/Benchmark.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/Benchmark.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/Benchmark.cpp -c -o $@

$(OBJ_DIR)/CGHash.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/CGHash.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/CGHash.cpp -c -o $@

$(OBJ_DIR)/FGL.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/FGL.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/FGL.cpp -c -o $@

$(OBJ_DIR)/LFUCache.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/LFUCache.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/LFUCache.cpp -c -o $@

$(OBJ_DIR)/LinkedList.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/LinkedList.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/LinkedList.cpp -c -o $@

$(OBJ_DIR)/RandomGraphList.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/RandomGraphList.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/RandomGraphList.cpp -c -o $@

$(OBJ_DIR)/RBTree.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/RBTree.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/RBTree.cpp -c -o $@

$(OBJ_DIR)/RBTreeLarge.o: $(OBJ_DIR) $(MUBENCH_RSTM_SRC_DIR)/RBTreeLarge.cpp
	$(CPP) $(MUBENCH_CPPFLAGS) $(MUBENCH_RSTM_SRC_DIR)/RBTreeLarge.cpp -c -o $@


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

clean:
	rm -rf $(TARGET_DIR)
	rm -rf $(LIB_DIR)
	rm -rf $(INCLUDE_DIR)
	rm -rf rstm_mubench

