##################################################
# Makefile for building lib and main test routine#
##################################################
LOCATION=DEBIAN_7
#LOCATION=DEBIAN_6 
#LOCATION=OSX_10_8

SYSTEM = $(shell uname -s)

CXX            = g++
CC             = gcc

#PRODORDEV += -O2
PRODORDEV += -ggdb3 

CXXFLAGS = $(PRODORDEV) -Wall -Wpointer-arith -Wcast-qual -D_REENTRANT -fPIC 
CPPFLAGS = -fPIC -D_GNU_SOURCE  -D$(LOCATION)
CXXFLAGS += -D_GNU_SOURCE -O0 -D$(LOCATION)

ifeq ($(LOCATION),DEBIAN_7)
XALAN_LIB_DIR = /usr/local/lib/
XALAN_LIB = xalan-c
XALAN_INC_DIR = /usr/local/include/xalanc
XERCES_LIB_DIR = /usr/local/lib/
XERCES_LIB = xerces-c
XERCES_INC_DIR = /usr/local/include/xercesc
endif
ifeq ($(LOCATION),DEBIAN_6)
XALAN_LIB_DIR = /usr/lib/
XALAN_LIB = xalan-c
XALAN_INC_DIR = /usr/include/xalanc
XERCES_LIB_DIR = /usr/lib/
XERCES_LIB = xerces-c
XERCES_INC_DIR = /usr/include/xercesc
endif
ifeq ($(LOCATION),OSX_10_8)
XALAN_LIB_DIR = /opt/local/lib/
XALAN_LIB = xalan-c
XALAN_INC_DIR = /opt/local/include/ 
XERCES_LIB_DIR = /opt/local/lib/
XERCES_LIB = xerces-c
XERCES_INC_DIR = /opt/local/include/ 
endif

include xml-deps.mk

##### Set this to the location of the library to be produced

BUILD_LIB_DIR = lib
BUILD_OBJ_DIR = build

###### Include Paths

INCLUDE_DIR = -I . -I $(XERCES_INC_DIR) -I $(XALAN_INC_DIR) -I ../AusRegCliever/include -I /usr/include

build_obj_dir = $(BUILD_OBJ_DIR)

