COMPILER=g++
COMMON=../common
COMMON_INCLUDE=../common/include
INCLUDE=./include
COMPILER_INCLUDE=../compiler/include
COMPILER_SRC=../compiler/src
ALLOCATOR_INCLUDE=../allocator/include
ALLOCATOR_SRC=../allocator
ALLOCATOR_OBJ=../allocator
BIN=../../bin

#compilation flags
CFLAGS=  -I${COMMON_INCLUDE} -I${INCLUDE} -I${COMPILER_INCLUDE} -I${ALLOCATOR_INCLUDE} -Wall -gstabs -g

ifeq ($(DEBUG),y)
CFLAGS += -g -D_DEBUG
FLAGS = DEBUG=y
else
CFLAGS += -g
endif

#library flags 
LIBS=-L../libxml2/lib  -lm -lpthread -g

#------Allocator Libs --------------------------
OBJ_DIR = ../allocator/obj

ALLOCATOR_LIBS=		${OBJ_DIR}/main/user_params.o ${OBJ_DIR}/main/interface.o  \
		${OBJ_DIR}/submain/balance.o ${OBJ_DIR}/submain/divide.o ${OBJ_DIR}/submain/submain.o \
		${OBJ_DIR}/input/input_assign.o \
		${OBJ_DIR}/input/check_input.o ${OBJ_DIR}/input/input.o ${OBJ_DIR}/input/input_geom.o \
		${OBJ_DIR}/input/input_graph.o ${OBJ_DIR}/input/read_params.o ${OBJ_DIR}/input/reflect_input.o \
		${OBJ_DIR}/input/read_val.o \
		${OBJ_DIR}/graph/check_graph.o ${OBJ_DIR}/graph/free_graph.o \
		${OBJ_DIR}/graph/reformat.o ${OBJ_DIR}/graph/subgraph.o ${OBJ_DIR}/graph/graph_out.o \
		${OBJ_DIR}/inertial/eigenvec2.o ${OBJ_DIR}/inertial/eigenvec3.o ${OBJ_DIR}/inertial/inertial.o \
		${OBJ_DIR}/inertial/inertial1d.o ${OBJ_DIR}/inertial/inertial2d.o \
		${OBJ_DIR}/inertial/inertial3d.o ${OBJ_DIR}/inertial/make_subgeom.o \
		${OBJ_DIR}/klspiff/buckets.o ${OBJ_DIR}/klspiff/buckets_bi.o ${OBJ_DIR}/klspiff/buckets1.o \
		${OBJ_DIR}/klspiff/bilistops.o ${OBJ_DIR}/klspiff/coarsen_kl.o ${OBJ_DIR}/klspiff/count_weights.o \
		${OBJ_DIR}/klspiff/compress_ewgts.o ${OBJ_DIR}/klspiff/kl_init.o ${OBJ_DIR}/klspiff/kl_output.o \
		${OBJ_DIR}/klspiff/klspiff.o ${OBJ_DIR}/klspiff/make_bndy_list.o \
		${OBJ_DIR}/klspiff/make_kl_list.o ${OBJ_DIR}/klspiff/nway_kl.o \
		${OBJ_DIR}/klvspiff/bpm_improve.o ${OBJ_DIR}/klvspiff/bucketsv.o \
		${OBJ_DIR}/klvspiff/clear_dvals.o ${OBJ_DIR}/klvspiff/coarsen_klv.o \
		${OBJ_DIR}/klvspiff/countup_vtx_sep.o ${OBJ_DIR}/klvspiff/find_bndy.o ${OBJ_DIR}/klvspiff/flow.o \
		${OBJ_DIR}/klvspiff/klv_init.o ${OBJ_DIR}/klvspiff/klvspiff.o ${OBJ_DIR}/klvspiff/make_bpgraph.o \
		${OBJ_DIR}/klvspiff/make_sep_list.o ${OBJ_DIR}/klvspiff/matching.o ${OBJ_DIR}/klvspiff/nway_klv.o \
		${OBJ_DIR}/klvspiff/flatten.o \
		${OBJ_DIR}/coarsen/coarsen.o ${OBJ_DIR}/coarsen/interpolate.o ${OBJ_DIR}/coarsen/makefgraph.o \
		${OBJ_DIR}/coarsen/makeccoords.o \
		${OBJ_DIR}/coarsen/coarsen1.o ${OBJ_DIR}/coarsen/makev2cv.o \
		${OBJ_DIR}/coarsen/maxmatch.o ${OBJ_DIR}/coarsen/maxmatch1.o ${OBJ_DIR}/coarsen/maxmatch2.o \
		${OBJ_DIR}/coarsen/maxmatch3.o ${OBJ_DIR}/coarsen/maxmatch4.o ${OBJ_DIR}/coarsen/maxmatch5.o \
		${OBJ_DIR}/connect/add_edges.o ${OBJ_DIR}/connect/connected.o ${OBJ_DIR}/connect/find_edges.o \
		${OBJ_DIR}/eigen/bidir.o ${OBJ_DIR}/eigen/bisect.o ${OBJ_DIR}/eigen/checkeig.o \
		${OBJ_DIR}/eigen/checkeig_ext.o \
		${OBJ_DIR}/eigen/checkorth.o ${OBJ_DIR}/eigen/cksturmcnt.o ${OBJ_DIR}/eigen/mkeigvecs.o\
		${OBJ_DIR}/eigen/eigensolve.o ${OBJ_DIR}/eigen/get_extval.o ${OBJ_DIR}/eigen/get_ritzvals.o \
		${OBJ_DIR}/eigen/lanczos_FO.o ${OBJ_DIR}/eigen/lanczos_SO.o ${OBJ_DIR}/eigen/lanczos_SO_float.o \
		${OBJ_DIR}/eigen/lanczos_ext.o ${OBJ_DIR}/eigen/lanczos_ext_float.o ${OBJ_DIR}/eigen/lanc_seconds.o\
		${OBJ_DIR}/eigen/lanpause.o ${OBJ_DIR}/eigen/makeorthlnk.o ${OBJ_DIR}/eigen/mkscanlist.o \
		${OBJ_DIR}/eigen/orthog1.o ${OBJ_DIR}/eigen/orthogonalize.o ${OBJ_DIR}/eigen/orthogvec.o \
		${OBJ_DIR}/eigen/ql.o ${OBJ_DIR}/eigen/rqi.o ${OBJ_DIR}/eigen/rqi_ext.o ${OBJ_DIR}/eigen/scale_diag.o \
		${OBJ_DIR}/eigen/scanmax.o ${OBJ_DIR}/eigen/scanmin.o ${OBJ_DIR}/eigen/solistout.o \
                ${OBJ_DIR}/eigen/sorthog.o ${OBJ_DIR}/eigen/splarax.o ${OBJ_DIR}/eigen/sturmcnt.o \
		${OBJ_DIR}/eigen/Tevec.o ${OBJ_DIR}/eigen/tri_solve.o ${OBJ_DIR}/eigen/warnings.o \
		${OBJ_DIR}/symmlq/aprod.o ${OBJ_DIR}/symmlq/msolve.o ${OBJ_DIR}/symmlq/pow_dd.o \
		${OBJ_DIR}/symmlq/symmlq.o ${OBJ_DIR}/symmlq/symmlqblas.o \
		${OBJ_DIR}/tinvit/tinvit.o ${OBJ_DIR}/tinvit/pythag.o ${OBJ_DIR}/tinvit/epslon.o \
		${OBJ_DIR}/optimize/determinant.o ${OBJ_DIR}/optimize/func2d.o \
		${OBJ_DIR}/optimize/func3d.o ${OBJ_DIR}/optimize/opt2d.o ${OBJ_DIR}/optimize/opt3d.o \
		${OBJ_DIR}/assign/assign.o ${OBJ_DIR}/assign/assign_out.o ${OBJ_DIR}/assign/mapper.o \
		${OBJ_DIR}/assign/median.o ${OBJ_DIR}/assign/merge_assign.o \
		${OBJ_DIR}/assign/rec_median.o ${OBJ_DIR}/assign/rotate.o ${OBJ_DIR}/assign/y2x.o \
		${OBJ_DIR}/bpmatch/checkbp.o ${OBJ_DIR}/bpmatch/inits2d.o ${OBJ_DIR}/bpmatch/inits3d.o \
		${OBJ_DIR}/bpmatch/genvals2d.o ${OBJ_DIR}/bpmatch/genvals3d.o ${OBJ_DIR}/bpmatch/map2d.o \
		${OBJ_DIR}/bpmatch/map3d.o ${OBJ_DIR}/bpmatch/movevtxs.o \
		${OBJ_DIR}/bpmatch/sorts2d.o ${OBJ_DIR}/bpmatch/sorts3d.o \
		${OBJ_DIR}/refine_map/compute_cube_edata.o ${OBJ_DIR}/refine_map/compute_cube_vdata.o \
		${OBJ_DIR}/refine_map/refine_cube.o ${OBJ_DIR}/refine_map/update_cube_edata.o \
		${OBJ_DIR}/refine_map/update_cube_vdata.o ${OBJ_DIR}/refine_map/find_edge_cube.o \
		${OBJ_DIR}/refine_map/init_cube_edata.o ${OBJ_DIR}/refine_map/compute_mesh_edata.o \
		${OBJ_DIR}/refine_map/compute_mesh_vdata.o ${OBJ_DIR}/refine_map/find_edge_mesh.o \
		${OBJ_DIR}/refine_map/init_mesh_edata.o ${OBJ_DIR}/refine_map/refine_mesh.o \
		${OBJ_DIR}/refine_map/update_mesh_edata.o ${OBJ_DIR}/refine_map/update_mesh_vdata.o \
		${OBJ_DIR}/refine_map/refine_map.o ${OBJ_DIR}/refine_map/make_comm_graph.o \
		${OBJ_DIR}/refine_part/refine_part.o ${OBJ_DIR}/refine_part/kl_refine.o \
		${OBJ_DIR}/refine_part/make_maps_ref.o ${OBJ_DIR}/refine_part/make_terms_ref.o \
		${OBJ_DIR}/internal/force_internal.o ${OBJ_DIR}/internal/improve_internal.o \
		${OBJ_DIR}/internal/check_internal.o \
		${OBJ_DIR}/misc/define_subcubes.o ${OBJ_DIR}/misc/define_submeshes.o \
		${OBJ_DIR}/misc/divide_procs.o ${OBJ_DIR}/misc/merge_goals.o ${OBJ_DIR}/misc/make_term_props.o \
		${OBJ_DIR}/misc/count.o ${OBJ_DIR}/misc/countup.o ${OBJ_DIR}/misc/countup_cube.o \
		${OBJ_DIR}/misc/countup_mesh.o ${OBJ_DIR}/misc/make_subgoal.o \
		${OBJ_DIR}/misc/find_maxdeg.o ${OBJ_DIR}/misc/make_maps.o ${OBJ_DIR}/misc/make_setlists.o \
		${OBJ_DIR}/misc/sequence.o ${OBJ_DIR}/misc/perturb.o ${OBJ_DIR}/misc/simple_part.o \
		${OBJ_DIR}/misc/time_kernels.o ${OBJ_DIR}/misc/timing.o \
		${OBJ_DIR}/util/affirm.o ${OBJ_DIR}/util/array_alloc_2D.o ${OBJ_DIR}/util/bit_reverse.o \
		${OBJ_DIR}/util/checkpnt.o ${OBJ_DIR}/util/cpvec.o ${OBJ_DIR}/util/dot.o \
		${OBJ_DIR}/util/doubleout.o ${OBJ_DIR}/util/input_int.o ${OBJ_DIR}/util/gray.o \
		${OBJ_DIR}/util/machine_params.o ${OBJ_DIR}/util/makevwsqrt.o ${OBJ_DIR}/util/mkvec.o ${OBJ_DIR}/util/norm.o \
                ${OBJ_DIR}/util/normalize.o ${OBJ_DIR}/util/mergesort.o \
                ${OBJ_DIR}/util/randomize.o ${OBJ_DIR}/util/smalloc.o ${OBJ_DIR}/util/bail.o \
		${OBJ_DIR}/util/scadd.o ${OBJ_DIR}/util/seconds.o ${OBJ_DIR}/util/setvec.o ${OBJ_DIR}/util/shell_sort.o \
		${OBJ_DIR}/util/strout.o ${OBJ_DIR}/util/tri_prod.o ${OBJ_DIR}/util/true_or_false.o \
		${OBJ_DIR}/util/update.o  ${OBJ_DIR}/util/vecout.o ${OBJ_DIR}/util/vecran.o \
                ${OBJ_DIR}/util/vecscale.o 



