# MOAB_DIR points to top-level install dir, below which MOAB's lib/ and include/ are located
MOAB_DIR := @prefix@
include ${MOAB_DIR}/lib/moab.make
include ${MOAB_DIR}/lib/iMesh-Defs.inc

.SUFFIXES: .o .cpp .F90

# MESH_DIR is the directory containing mesh files that come with MOAB source
MESH_DIR="@abs_top_srcdir@/MeshFiles/unittest"

EXAMPLES = HelloMOAB GetEntities SetsNTags LoadPartial structuredmesh StructuredMeshSimple DirectAccessWithHoles DirectAccessNoHoles point_in_elem_search VisTags UniformRefinement
PAREXAMPLES = HelloParMOAB ReduceExchangeTags LloydRelaxation CrystalRouterExample ReadWriteTest GenLargeMesh
EXOIIEXAMPLES = TestExodusII
F90EXAMPLES = DirectAccessNoHolesF90 PushParMeshIntoMoabF90
ERROREXAMPLES = ErrorHandlingSimulation TestErrorHandling TestErrorHandlingPar

default: ${EXAMPLES} ${PAREXAMPLES} ${EXOIIEXAMPLES} ${F90EXAMPLES} ${ERROREXAMPLES}

HelloMOAB: HelloMOAB.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

GetEntities: GetEntities.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

SetsNTags: SetsNTags.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

LloydRelaxation: LloydRelaxation.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

LoadPartial: LoadPartial.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK} ${MOAB_LIBS_LINK}

structuredmesh: structuredmesh.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

StructuredMeshSimple: StructuredMeshSimple.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

DirectAccessWithHoles: DirectAccessWithHoles.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

DirectAccessNoHoles: DirectAccessNoHoles.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

DirectAccessNoHolesF90: DirectAccessNoHolesF90.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_FC} -o $@ $< ${IMESH_LIBS}

ReduceExchangeTags: ReduceExchangeTags.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

HelloParMOAB: HelloParMOAB.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

CrystalRouterExample: CrystalRouterExample.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

TestExodusII: TestExodusII.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

point_in_elem_search: point_in_elem_search.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

PushParMeshIntoMoabF90: PushParMeshIntoMoabF90.o
	${MOAB_FC} -o $@ $< ${IMESH_LIBS}

VisTags: VisTags.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

ReadWriteTest: ReadWriteTest.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

GenLargeMesh: GenLargeMesh.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

ErrorHandlingSimulation: ErrorHandlingSimulation.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

TestErrorHandling: TestErrorHandling.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

TestErrorHandlingPar: TestErrorHandlingPar.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK} 

UniformRefinement: UniformRefinement.o ${MOAB_LIBDIR}/libMOAB.la
	${MOAB_CXX} -o $@ $< ${MOAB_LIBS_LINK}

clean:
	rm -rf *.o *.mod *.h5m ${EXAMPLES} ${PAREXAMPLES} ${EXOIIEXAMPLES} ${F90EXAMPLES} ${ERROREXAMPLES}

.cpp.o:
	${MOAB_CXX} ${CXXFLAGS} ${MOAB_CXXFLAGS} ${MOAB_CPPFLAGS} ${MOAB_INCLUDES} -DMESH_DIR=\"${MESH_DIR}\" -c $<

.F90.o:
	${IMESH_FC} ${FCFLAGS} ${IMESH_FCFLAGS} ${MOAB_CPPFLAGS} ${IMESH_INCLUDES} ${IMESH_FCDEFS} -DMESH_DIR=\"${MESH_DIR}\" -c $<