src_dirs_cpp = se se/secDNS common se/LPE session xml
src_dirs_c = config
srcs_all = $(foreach dir,$(src_dirs_cpp),$(wildcard $(dir)/*.cpp))
srcs_all += $(foreach dir,$(src_dirs_c),$(wildcard $(dir)/*.c))

srcs = $(filter-out %Test.cpp,$(srcs_all))
objs = $(foreach file,$(srcs),$(build_obj_dir)/$(basename $(notdir $(file))).o)
test_srcs = $(filter %Test.cpp,$(srcs_all))
test_objs = $(foreach file,$(test_srcs),$(build_obj_dir)/$(basename $(notdir $(file))).o)
test_execs = $(subst .o,,$(test_objs))

calc_deps = \
	$(CC) -MT '$(build_obj_dir)/$(basename $(notdir $@)).o $@' -MF $@ -MM $(CPPFLAGS) $(INCLUDE_DIR) $<

all: dirs $(objs) $(BUILD_LIB_DIR)/libACTK1_0.so  

%.d: %.c
	$(calc_deps)
%.d: %.cpp
	$(calc_deps)
include $(foreach name,$(srcs_all),$(basename $(name)).d)

vpath %.cpp ./ \
			./se\
			./xsd2xml \
			./se/LPE \
			./se/secDNS\
			./xml\
			./common\
			./session\

vpath %.c ./config

vpath %.o 	../build

####### Implicit rules

.SUFFIXES: .cpp .c

$(BUILD_OBJ_DIR)/%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c -o $@ $(INCLUDE_DIR) $<

$(BUILD_OBJ_DIR)/%.o: %.c
	$(CC) $(CPPFLAGS) -c -o $@ $(INCLUDE_DIR) $<


ARTKLIBS = -L$(BUILD_LIB_DIR) -lACTK1_0 \
				-L$(XALAN_LIB_DIR) -lxalan-c -lxalanMsg  \
				-L$(XERCES_LIB_DIR) -lxerces-c \
				-lssl \
				-lrt  -llog4cpp

$(BUILD_OBJ_DIR)/%: $(BUILD_OBJ_DIR)/%.o
	$(CXX) $(ARTKLIBS) -o $@ $<

.PHONY: doc clean dclean

#
# The toolkit raises the c++ "static initialization fiasco" situation. Use this as needed
#
#ARTKOBJS= build/XMLGregorianCalendar.o   build/XMLParser.o build/XMLWriter.o build/ACSession.o  build/DomainAddRem.o    build/EnumDomainInfoResponse.o   build/log.o                                  build/PostalInfoType.o                 build/SessionManagerPropertiesImpl.o \
#build/RegistrantObjectType.o build/mdLogger.o \
#build/AddRemType.o                        build/DomainCheckResponse.o                 build/EnumDomainUpdateCommand.o  build/LPECheckResponse.o                     build/Properties.o                     build/SessionPoolImpl.o \#build/boolean.o                           build/DomainCreateCommand.o                 build/EnumType.o                 build/LPECreateCommand.o                     build/ProtocolExtensionCommand.o       build/SSLException.o \
#build/CertificateUserMismatchException.o  build/DomainCreateResponse.o                build/EPPDateFormatter.o         build/LPECreateResponse.o                    build/ReceiveSE.o                      build/StandardCommandType.o \
#build/CheckResponse.o                     build/DomainInfoKVResponseExtension.o       build/EPPWriter.o                build/NamespaceResolver.o                               build/StandardObjectType.o \
#build/CLTRID.o                            build/DomainInfoResponse.o                  build/ErrorPkg.o                 build/NAPTR.o                                build/RegistrantTransferCommandType.o  build/StringUtils.o \
#build/CommandCounter.o                    build/DomainKVCommandExtension.o            build/Greeting.o                 build/NotificationResponse.o                 build/ResponseExtension.o              build/SyncExtension.o \
#build/Command.o                           build/DomainNotificationResponse.o          build/HostAddRem.o               build/ObjectCommand.o                        build/Response.o                       build/SystemProperties.o \
#build/config.o                            build/DomainRegistrantTransferCommand.o     build/HostCheckResponse.o                        build/ResultCounter.o                  build/Timer.o \
#build/Constants.o                         build/DomainRegistrantTransferResponse.o    build/HostCreateCommand.o               build/Result.o                         build/TLSContext.o \
#build/ContactCheckResponse.o              build/DomainRenewCommand.o                  build/HostCreateResponse.o       build/LPEDomainObjectType.o                  build/SecDNSChgType.o                  build/TLSSession.o \
#build/ContactCreateCommand.o              build/DomainRenewResponse.o                 build/HostInfoResponse.o             build/SecDNSDSData.o                   build/TLSSocket.o \
#build/ContactCreateResponse.o             build/DomainSecDNSCreateCommandExtension.o  build/HostUpdateCommand.o           build/SecDNSDSOrKeyType.o              build/TransferCommand.o \
#build/ContactInfoResponse.o               build/DomainSecDNSInfoResponseExtension.o   build/InetAddress.o              build/LPEExtension.o                         build/SecDNSExtension.o                build/TransferOp.o \
#build/ContactNotificationResponse.o       build/DomainSecDNSUpdateCommandExtension.o  build/InfoResponse.o             build/LPELPECreateCommand.o                  build/SecDNSKeyData.o                  build/TransferResponse.o \
#build/ContactTransferResponse.o           build/DomainTransferResponse.o              build/init.o                     build/Period.o                               build/SecDNSRemType.o                  build/UserPassMismatchException.o \
#build/ContactUpdateCommand.o              build/DomainUpdateCommand.o                 build/IPVersion.o                build/PeriodUnit.o                           build/SendSE.o                         build/XMLDocument.o \
#build/CreateResponse.o                    build/DomainUpdateSyncCommandExtension.o    build/KVExtension.o              build/PollOperation.o                        build/SessionFactory.o                  \
#build/DataResponse.o                      build/E164Extension.o                       build/Logger.o                   build/PollResponse.o                         build/SessionManagerFactory.o           \
#build/Disclose.o                          build/EnumDomainCreateCommand.o             build/LoginCommand.o             build/PostalInfo.o                           build/SessionManagerImpl.o             


.PHONY: tests
tests: all $(test_execs)


.PHONY: dirs
dirs:
	-mkdir -p $(BUILD_LIB_DIR)
	-mkdir -p $(BUILD_OBJ_DIR)
	
libACTK1_0.so: 	
$(BUILD_LIB_DIR)/libACTK1_0.so:  $(objs)
	$(CXX) $(LDFLAGS) $(PRODORDEV) -shared $(objs) -o $@
	
xsd2xml: 	
$(BUILD_OBJ_DIR)/xsd2xml:  build/parser.o  
	$(CXX) build/parser.o -o build/xsd2xml -o $@

doc:
	doxygen etc/Doxyfile

clean:
	$(RM) $(objs) $(BUILD_LIB_DIR)/libACTK1_0.so *~
	$(RM) -r $(BUILD_OBJ_DIR)
	$(RM) -r $(BUILD_LIB_DIR)

dclean:
	$(MAKE) clean
	$(RM) */*.d