BIN =      ../../bin
CC =            gcc
GPP =           g++
CFLAGS =        -O2 -c -g
OFLAGS =        -O2
DEBUG_L = -g
OBJ_DIR = obj

INCLUDE = -Iinclude/ -I../compiler/include -I../common/include

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

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 

COMMON_LIBS=	../server/common.o ../server/StringTokenizer.o


all : Node.o VMLoad.o Network.o Allocate.o daemon

graph: ./graph_partition/code/Makefile
	${MAKE} -C ./graph_partition/code

part.o:
	${CC} ${INCLUDE} ${CFLAGS} ${DEBUG_L} ${LIBS} -lm graph_partition_interface.c -o part.o

Node.o : Node.C
	${GPP} ${INCLUDE} ${CFLAGS} ${DEBUG_L} -o $@ $?

VMLoad.o : VMLoad.C 
	${GPP} ${INCLUDE} ${CFLAGS} ${DEBUG_L} -o $@ $? 
	
Network.o : Network.C 
	${GPP} ${INCLUDE} ${CFLAGS} ${DEBUG_L} -o $@  $?

Allocate.o : Allocate.C Network.o Node.o part.o
	${GPP} ${INCLUDE} ${CFLAGS} ${DEBUG_L} -o $@  $? Network.o Node.o part.o 

nograph: Node.o VMLoad.o Network.o Allocate.o daemon

test : test.C
	g++ -lm -g -I../compiler/include/ -Iinclude test.C -o test Network.o part.o Node.o Allocate.o ../compiler/src/Host.o ../compiler/src/VInf.o ../compiler/src/Hub.o ../compiler/src/Interface.o ../compiler/src/VM.o  ../compiler/src/MACGenerationHelper.o VMLoad.o ${LIBS} ${COMMON_LIBS}

daemon : server.cpp Allocate.o ../compiler/src/driver.o
	g++ -lm -lpthread -g -I../compiler/include/ -Iinclude -I../common/include -I../server/include/ server.cpp -o daemon Network.o part.o Node.o Allocate.o ../compiler/src/Switch.o ../compiler/src/Host.o ../compiler/src/VInf.o ../compiler/src/Hub.o ../compiler/src/Interface.o ../compiler/src/VM.o ../compiler/src/MACGenerationHelper.o ../compiler/src/Parser.tab.o ../compiler/src/Lex.lex.o ../compiler/src/driver.o VMLoad.o ${LIBS} ${COMMON_LIBS}
	g++ -o client test_client.cpp
	cp  daemon ${BIN}

clean : 
	rm -rf test daemon client *.o *~ \#* include/*~ include/\#*

clean_graph : ./graph_partition/code/Makefile
	${MAKE} clean  -C ./graph_partition/code

clean_all:
	rm -rf test daemon client *.o *~
	rm -rf obj
