OBJ_DIR=../obj
BIN_DIR=../bin
LIB_DIR=../lib
INC_DIR=../include
AREA_INCDIR=$(AreaRootDir)/include
AREA_LIBDIR=$(AreaRootDir)/lib
AREA_BINDIR=$(AreaRootDir)/bin
LIBS_DEPEND_ON=-L$(AREA_LIBDIR) -llbtypes -llbthread -ll
INCLUDES=-I. -I$(INC_DIR) -I$(AREA_INCDIR)
#CPP=g++
#CC=gcc
#LD=g++
#LEX=flex
#YACC=bison
YFLAGS= -d

DEBUG= -g
CPPFLAGS += ${DEBUG}

PROJECT=luban 
LIBDIRS=-L$(LIB_DIR) -L$(AREA_LIBDIR)


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

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

libluban.so:  luban_lex.o luban_grammar.tab.o luban_parsetree.o lbpropertyinfo.o lbstructinterface.o luban_codegen.o lbprocessstruct.o lbstructiopadlocal.o lbstructiopadasynch.o lbrwlockedobjptr.o lbcomponentinfo.o luban_namespace.o luban_symbolresolver.o lbtypespecstruct.o lbabstractstruct.o lbstationarystruct.o lbcompositionstruct.o luban_import.o luban_implicitcast.o lblocalpropertystorage.o lbstruct.o lbstructoutpadcomp.o lbcounterwaiter.o lbns.o
		cd $(OBJ_DIR); $(LD) -shared -o $(LIB_DIR)/$@ -fPIC  $? $(LIBS_DEPEND_ON)

luban : luban_main.o libluban.so
	cd $(OBJ_DIR) ; ${CPP} -o ${BIN_DIR}/$@  luban_main.o  $(LIBDIRS) -lluban -llbtypes -llbthread

luban_grammar.tab.hpp luban_grammar.tab.cpp: luban_grammar.ypp
	$(YACC) $(YFLAGS) $<

luban_lex.c : luban_lex.l luban_grammar.tab.hpp 
	$(LEX) $(LFLAGS) $<
	mv lex.yy.c $@

headers: luban_parser.hpp luban_codegen.hpp
	 if test ! -d $(INC_DIR)/$(PROJECT) ; then { rm -f $(INC_DIR)/$(PROJECT);mkdir $(INC_DIR)/$(PROJECT); } fi ; cp $? $(INC_DIR)/$(PROJECT)


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

all: install

clean:
	\rm -f $(OBJ_DIR)/* $(BIN_DIR)/* $(LIB_DIR)/*; \rm -f $(AREA_BINDIR)/luban $(AREA_LIBDIR)/libluban.so; \rm -rf $(AREA_INCDIR)/$(PROJECT)
