# the below does not change from projec to project
OBJ_DIR=../obj
BIN_DIR=../bin
LIB_DIR=../lib
INC_DIR=../include
AREA_INCDIR=$(AreaRootDir)/include
AREA_LIBDIR=$(AreaRootDir)/lib
LIBS_DEPEND_ON=-L$(AreaRootDir)/lib -llbthread -ldl
AREA_BINDIR=$(AreaRootDir)/bin
INCLUDES=-I. -I$(INC_DIR) -I$(AREA_INCDIR)
#CPP=g++
#LD=g++

.c.o:
	$(CC) $(INCLUDES) $(CFLAGS) -c $<
	mv $@ $(OBJ_DIR)

.cpp.o:
	$(CPP) $(INCLUDES) $(CPPFLAGS) -c $<
	mv $@ $(OBJ_DIR)


PROJECT=lbtypes
DEBUG= -g
CPPFLAGS += ${DEBUG}


liblbtypes.so: lbobject.o lbsymbol.o lbtypeinfo.o lbtypefactory.o DLLUtil.o HashUtil.o StreamUtil.o lbdouble.o lbint.o lbstring.o lbchar.o lbbool.o lbvector.o lbmap.o lbset.o lbfullsymbol.o lbtypespecbasic.o lbtypespecmultitype.o lbtypespecenum.o lbtypespecrange.o lberror.o lbtypespectypetype.o
		cd $(OBJ_DIR); $(LD) -shared -z defs -o $(LIB_DIR)/$@ -fPIC $? $(LIBS_DEPEND_ON)


headers: lbobject.hpp lbsymbol.hpp lbtypeinfo.hpp HashUtil.hpp RefCountedPtr.hpp LBDeclareMacros.hpp LBDefineMacros.hpp DLLUtil.hpp lbtypefactory.hpp lbexception.hpp lbdouble.hpp lbint.hpp StreamUtil.hpp lbvarargs.hpp lbstring.hpp lbchar.hpp lbiterator.hpp lbvector.hpp LBObjPtr.hpp lbmap.hpp lbset.hpp lbbool.hpp lbfullsymbol.hpp lbtypespec.hpp lbtypespecbasic.hpp lbtypespecmultitype.hpp lbtypespecenum.hpp lbtypespecrange.hpp lberror.hpp lbtypespectypetype.hpp LBMemberFuncTable.hpp AtomicInt.hpp
	 if test ! -e $(INC_DIR)/$(PROJECT); then { mkdir $(INC_DIR)/$(PROJECT); } fi ; cp $? $(INC_DIR)/$(PROJECT)

testlbsymbol: testlbsymbol.o liblbtypes.so
		cd $(OBJ_DIR) ; ${CPP} -o ${BIN_DIR}/$@ testlbsymbol.o -L$(LIB_DIR) -L$(AREA_LIBDIR) -llbtypes

streamout: streamout.o liblbtypes.so
		cd $(OBJ_DIR) ; ${CPP} -o ${BIN_DIR}/$@ streamout.o -L$(LIB_DIR) -L$(AREA_LIBDIR) -llbtypes  -llbthread

streamin: streamin.o liblbtypes.so
		cd $(OBJ_DIR) ; ${CPP} -o ${BIN_DIR}/$@ streamin.o -L$(LIB_DIR) -L$(AREA_LIBDIR) -llbtypes

typefactorytest: typefactorytest.o liblbtypes.so
		cd $(OBJ_DIR) ; ${CPP} -o ${BIN_DIR}/$@ typefactorytest.o -L$(LIB_DIR) -L$(AREA_LIBDIR) -llbtypes -llbthread

memberfunctest: memberfunctest.o liblbtypes.so
		cd $(OBJ_DIR) ; ${CPP} -o ${BIN_DIR}/$@ memberfunctest.o -L$(LIB_DIR) -L$(AREA_LIBDIR) -llbtypes  -llbthread

install: liblbtypes.so headers
	 cp $(LIB_DIR)/liblbtypes.so $(AREA_LIBDIR); cp $(BIN_DIR)/* $(AREA_BINDIR); cp -r $(INC_DIR)/$(PROJECT) $(AREA_INCDIR)

tests: testlbsymbol streamout streamin typefactorytest memberfunctest
	 cp $(BIN_DIR)/* $(AREA_BINDIR)

all: install tests

clean:
	\rm -f $(OBJ_DIR)/* $(BIN_DIR)/* $(LIB_DIR)/*; \rm -f $(AREA_BINDIR)/testlbsymbol $(AREA_BINDIR)/streamin $(AREA_BINDIR)/streamout $(AREA_BINDIR)/typefactorytest $(AREA_BINDIR)/memberfunctest $(AREA_LIBDIR)/liblbtypes.so; \rm -rf $(AREA_INCDIR)/$(PROJECT)