#------Allocator Libs --------------------------


all : compiler common.o StringTokenizer.o allocator group-manager

compiler : 
	$(MAKE) ${FLAGS} -C ${COMPILER_SRC}

common.o :  ${COMMON}/common.C ${COMMON_INCLUDE}/common.h 
	${COMPILER} ${CFLAGS}  ${COMMON}/common.C -c

StringTokenizer.o:  ${COMMON}/StringTokenizer.C ${COMMON_INCLUDE}/StringTokenizer.h
	${COMPILER} ${CFLAGS}  ${COMMON}/StringTokenizer.C -c

allocator :
	$(MAKE) ${FLAGS} nograph  -C ${ALLOCATOR_SRC}

group-manager : compiler common.o StringTokenizer.o allocator V-NetServer.o UserRequest.o FileGenConsts.o FileGenerationHelper.o PTGenerator.o ServerHelper.o GrpResourceMgr.o RequestHandler.o VirtualNetworks.o NetworkId.o
	${COMPILER} -Wall -gstabs -g ${LIBS}  common.o V-NetServer.o UserRequest.o FileGenConsts.o FileGenerationHelper.o PTGenerator.o ServerHelper.o StringTokenizer.o GrpResourceMgr.o RequestHandler.o VirtualNetworks.o NetworkId.o \
	${COMPILER_SRC}/Interface.o ${COMPILER_SRC}/Hub.o  ${COMPILER_SRC}/Host.o ${COMPILER_SRC}/Switch.o ${COMPILER_SRC}/VM.o ${COMPILER_SRC}/MACGenerationHelper.o \
	${COMPILER_SRC}/VInf.o  ${COMPILER_SRC}/Parser.tab.o ${COMPILER_SRC}/Lex.lex.o ${COMPILER_SRC}/driver.o \
	${ALLOCATOR_OBJ}/Node.o ${ALLOCATOR_OBJ}/Network.o ${ALLOCATOR_OBJ}/VMLoad.o ${ALLOCATOR_OBJ}/Allocate.o ${ALLOCATOR_OBJ}/part.o ${ALLOCATOR_LIBS} -o group-manager

	cp group-manager ${BIN}


