An Improved Ebuild for OpenFOAM on Gentoo Linux

OpenFOAM is a notoriously difficult piece of software to compile, install and run. OpenCFD (the authors of OpenFOAM) have chosen to require the use of recent versions of gcc that are not available on most stable enterprise-class systems (ie Red Hat Enterprise Linux). To make things worse, until recently, OpenCFD also bundled a large number of libraries and helper applications (like VTK and ParaView) with the OpenFOAM source instead of using libraries and tools that are already on the system. Fortunately, OpenCFD has now moved the extra tools to a separate tarball, and the wizards at Gentoo have managed to create an ebuild for OpenFOAM. This is why I run Gentoo on my desktop workstation!

The Official Ebuilds

The OpenFOAM ebuilds in the Portage tree aren’t useful, for the following reasons:

  1. The executable binary files are not installed! A bug has been filed.
  2. Source code is not installed, so you can’t build any applications using OpenFOAM unless you install the source manually. Find the OpenFOAM tarball in /usr/src/distfiles, copy it to temporary location, and unpack it. Move or copy the src directory to /usr/lib64/OpenFOAM/OpenFOAM-2.1.1. The default permissions on src are strange; use
    chmod -R o+rx src
    to make sure that all users can read the source files.
  3. OpenFOAM uses a lot of environment variables to locate its source files, libraries, tools, etc. These are supposed to be automatically set up by sourcing the script
    /usr/lib64/OpenFOAM/OpenFOAM-2.1.1/etc
    Unfortunately, the environment variables in this script will have to be customized for your installation, and changes to this script will be overwritten when you upgrade OpenFOAM. This needs a better solution.

My New OpenFOAM ebuild

I have written an improved OpenFOAM ebuild for Gentoo Linux and posted it on Bugzilla. One user has already tried my patch and confirmed that it fixed the problem reported in that bug! I list the entire ebuild below for your reference:

# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sci-libs/openfoam/openfoam-2.1.1.ebuild,v 1.1 2012/06/19 02:21:17 patrick Exp $
EAPI="2"
inherit eutils versionator multilib toolchain-funcs
MY_PN="OpenFOAM"
MY_PV=$(get_version_component_range 1-2)
MY_P="${MY_PN}-${PV}"
DESCRIPTION="Open Field Operation and Manipulation - CFD Simulation Toolbox"
HOMEPAGE="http://www.openfoam.org"
SRC_URI="http://downloads.sourceforge.net/project/foam/foam/${PV}/${MY_P}.tgz"
LICENSE="GPL-2"
SLOT="2.1"
KEYWORDS="~amd64 ~x86"
IUSE="doc examples"
DEPEND="!=sci-libs/openfoam-bin-${MY_PV}*
	!=sci-libs/openfoam-kernel-${MY_PV}*
	!=sci-libs/openfoam-meta-${MY_PV}*
	!=sci-libs/openfoam-solvers-${MY_PV}*
	!=sci-libs/openfoam-utilities-${MY_PV}*
	!=sci-libs/openfoam-wmake-${MY_PV}*
	sci-libs/parmetis
	sci-libs/parmgridgen
	sci-libs/scotch
	|| ( >sci-visualization/paraview-3.0 sci-visualization/opendx )
	virtual/mpi"
RDEPEND="${DEPEND}"
S=${WORKDIR}/${MY_P}
INSDIR="/usr/$(get_libdir)/${MY_PN}/${MY_P}"
pkg_setup() {
	# just to be sure the right profile is selected (gcc-config)
	if ! version_is_at_least 4.3 $(gcc-version) ; then
		die "${PN} requires >=sys-devel/gcc-4.3 to compile."
	fi
	elog
	elog "In order to use ${MY_PN} you should add the following line to ~/.bashrc :"
	elog
	elog "alias startOF$(delete_all_version_separators ${MY_PV})='source ${INSDIR}/etc/bashrc'"
	elog
	elog "And everytime you want to use OpenFOAM you have to execute startOF$(delete_all_version_separators ${MY_PV})"
	ewarn
	ewarn "FoamX is deprecated since ${MY_PN}-1.5! "
	ewarn
}
src_configure() {
	if has_version sys-cluster/mpich2 ; then
		export WM_MPLIB=MPICH
	elif has_version sys-cluster/openmpi ; then
		export WM_MPLIB=OPENMPI
	else
		die "You need one of the following mpi implementations: openmpi or mpich2"
	fi
	sed -i -e "s|WM_MPLIB:=OPENMPI|WM_MPLIB:="${WM_MPLIB}"|" etc/bashrc
	sed -i -e "s|setenv WM_MPLIB OPENMPI|setenv WM_MPLIB "${WM_MPLIB}"|" etc/cshrc
}
src_compile() {
	WM_NCOMPPROCS=`echo $MAKEOPTS | sed 's/-j([0-9][0-9]*)/1/'`
	if [ -n "$WM_NCOMPPROCS" ] ; then
		export WM_NCOMPPROCS
	else
		export WM_NCOMPPROCS=1
	fi
	elog "Building on $WM_NCOMPPROCS cores"
	export FOAM_INST_DIR=${WORKDIR}
	source etc/bashrc
	find wmake -name dirToString | xargs rm -rf
	find wmake -name wmkdep | xargs rm -rf
	./Allwmake || die "could not build"
}
src_test() {
	cd bin
	./foamInstallationTest
}
src_install() {
	insinto ${INSDIR}
	doins -r etc
	use examples && doins -r tutorials
	doins -r src
	insopts -m0755
	doins -r bin applications platforms wmake
	dodoc README.html doc/Guides-a4/*.pdf
	if use doc ; then
		dohtml -r doc/Doxygen
	fi
}

It’s not perfect, but it’s definitely an improvement over the official ebuild. If you get a chance to try it, please post a comment on Bugzilla to encourage a Gentoo developer to incorporate it.

FreeFOAM

The problems I mentioned above (and many others) are well-known. FreeFOAM is a fork of OpenFOAM that aims to simplify installation and make OpenFOAM run on more platforms. It uses Python instead of Bash scripts (Windows doesn’t have Bash), CMake instead of Wmake and generally makes the installation more modular. This project is a great idea, and I plan to try it out when I find some time.

1 thought on “An Improved Ebuild for OpenFOAM on Gentoo Linux”

  1. OpenFoam is design to be hard to use. The author’s fund the development of the software by providing consulting services. The problems you experience are by design!

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.