# A sample Makefile for building Google Test and using it in user
# tests.  Please tweak it to suit your environment and project.  You
# may want to move it to your project's root directory.
#
# SYNOPSIS:
#
#   make [all]  - makes everything.
#   make TARGET - makes the given target.
#   make clean  - removes all files generated by make.

# Please tweak the following variable definitions as needed by your
# project, except GTEST_HEADERS, which you can use in your own targets
# but shouldn't modify.

# Points to the root of Google Test, relative to where this file is.
# Remember to tweak this if you move this file.
GTEST_DIR = .

# Where to find user code.
USER_DIR = ..

# Flags passed to the preprocessor.
CPPFLAGS += -I$(GTEST_DIR) \
				-I$(USER_DIR) \
				-I$(USER_DIR)/cryptopp \
				-I$(USER_DIR)/leveldb/include \
				-L$(USER_DIR) \
				-L$(USER_DIR)/cryptopp \
				-L$(USER_DIR)/leveldb \
				-D__STDC_LIMIT_MACROS \
				-D_DEBUG \
				-g \
				-fprofile-arcs \
				-ftest-coverage \
				--coverage 
				#-O2 \

HEADERS += 	$(USER_DIR)/BinaryData.h \
		 		$(USER_DIR)/BtcUtils.h \
		 		$(USER_DIR)/BlockObj.h \
		 		$(USER_DIR)/StoredBlockObj.h \
		 		$(USER_DIR)/leveldb_wrapper.h \
		 		$(USER_DIR)/EncryptionUtils.h \
		 		$(USER_DIR)/PartialMerkle.h

OBJECTS += 	BinaryData.o \
		 		BtcUtils.o \
		 		BlockObj.o \
		 		StoredBlockObj.o \
		 		leveldb_wrapper.o \
		 		EncryptionUtils.o \
		 		UniversalTimer.o \
		 		leveldb_wrapper.o \
		 		BlockUtils.o \
		 		libcryptopp.a \
		 		libleveldb.a

# Flags passed to the C++ compiler.
CXXFLAGS += -g 
#CXXFLAGS += -O2 -DNDEBUG -pipe -fPIC

# All tests produced by this Makefile.  Remember to add new tests you
# created to the list.
TESTS = CppBlockUtilsTests

# All Google Test headers.  Usually you shouldn't change this
# definition.
GTEST_HEADERS = $(GTEST_DIR)/gtest.h


# House-keeping build targets.

all : $(TESTS)
	rm -rf blkfiletest fakehomedir ldbtestdir/leveldb_*

clean :
	rm -f $(TESTS) gtest.a gtest_main.a *.o *.gcda *.gcno
	rm -f libcryptopp.a libleveldb.a
# Builds gtest.a and gtest_main.a.

# Usually you shouldn't tweak such internal variables, indicated by a
# trailing _.
GTEST_SRCS_ = $(GTEST_DIR)/gtest-all.cc $(GTEST_DIR)/gtest.h 

# For simplicity and to avoid depending on Google Test's
# implementation details, the dependencies specified below are
# conservative and not optimized.  This is fine as Google Test
# compiles fast and for ordinary users its source rarely changes.
gtest-all.o : $(GTEST_SRCS_)
	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/gtest-all.cc

gtest.a : gtest-all.o
	$(AR) $(ARFLAGS) $@ $^


# Builds a sample test.  A test should link with either gtest.a or
# gtest_main.a, depending on whether it defines its own main()
# function.

#sample1.o : $(USER_DIR)/sample1.cc $(USER_DIR)/sample1.h $(GTEST_HEADERS)
	#$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1.cc
#
#sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \
                     #$(USER_DIR)/sample1.h $(GTEST_HEADERS)
	#$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1_unittest.cc
#
#sample1_unittest : sample1.o sample1_unittest.o gtest_main.a
	#$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -lpthread -o $@


libcryptopp.a: Makefile
	cd ../cryptopp; make libcryptopp.a; mv libcryptopp.a ../gtest

libleveldb.a: Makefile
	cd ../leveldb; make libleveldb.a; mv libleveldb.a ../gtest

UniversalTimer.o: $(USER_DIR)/UniversalTimer.h $(USER_DIR)/UniversalTimer.cpp
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/UniversalTimer.cpp

BinaryData.o: $(USER_DIR)/BinaryData.h $(USER_DIR)/BinaryData.cpp $(USER_DIR)/BtcUtils.h $(USER_DIR)/log.h
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/BinaryData.cpp

BtcUtils.o: $(USER_DIR)/BtcUtils.h $(USER_DIR)/BtcUtils.cpp $(USER_DIR)/log.h
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/BtcUtils.cpp

BlockObj.o: $(USER_DIR)/log.h $(USER_DIR)/BinaryData.h $(USER_DIR)/BtcUtils.h $(USER_DIR)/BlockObj.h $(USER_DIR)/BlockObj.cpp
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/BlockObj.cpp

StoredBlockObj.o: $(USER_DIR)/log.h $(USER_DIR)/BtcUtils.h $(USER_DIR)/BinaryData.h $(USER_DIR)/StoredBlockObj.h $(USER_DIR)/StoredBlockObj.cpp
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/StoredBlockObj.cpp

leveldb_wrapper.o: $(USER_DIR)/log.h $(USER_DIR)/BtcUtils.h $(USER_DIR)/BinaryData.h $(USER_DIR)/leveldb_wrapper.h $(USER_DIR)/leveldb_wrapper.cpp
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/leveldb_wrapper.cpp

BlockUtils.o: $(USER_DIR)/log.h $(USER_DIR)/BlockUtils.h $(USER_DIR)/BinaryData.h $(USER_DIR)/UniversalTimer.h $(USER_DIR)/PartialMerkle.h $(USER_DIR)/BlockUtils.cpp
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/BlockUtils.cpp

EncryptionUtils.o: $(USER_DIR)/log.h $(USER_DIR)/BtcUtils.h $(USER_DIR)/BinaryData.h $(USER_DIR)/EncryptionUtils.h $(USER_DIR)/EncryptionUtils.cpp
	$(CXX) $(CPPFLAGS) -c $(USER_DIR)/EncryptionUtils.cpp


####

CppBlockUtilsTests.o : CppBlockUtilsTests.cpp $(HEADERS) $(GTEST_HEADERS)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c CppBlockUtilsTests.cpp 

getScrAddrData.o : getScrAddrData.cpp $(HEADERS) $(GTEST_HEADERS)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c getScrAddrData.cpp 

CppBlockUtilsTests : $(OBJECTS) CppBlockUtilsTests.o gtest.a
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -lpthread -lcryptopp -o $@

getScrAddrData : $(OBJECTS) getScrAddrData.o 
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -lpthread -lcryptopp -o $@