V-NetServer.o: V-NetServer.C
	${COMPILER} ${CFLAGS}  V-NetServer.C -c

PTGenerator.o: PTGenerator.C ${INCLUDE}/PTGenerator.h
	${COMPILER} ${CFLAGS}  PTGenerator.C -c	

FileGenerationHelper.o: FileGenerationHelper.C ${INCLUDE}/FileGenerationHelper.h
	${COMPILER} ${CFLAGS}  FileGenerationHelper.C -c	

FileGenConsts.o: FileGenConsts.C ${INCLUDE}/FileGenConsts.h
	${COMPILER} ${CFLAGS}  FileGenConsts.C -c	

ServerHelper.o: ServerHelper.C ${INCLUDE}/ServerHelper.h
	${COMPILER} ${CFLAGS}  ServerHelper.C -c	

NetworkId.o : NetworkId.C ${INCLUDE}/NetworkId.h
	${COMPILER} ${CFLAGS} NetworkId.C -c

VirtualNetworks.o : VirtualNetworks.C ${INCLUDE}/VirtualNetworks.h
	${COMPILER} ${CFLAGS} VirtualNetworks.C -c

RequestHandler.o: RequestHandler.C ${INCLUDE}/RequestHandler.h
	${COMPILER} ${CFLAGS}  RequestHandler.C -c

GrpResourceMgr.o: ${COMMON}/GrpResourceMgr.C ${COMMON_INCLUDE}/GrpResourceMgr.h
	${COMPILER} ${CFLAGS}  ${COMMON}/GrpResourceMgr.C -c

UserRequest.o:  ${COMMON}/UserRequest.C ${COMMON_INCLUDE}/UserRequest.h
	${COMPILER} ${CFLAGS}  ${COMMON}/UserRequest.C -c


clean : allocator_clean 
	rm -f *.o   group-manager
	rm -f ${COMPILER_SRC}/*.o

allocator_clean:
	$(MAKE) clean -C ${ALLOCATOR_SRC}

docs:
	doxygen ../conf/vnet.conf 2> /dev/null

test :  VirtualNetworks.o test.C
	${COMPILER} ${CFLAGS}  VirtualNetworks.o -o test test.C
