# Copyright 1999-2008 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sci-physics/geant/geant-4.9.1_p02.ebuild,v 1.6 2008/07/17 13:46:19 bicatali Exp $

EAPI="1"

inherit eutils fortran multilib versionator toolchain-funcs

PV1=$(get_version_component_range 1 ${PV})
PV2=$(get_version_component_range 2 ${PV})
PV3=$(get_version_component_range 3 ${PV})
MY_P=${PN}$(replace_version_separator 3 .)

DESCRIPTION="CERN's detector description and simulation Tool"
HOMEPAGE="http://www.geant4.org/"

SRC_COM="http://geant4.web.cern.ch/geant4/support/source"
SRC_URI="${SRC_COM}/${MY_P}.tar.gz"
GEANT4_DATA="G4NDL.3.12
	G4EMLOW.5.1
	G4RadioactiveDecay.3.2
	PhotonEvaporation.2.0
	G4ABLA.3.0"
for d in ${GEANT4_DATA}; do
	SRC_URI="${SRC_URI} data? ( ${SRC_COM}/${d}.tar.gz )"
done

LICENSE="geant4"
SLOT="4"
KEYWORDS="~amd64 ~hppa ~sparc ~x86"
IUSE="athena +data dawn debug examples gdml geant3 global minimal +motif
	+opengl openinventor +raytracerx static +vrml zlib"

DEPEND="sci-physics/clhep
	motif? ( x11-libs/openmotif )
	athena? ( x11-libs/libXaw )
	openinventor? ( media-libs/openinventor )
	raytracerx? ( x11-libs/libX11 x11-libs/libXmu )
	opengl? ( virtual/opengl
			  athena? ( x11-libs/Xaw3d ) )
	gdml? ( dev-libs/xerces-c )
	geant3? ( sci-physics/geant:3 )
	dawn? ( media-gfx/dawn )"

S="${WORKDIR}/${MY_P}"

pkg_setup() {
	FORTRAN="gfortran g77 ifc"
	use geant3 && fortran_pkg_setup
	eval unset ${!G4*}
}

src_unpack() {
	unpack ${A}
	cd "${S}"

	# propagate user's flags.
	sed -i \
		-e "/CXXFLAGS[[:space:]]*.=[[:space:]]-O2/s:=.*:= ${CXXFLAGS}:" \
		-e "/FCFLAGS[[:space:]]*.=[[:space:]]-O2/s:=.*:= ${FFLAGS:--O2}:" \
		-e "/CCFLAGS[[:space:]]*.=[[:space:]]-O2/s:=.*:= ${CFLAGS}:" \
		config/sys/Linux*gmk || die "flag substitution failed"

	# fix forced lib directory
	sed -i \
		-e 's:$(G4LIB)/$(G4SYSTEM):$(G4LIB):g' \
		config/binmake.gmk || die "sed binmake.gmk failed"
	sed -i \
		-e '/$(G4LIB)\/$(G4SYSTEM)/d' \
		config/architecture.gmk || die "sed architecture.gmk failed"
	sed -i \
		-e 's:$(G4LIB)/$(G4SYSTEM):$(G4TMP):g' \
		config/common.gmk || die "sed common.gmk failed"
	sed -i \
		-e 's:$(G4LIB)/$(G4SYSTEM):$(G4TMP):g' \
		-e 's:$(G4BIN)/$(G4SYSTEM):$(G4TMP):g' \
		-e 's:$(G4TMP)/$(G4SYSTEM):$(G4TMP):g' \
		source/GNUmakefile || die "sed GNUmakefile failed"
	sed -i \
		-e 's:$(G4LIB)/$(G4SYSTEM):$(G4TMP):g' \
		config/globlib.gmk || die "sed globlib.gmk failed"
}

