###############################################################################
# 
#  Copyright (c) 2005, 2006, 2007, 2008
#  University of Rochester
#  Department of Computer Science
#  All rights reserved.
# 
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
# 
#     * Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
# 
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
# 
#     * Neither the name of the University of Rochester nor the names of its
#       contributors may be used to endorse or promote products derived from
#       this software without specific prior written permission.
# 
# 
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.

# pull in all global Make variable definitions
include ../Makefile.inc

INCLUDEPATH = -I. -I../ -I../stm
STM_LIB = ../stm/obj/libstm.a
OBJFILES = $(OBJDIR)/BenchMain.o          $(OBJDIR)/Benchmark.o         \
           $(OBJDIR)/FGL.o                $(OBJDIR)/LFUCache.o          \
           $(OBJDIR)/LinkedList.o         $(OBJDIR)/LinkedListRelease.o \
           $(OBJDIR)/RandomGraphList.o    $(OBJDIR)/RBTree.o            \
           $(OBJDIR)/RBTreeLarge.o        $(OBJDIR)/CGHash.o

BM_HEADERS = LinkedListRelease.hpp FGL.hpp         Counter.hpp    \
             RandomGraphList.hpp   Hash.hpp        LinkedList.hpp \
             CGHash.hpp      LFUCache.hpp   \
             RBTree.hpp            RBTreeLarge.hpp IntSet.hpp     \
             PrivList.hpp          FeatureTest.hpp                      \
             ../stm/stm.hpp                                   \
             ../stm/api/llt_api.hpp ../stm/api/cgl_api.hpp                \
             ../stm/api/redo_lock_api.hpp  ../stm/api/rstm_api.hpp        \
             ../stm/support/atomic_ops.h  ../stm/support/hrtime.h

OBJROOT = ./obj
OBJDIR = $(OBJROOT)/$(STM_VERSION)

.PHONY: all $(OBJDIR)
all: $(OBJDIR) $(OBJROOT)/Bench_$(STM_VERSION)
	@echo "     "$(OBJROOT)/Bench_$(STM_VERSION) complete

$(OBJDIR):
	mkdir -p $@

$(OBJDIR)/BenchMain.o: BenchMain.cpp Benchmark.hpp $(BM_HEADERS) $(STM_LIB)
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/Benchmark.o: Benchmark.cpp Benchmark.hpp $(STM_LIB)
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/FGL.o: FGL.cpp FGL.hpp $(STM_LIB) IntSet.hpp Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/CGHash.o: CGHash.cpp CGHash.hpp FGL.hpp $(STM_LIB) IntSet.hpp \
                    Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/LFUCache.o: LFUCache.cpp LFUCache.hpp $(STM_LIB) Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/LinkedList.o: LinkedList.cpp LinkedList.hpp $(STM_LIB) IntSet.hpp \
                        Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/LinkedListRelease.o: LinkedListRelease.cpp LinkedListRelease.hpp \
                               $(STM_LIB) IntSet.hpp Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/RandomGraphList.o: RandomGraphList.cpp RandomGraphList.hpp \
                             $(STM_LIB) Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/RBTree.o: RBTree.cpp RBTree.hpp IntSet.hpp $(STM_LIB) Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/RBTreeLarge.o: RBTreeLarge.cpp RBTreeLarge.hpp IntSet.hpp $(STM_LIB) \
                         Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

$(OBJDIR)/SkipList.o: SkipList.cpp SkipList.hpp IntSet.hpp $(STM_LIB) \
		      Benchmark.hpp
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ -c $<

# this is the executable
$(OBJROOT)/Bench_$(STM_VERSION): $(OBJFILES) $(STM_LIB)
	$(CXX) $(CXXFLAGS) $(INCLUDEPATH) -o $@ $^ $(LDFLAGS)

# /realclean/ gets rid of everything you've built, all configurations
realclean:
	rm -rf *.s *.ii $(OBJROOT)

# /clean/ gets rid of the configuration specified by STM_VERSION
clean:
	rm -rf *.s *.ii $(OBJDIR)
