# New ports collWection makefile for:	OpenFOAM
# Date created:		Sat 17 dec 2005
# Whom:			thierry@pompo.net
#
# $FreeBSD: ports/science/openfoam/Makefile,v 1.22 2008/06/06 13:59:03 edwin Exp $
#

PORTNAME=	${REALNAME:L}
PORTVERSION=	1.6
CATEGORIES=	science math
MASTER_SITES=	${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR=	foam
DISTNAME=	${REALNAME}-${PORTVERSION}.General
EXTRACT_SUFX=	.gtgz

MAINTAINER=	thierry@FreeBSD.org
COMMENT=	Open Field Operation and Manipulation - CFD Simulation Toolbox

BUILD_DEPENDS=	micod:${PORTSDIR}/devel/mico						\
		bash:${PORTSDIR}/shells/bash						\
		cmake:${PORTSDIR}/devel/cmake						\
		${LOCALBASE}/lib/libode.a:${PORTSDIR}/devel/ode				\
		${PARAVIEW_LIB}/ParaViewConfig.cmake:${PORTSDIR}/science/paraview	\
		${LOCALBASE}/diablo-jdk1.6.0/jre/lib/ext/j3dutils.jar:${PORTSDIR}/java/java3d	\
		${LOCALBASE}/include/libiberty/demangle.h:${PORTSDIR}/devel/gnulibiberty \
		${LOCALBASE}/lib/X11/fonts/freefont-ttf/FreeSans.ttf:${PORTSDIR}/x11-fonts/freefont-ttf \
		parmgridgen:${PORTSDIR}/math/parmgridgen
#		${LOCALBASE}/lib/parmetis/libmetis.a:${PORTSDIR}/math/parmetis		\
LIB_DEPENDS=	execinfo:${PORTSDIR}/devel/libexecinfo	\
		readline.6:${PORTSDIR}/devel/readline	\
		metis.1:${PORTSDIR}/math/metis
#		CGAL.0:${PORTSDIR}/math/cgal
#		vtksys.5:${PORTSDIR}/math/vtk54		\

RUN_DEPENDS=	micod:${PORTSDIR}/devel/mico						\
		dx:${PORTSDIR}/graphics/opendx						\
		${LOCALBASE}/lib/libiberty.a:${PORTSDIR}/devel/gnulibiberty		\
		${LOCALBASE}/diablo-jdk1.6.0/jre/lib/ext/j3dutils.jar:${PORTSDIR}/java/java3d	\
		paraview:${PORTSDIR}/science/paraview-devel \
		parmgridgen:${PORTSDIR}/math/parmgridgen

.if !defined(NOPORTDOCS)
BUILD_DEPENDS+=	doxygen:${PORTSDIR}/devel/doxygen	\
		dot:${PORTSDIR}/graphics/graphviz
.endif

USE_GMAKE=	yes
#USE_GCC=	3.4+	# Required to define GCC_VER
USE_GCC=	4.3	# Required to define GCC_VER
USE_JAVA=	yes
JAVA_VERSION=	1.5+
USE_GL=		yes
REINPLACE_ARGS=	-i ""

WRKSRC=		${WRKDIR}/${REALNAME}-${PORTVERSION}
PKGMESSAGE=	${WRKDIR}/pkg-message
SUB_FILES=	pkg-message
SUB_LIST=	REALNAME=${REALNAME} VER=${PORTVERSION} APPSUBDIR=${APPSUBDIR}
PLIST_SUB=	${SUB_LIST}

#MAKE_SHELL=	${CSH}
MAKE_ENV=	WM_PROJECT_DIR=${BUILD_WRKSRC} ParaView_DIR=${PARAVIEW_LIB}	\
		FOAM_INST_DIR=${PREFIX}/OpenFOAM WM_OS=Unix			\
		WM_PROJECT_INST_DIR=${PREFIX}/${REALNAME} WM_COMPILER=""	\
		WM_COMPILER_ARCH=${ARCH} WM_COMPILER_LIB_ARCH=${ARCH}		\
		WM_PROJECT_VERSION=${PORTVERSION} WM_PROJECT=${REALNAME}	\
		LD_LIBRARY_PATH="" WM_JAVAC_OPTION=${COMPOPT}			\
		WM_PROJECT_USER_DIR=${HOME}/${REALNAME} WM_ARCH=${OPSYS}	\
		MICO_VERSION=${MICO_VER} MICO_ARCH_PATH=${LOCALBASE}		\
		WM_PRECISION_OPTION=${PRECISION} WM_COMPILE_OPTION=${COMPOPT}	\
		PTHREAD_CFLAGS=${PTHREAD_CFLAGS} PTHREAD_LIBS=${PTHREAD_LIBS}	\
		ParaView_VERSION=${PARAVIEW_VER} ParaView_INST_DIR=${LOCALBASE}	\
		VTK_DIR=${LOCALBASE}/lib/vtk-${VTK_VER}				\
		PV_INTERFACE_PATH=${WRKSRC}/applications/utilities/postProcessing/graphics/PVFoamReader/PVFoamReader/Make \
		WM_DIR=${BUILD_WRKSRC}/wmake \
		WM_LINK_LANGUAGE=c++ \
		WM_OPTIONS="${OPSYS}${PRECISION}${COMPORT}" \
		PATH="/bin:/usr/bin:/usr/local/bin:${BUILD_WRKSRC}/wmake" \
		FOAM_APP=${BUILD_WRKSRC}/applications \
		FOAM_APPBIN=${BUILD_WRKSRC}/applications/bin/${OPSYS}${PRECISION}${COMPORT} \
		FOAM_LIB=${BUILD_WRKSRC}/lib \
		FOAM_LIBBIN=${BUILD_WRKSRC}/lib/${OPSYS}${PRECISION}${COMPORT} \
		FOAM_MPI_LIBBIN=${BUILD_WRKSRC}/lib/${OPSYS}${PRECISION}${COMPORT}/mpi \
		FOAM_SRC=${BUILD_WRKSRC}/src \
		WM_OSTYPE=POSIX
#		PARAVIEW_NO_LIBRARY_DEPENDS="TRUE"

.if defined(WITH_DEBUG)
MAKE_ENV+=	CMAKE_VERBOSE_MAKEFILE="TRUE"
.endif

CSH=		/bin/csh
REALNAME=	OpenFOAM
PRECISION?=	DP
#COMPOPT?=	Opt
# Note: unset PARAVIEW_NO_LIBRARY_DEPENDS after Paraview's upgrade
PARAVIEW_VER?=	3.6.2
PARAVIEW_VE=	${PARAVIEW_VER:R}
PARAVIEW_LIB=	${LOCALBASE}/lib/paraview-${PARAVIEW_VE}
VTK_VER?=	5.0
GCC_VER=	${_GCCVERSION:S/0/-/:S/0/./g}

SHELLRC=	bashrc cshrc
SETTINGSH=	settings.sh settings.csh
DIR2CLEAN=	bin wmake applications
DIR2INST=	bin lib wmake
APP2INST=	solvers test utilities
THRD2FIX=	c++
VTK2FIX=	vtkFoam/Make/options
GL2FIX=		applications/utilities/miscellaneous/foamDebugSwitches/Make/options
PARARC=		bashrc cshrc
PARADIR=	paraview paraview3
PS2FIX=		foamJob foamEndJob
MALLOC2FIX=	src/OSspecific/POSIX/signals/sigFpe.C
BASH2FIX=	wmake/wmakeScheduler
LOCAL2FIX=	wmake/rules/General/CGAL wmake/rules/${OPSYS}/general			\
		applications/utilities/parallelProcessing/decomposePar/Make/options	\
		applications/utilities/parallelProcessing/redistributeMeshPar/Make/options\
		applications/utilities/postProcessing/graphics/PVFoamReader/Allwmake	\
		applications/utilities/postProcessing/graphics/PVFoamReader/PVFoamReader/CMakeLists.txt
APPSUBDIR=	${OPSYS}${PRECISION}${COMPOPT}
APPDIR=		applications/bin/${APPSUBDIR}
WMKDEP=		mesh/conversion/ccm26ToFoam/libccmio/libadf	\
		postProcessing/graphics/PVFoamReader/vtkFoam

DOCS=		README doc/Guides-a4 doc/Guides-usletter

.if defined(WITH_LAM)
BUILD_DEPENDS+=	${LOCALBASE}/bin/mpicc:${PORTSDIR}/net/lam
RUN_DEPENDS+=	${LOCALBASE}/bin/mpirun:${PORTSDIR}/net/lam
MAKE_ENV+=	WM_MPLIB=LAM LAM_ARCH_PATH=${LOCALBASE}
OMPI_VER=	1.3.3
MPICH_VER=	1.0.7
LAM_VER=	`${LOCALBASE}/bin/laminfo -version lam full | ${AWK} '{print $$2}'`
MPI_LIB=	LAM
PLIST_SUB+=	MPI="lam" MPI_VER=${LAM_VERSION}
.elif defined(WITH_MPICH)
BUILD_DEPENDS+=	${LOCALBASE}/mpich2/bin/mpicc:${PORTSDIR}/net/mpich2
RUN_DEPENDS+=	${LOCALBASE}/mpich2/bin/mpirun:${PORTSDIR}/net/mpich2
MAKE_ENV+=	WM_MPLIB=MPICH MPICH_ARCH_PATH=${LOCALBASE}/mpich2 MPI_ARCH_PATH=${LOCALBASE}/mpich2
MPI_LIBPATH=	${LOCALBASE}/mpich2/lib
OMPI_VER=	1.3.3
MPICH_VER=	`${LOCALBASE}/mpich2/bin/mpich2version -v | ${AWK} '{print $$3}'`
LAM_VER=	7.1.4
MPI_LIB=	MPICH
PLIST_SUB+=	MPI="mpich" MPI_VER=${MPICH_VERSION}
.else
LIB_DEPENDS+=	mpi.0:${PORTSDIR}/net/openmpi
MAKE_ENV+=	WM_MPLIB=OPENMPI OPENMPI_ARCH_PATH=${LOCALBASE}/mpi/openmpi MPI_ARCH_PATH=${LOCALBASE}/mpi/openmpi MPI_HOME=${LOCALBASE}/mpi/openmpi OPAL_PREFIX=${LOCALBASE}/mpi/openmpi
OMPI_VER=	`${LOCALBASE}/mpi/openmpi/bin/ompi_info --version ompi full --parsable | ${GREP} ompi:version:full | ${CUT} -d: -f4-`
LAM_VER=	7.1.4
MPICH_VER=	1.0.7
MPI_LIBPATH=	${LOCALBASE}/mpi/openmpi/lib
MPI_LIB=	OPENMPI
PLIST_SUB+=	MPI="openmpi" MPI_VER=${OMPI_VERSION}
.endif

.include <bsd.port.pre.mk>

.if ${OSVERSION} < 600000
BROKEN=		Fails to compile (abort trap)
.endif

.if exists(${LOCALBASE}/bin/mico-config)
MICO_VER=	`${LOCALBASE}/bin/mico-config --version`
.else
MICO_VER=	2.3.12
.endif

# OpenMPI is the default, unless another MPI exists
.if exists(${LOCALBASE}/mpi/openmpi/bin/ompi_info)
WITH_OMPI=	yes
.endif
.if !defined(WITH_OMPI)
. if exists(${LOCALBASE}/mpich2/bin/mpich2version)
WITH_MPICH=	yes
. elif  exists(${LOCALBASE}/bin/laminfo)
WITH_LAM=	yes
. endif
.endif

.if defined(WITH_LAM)
. if exists(${LOCALBASE}/bin/laminfo)
LAM_VERSION!=	${LOCALBASE}/bin/laminfo -version lam full | ${AWK} '{print $$2}'
. else
LAM_VERSION=	${LAM_VER}
. endif
.elif defined(WITH_MPICH)
. if exists(${LOCALBASE}/mpich2/bin/mpich2version)
MPICH_VERSION!=	${LOCALBASE}/mpich2/bin/mpich2version -v | /usr/bin/awk '{print $$3}'
. else
MPICH_VERSION=	${MPICH_VER}
. endif
.else
. if exists(${LOCALBASE}/mpi/openmpi/bin/ompi_info)
OMPI_VERSION!=	${LOCALBASE}/mpi/openmpi/bin/ompi_info --version ompi full --parsable | ${GREP} ompi:version:full | ${CUT} -d: -f4-
. else
OMPI_VERSION=	1.2.5
. endif
.endif

OSVERMAJ=	${OSREL:R}

post-extract:
	${CP} -Rp ${WRKSRC}/wmake/rules/linuxGcc ${WRKSRC}/wmake/rules/${OPSYS}
#	${RM} ${WRKSRC}/wmake/rules/${OPSYS}/dirToString ${WRKSRC}/wmake/rules/${OPSYS}/wmkdep
	${RM} -rf ${WRKSRC}/applications/utilities/mesh/manipulation/setSet/readline-5.0/platforms

pre-configure:
	${FIND} ${DIR2CLEAN:S|^|${WRKSRC}/|} -name "*.orig" -delete
	${REINPLACE_CMD} -e "s|1\.2\.6|${OMPI_VER}|"				\
		-e "s|1\.2\.4|${MPICH_VER}|"					\
		-e "s|7\.1\.4|${LAM_VER}|"					\
		${SETTINGSH:S|^|${WRKSRC}/etc/|}
	${REINPLACE_CMD} -e "s|/usr/local|${PREFIX}|"			\
		-e "s|#!/bin/bash|#! ${LOCALBASE}/bin/bash|"		\
		-e "s|%%MPILIB%%|${MPI_LIB}|"				\
		${SHELLRC:S|^|${WRKSRC}/etc/|} ${BASH2FIX:S|^|${WRKSRC}/|}
.if ${ARCH} == i386
	${REINPLACE_CMD} -e 's|WM_ARCH_OPTION:=64|WM_ARCH_OPTION:=32|'	\
		${SHELLRC:S|^|${WRKSRC}/etc/|}
.endif
.if ${PARAVIEW_VE} >= 3.0
	${REINPLACE_CMD} -e '/paraview/s|^|#|'	\
		-e '/ParaView3/s|^#||'		\
		${SHELLRC:S|^|${WRKSRC}/etc/|}
.endif
	${REINPLACE_CMD} -e "s|-lGL|-L${LOCALBASE}/lib -lGL|"	\
		${GL2FIX:S|^|${WRKSRC}/|}
	${REINPLACE_CMD} -e "s|GCC_VERSION=4.1.1|GCC_VERSION=${GCC_VER:S/_//}|"	\
		-e "s|JAVA_VERSION=1.4.2+|JAVA_VERSION=${JAVA_PORT_VERSION}|"	\
		${WRKSRC}/bin/foamInstallationTest
	${REINPLACE_CMD} -e "s|<malloc.h>|<stdlib.h>|"	\
		${MALLOC2FIX:S|^|${WRKSRC}/|}
#	${REINPLACE_CMD} -e 's|-lmetis|-L${LOCALBASE}/lib -lmetis|'		\
#		-e 's|../metis-5.0pre2/include|${LOCALBASE}/include/metis|'	\
#		${WRKSRC}/applications/utilities/parallelProcessing/decompositionMethods/decompositionMethods/Make/options
.for f in ${THRD2FIX}
	${REINPLACE_CMD} -e "s|-pthread|${PTHREAD_LIBS}|"	\
		-e "s|-lpthread|${PTHREAD_LIBS}|"		\
		${WRKSRC}/wmake/rules/${OPSYS}/${f}
.endfor
	${REINPLACE_CMD} -e "s|/usr/X11R6|${LOCALBASE}|"		\
		${WRKSRC}/wmake/rules/${OPSYS}/X
.for f in ${PS2FIX}
	${REINPLACE_CMD} -e "s|ps -u|ps -U|" ${WRKSRC}/bin/${f}
.endfor
.for f in ${VTK2FIX}
	${REINPLACE_CMD} -e 's|%%VTK_VER%%|${VTK_VER}|'	\
		${WRKSRC}/applications/utilities/postProcessing/graphics/PVFoamReader/${f}
.endfor
.for f in ${PARARC}
. for d in ${PARADIR}
	${REINPLACE_CMD} -e "s|/usr/local|${LOCALBASE}|"		\
		-e "s|#!/bin/bash|#!${LOCALBASE}/bin/bash|"		\
		-e "s|2.4.4|${PARAVIEW_VER}|"				\
		-e "s|3.0.0|${PARAVIEW_VER}|"				\
		-e "s|paraview-3.0|paraview-${PARAVIEW_VE}|"		\
		-e "s|paraview-2.4|paraview-${PARAVIEW_VE}|"		\
		-e "s|lib/vtk|lib/vtk-${VTK_VER}|"			\
		${WRKSRC}/etc/apps/${d}/${f}
. endfor
.endfor
.for f in ${LOCAL2FIX}
	${REINPLACE_CMD} -e "s|/usr/local|${LOCALBASE}|"	\
		${WRKSRC}/${f}
.endfor
	${REINPLACE_CMD} -e	\
		's|/usr/include/readline/readline.h|${LOCALBASE}/include/readline/readline.h|'	\
		${WRKSRC}/applications/utilities/mesh/manipulation/setSet/Allwmake
.if defined(MPI_LIBPATH)
	${REINPLACE_CMD} -e	\
	'/LINKEXE/s|OPTIONS_DIR)|OPTIONS_DIR) -L${MPI_LIBPATH} -rpath-link ${MPI_LIBPATH}|'\
		${WRKSRC}/wmake/Makefile
.endif

do-build:
	(cd ${BUILD_WRKSRC};		\
	${SETENV} ${MAKE_ENV} ./Allwmake)
#	(cd ${BUILD_WRKSRC};		\
#	${SETENV} ${MAKE_ENV}; ${SH} etc/settings.sh; ./Allwmake )


.if !defined(NOPORTDOCS)
post-build:
	@${ECHO_MSG} "===>  Building documentation."
	(cd ${BUILD_WRKSRC};			\
	${SETENV} ${MAKE_ENV} ./Allwmake doc)
.endif

do-install:
	${MKDIR} ${PREFIX}/${REALNAME}/applications
	${CP} -R ${DIR2INST:S|^|${WRKSRC}/|} ${PREFIX}/${REALNAME}
	${CP} -R ${APP2INST:S|^|${WRKSRC}/applications/|} ${PREFIX}/${REALNAME}/applications
	${FIND} ${PREFIX}/${REALNAME}/applications -type d			\
		\( -name ${APPSUBDIR} -o -name linuxDebug -o -name linuxOpt \)	\
		-exec ${RM} -rf {} \; 2>/dev/null || ${TRUE}
	${MKDIR} ${PREFIX}/${REALNAME}/${APPDIR} ${PREFIX}/${REALNAME}/jobControl
	cd ${WRKSRC}/${APPDIR}					\
	&& ${FIND} . -type f -exec ${INSTALL_PROGRAM} {}	\
		${PREFIX}/${REALNAME}/${APPDIR}/{} \;
	${TOUCH} ${PREFIX}/${REALNAME}/jobControl/.keepme
.for cf in ${WMKDEP}
	@${RM} -f ${PREFIX}/${REALNAME}/applications/utilities/${cf}/wmkdep.core
.endfor
.if !defined(NOPORTDOCS)
	${CP} -R ${DOCS:S|^|${WRKSRC}/|} ${PREFIX}/${REALNAME}
	${CP} -R ${WRKSRC}/tutorials ${PREFIX}/${REALNAME}
.endif

post-install:
	@${ECHO_MSG}
	@${CAT} ${PKGMESSAGE}
	@${ECHO_MSG}

.include <bsd.port.post.mk>