src_compile() {
	export GEANT4_DIR="/usr/share/${PN}${PV1}"
	# where to put compiled libraries;
	# we set env var G4LIB in src_install()
	# to avoid confusing make
	export GEANT4_LIBDIR=/usr/$(get_libdir)/${PN}${PV1}

	# these should always to be set
	[[ $(tc-getCXX) = ic*c ]] && export G4SYSTEM=Linux-icc \
							  || export G4SYSTEM=Linux-g++
	export G4INSTALL="${S}"
	export G4INCLUDE="${D}/usr/include/${PN}"
	export CLHEP_BASE_DIR=/usr

	# parse USE; just set flags of drivers to build, G4*_USE_* vars are set
	# later automatically for G4*_BUILD_*_DRIVER
	use minimal             && export G4UI_NONE=y \
							&& export G4VIS_NONE=y

	use motif               && export G4UI_BUILD_XM_SESSION=y
	use athena              && export G4UI_BUILD_XAW_SESSION=y

	use dawn                && export G4VIS_BUILD_DAWN_DRIVER=y
	use raytracerx          && export G4VIS_BUILD_RAYTRACERX_DRIVER=y
	use openinventor        && export G4VIS_BUILD_OI_DRIVER=y
	use opengl              && export G4VIS_BUILD_OPENGLX_DRIVER=y
	use opengl && use motif && export G4VIS_BUILD_OPENGLXM_DRIVER=y

	use geant3              && export G4LIB_BUILD_G3TOG4=y
	use zlib                && export G4LIB_BUILD_ZLIB=y
	use vrml                && export G4VIS_BUILD_VRML_DRIVER=y \
							&& export G4VIS_BUILD_VRMLFILE_DRIVER=y

	use data                && export G4DATA="${GEANT4_DIR}/data"
	use debug               && export G4DEBUG=y || export G4OPTIMIZE=y

	# switch to see compiling flags
	export CPPVERBOSE=y

	# if shared libs are built, the script will also build static libs
	# with pic flags
	# avoid that by building it twice and removing temporary objects
	cd "${S}/source/"
	export G4LIB_BUILD_SHARED=y
	emake || die "Building shared geant failed"

	if use global; then
		export G4LIB_USE_GRANULAR=y
		emake global || die "Building global libraries failed"
		emake || die "Rebuilding shared geant failed"
	fi

	if use static; then
		rm -rf tmp
		export G4LIB_BUILD_STATIC=y ; unset G4LIB_BUILD_SHARED
		emake || die "Building static geant failed"
	fi
}

g4_create_env_script() {
	# we need to change some variables to the final values since we hide these
	# from make during the compile
	export G4INSTALL=${GEANT4_DIR}
	export G4LIB=${GEANT4_LIBDIR}
	export G4INCLUDE=${G4INCLUDE/${D}/}
	export G4WORKDIR=\${HOME}/${PN}${PV1}

	local g4env=99${PN}${PV1}
	cat <<-EOF > ${g4env}
		LDPATH=${G4LIB}
		CLHEP_BASE_DIR=${CLHEP_BASE_DIR}
	EOF

	# detailed data file locations
	if $(use data); then
		export G4LEVELGAMMADATA="${G4DATA}/PhotonEvaporation2.0"
		export G4RADIOACTIVEDATA="${G4DATA}/RadioactiveDecay3.2"
		export G4LEDATA="${G4DATA}/G4EMLOW5.1"
		export G4NEUTRONHPCROSSSECTIONS="${G4DATA}/G4NDL3.12"
	fi

	# read env variables defined upto now
	printenv | grep ^G4 | uniq >> ${g4env}
	# define env vars for capabilities we can build into user projects
	printenv | uniq | \
		sed -n -e '/^G4/s:BUILD\(.*\)_DRIVER:USE\1:gp' >> ${g4env}
	doenvd ${g4env} || die "Installing environment scripts failed "
}

src_install() {
	# install headers via make since we want them in a single directory
	cd "${S}/source/"
	einfo "Installing Geant4 headers"
	emake includes || die 'Installing headers failed'
	cd "${S}"

	# but install libraries and Geant library tool manually
	einfo "Installing Geant4 libraries"
	insinto ${GEANT4_LIBDIR}
	doins tmp/*.so || die
	doins tmp/libname.map || die
	if use static; then
		doins tmp/*.a || die
	fi
	exeinto ${GEANT4_LIBDIR}
	doexe tmp/liblist || die

	g4_create_env_script

	# configs
	insinto ${GEANT4_DIR}
	doins -r config || die

	# install data
	if use data; then
		einfo "Installing Geant4 data"
		insinto ${G4DATA}
		pushd "${WORKDIR}" > /dev/null
		for d in ${GEANT4_DATA}; do
			local p=${d/.}
			doins -r *${p/G4} || die "installing data ${d} failed"
		done
		popd > /dev/null
	fi

	# doc and examples
	insinto /usr/share/doc/${PF}
	local mypv="${PV1}.${PV2}.${PV3}"
	doins ReleaseNotes/ReleaseNotes${mypv}.html
	[[ -e ReleaseNotes/Patch${mypv}-1.txt ]] && \
		dodoc ReleaseNotes/Patch${mypv}-*.txt

	use examples && doins -r examples

	# TODO: g4py will probably need a split ebuild since it seems to
	#       rely on on geant4 existence.
	# TODO: momo with momo or java flag, and check java stuff
}

pkg_postinst() {
	elog "Geant4 projects are by default build in \$HOME/geant4."
	elog "If you want to change, set \$G4WORKDIR to another directory."
}