| # Copyright 1999-2013 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| |
| EAPI=4 |
| |
| inherit eutils fortran-2 flag-o-matic pax-utils toolchain-funcs |
| |
| DESCRIPTION="A powerful quantum chemistry package" |
| LICENSE="gamess" |
| HOMEPAGE="http://www.msg.chem.iastate.edu/GAMESS/GAMESS.html" |
| SRC_URI=" |
| ${P}.tar.gz |
| qmmm-tinker? ( tinker.tar.Z )" |
| |
| SLOT="0" |
| # NOTE: PLEASE do not stabilize gamess. It does not make sense |
| # since the tarball has fetch restrictions and upstream only |
| # provides the latest version. In other words: As soon as a |
| # new version comes out the stable version will be useless since |
| # users can not get at the tarball any more. |
| KEYWORDS="~amd64 ~ppc ~x86" |
| IUSE="mpi neo pax_kernel qmmm-tinker" |
| |
| CDEPEND=" |
| app-shells/tcsh |
| mpi? ( virtual/mpi ) |
| virtual/blas" |
| DEPEND="${CDEPEND} |
| virtual/pkgconfig" |
| RDEPEND="${CDEPEND} |
| net-misc/openssh" |
| |
| S="${WORKDIR}/${PN}" |
| |
| RESTRICT="fetch" |
| |
| GAMESS_DOWNLOAD="http://www.msg.ameslab.gov/GAMESS/License_Agreement.html" |
| GAMESS_VERSION="1 AUG 2011 (R1)" |
| |
| pkg_nofetch() { |
| echo |
| elog "Please download ${PN}-current.tar.gz from" |
| elog "${GAMESS_DOWNLOAD}." |
| elog "Be sure to select the version ${GAMESS_VERSION} tarball!!" |
| elog "Then move the tarball to" |
| elog "${DISTDIR}/${P}.tar.gz" |
| if use qmmm-tinker ; then |
| elog "Also download http://www.msg.ameslab.gov/GAMESS/tinker.tar.Z" |
| elog "and place tinker.tar.Z to ${DISTDIR}" |
| fi |
| echo |
| } |
| |
| get_fcomp() { |
| case $(tc-getFC) in |
| *gfortran* ) |
| FCOMP="gfortran" ;; |
| ifort ) |
| FCOMP="ifc" ;; |
| * ) |
| FCOMP=$(tc-getFC) ;; |
| esac |
| } |
| |
| pkg_setup() { |
| fortran-2_pkg_setup |
| get_fcomp |
| # currently amd64 is only supported with gfortran |
| if [[ "${ARCH}" == "amd64" ]] && [[ ${FCOMP} != *gfortran* ]]; |
| then die "You will need gfortran to compile gamess on amd64" |
| fi |
| |
| # note about qmmm-tinker |
| if use qmmm-tinker; then |
| einfo "By default MM subsistem is restricted to 1000 atoms" |
| einfo "if you want larger MM subsystems then you should set" |
| einfo "QMMM_GAMESS_MAXMM variable to needed value in your make.conf" |
| einfo "By default maximum number of atom classes types and size of" |
| einfo "hessian are restricted to 250, 500 and 1000000 respectively" |
| einfo "If you want larger sizes set:" |
| einfo "QMMM_GAMESS_MAXCLASS" |
| einfo "QMMM_GAMESS_MAXCTYP" |
| einfo "QMMM_GAMESS_MAXHESS" |
| einfo "in your make.conf" |
| fi |
| |
| #note about mpi |
| if use mpi; then |
| ewarn "" |
| ewarn "You should adjust rungms script for your mpi implentation" |
| ewarn "because deafult one will not work" |
| ewarn "" |
| fi |
| } |
| |
| src_unpack() { |
| unpack ${A} |
| |
| if use qmmm-tinker; then |
| mv tinker gamess/ || die "failed to move tinker directory" |
| fi |
| } |
| |
| src_prepare() { |
| tc-export PKG_CONFIG |
| # apply LINUX-arch patches to gamess makesfiles |
| epatch "${FILESDIR}/${P}.gentoo.patch" |
| epatch "${FILESDIR}/${PN}-checktst.patch" |
| # select arch |
| # NOTE: please leave lked alone; it should be good as is!! |
| cd "${S}" |
| local active_arch; |
| if [[ "${ARCH}" == "amd64" ]]; then |
| active_arch="linux64"; |
| else |
| active_arch="linux32"; |
| fi |
| |
| # for hardened-gcc let't turn off ssp, since it breakes |
| # a few routines |
| if use pax_kernel && [[ ${FCOMP} == g77 ]]; then |
| FFLAGS="${FFLAGS} -fno-stack-protector-all" |
| fi |
| |
| # Enable mpi stuff |
| if use mpi; then |
| sed -e "s:set COMM = sockets:set COMM = mpi:g" \ |
| -i ddi/compddi || die "Enabling mpi build failed" |
| sed -e "s:MPI_INCLUDE_PATH = ' ':MPI_INCLUDE_PATH = '-I/usr/include ':g" \ |
| -i ddi/compddi || die "Enabling mpi build failed" |
| sed -e "s:MSG_LIBRARIES='../ddi/libddi.a -lpthread':MSG_LIBRARIES='../ddi/libddi.a -lmpi -lpthread':g" \ |
| -i lked || die "Enabling mpi build failed" |
| fi |
| |
| # enable NEO |
| if use neo; then |
| sed -e "s:NEO=false:NEO=true:" -i compall lked || \ |
| die "Failed to enable NEO code" |
| else |
| sed -e "s:NEO=true:NEO=false:" -i compall lked || \ |
| die "Failed to disable NEO code" |
| fi |
| # enable GAMESS-qmmm |
| if use qmmm-tinker; then |
| epatch "${FILESDIR}/${PN}-qmmm-tinker-fix-idate.patch" |
| sed -e "s:TINKER=false:TINKER=true:" -i compall lked || \ |
| die "Failed to enable TINKER code" |
| if [ "x$QMMM_GAMESS_MAXMM" == "x" ]; then |
| einfo "No QMMM_GAMESS_MAXMM set. Using default value = 1000" |
| else |
| einfo "Setting QMMM_GAMESS_MAXMM to $QMMM_GAMESS_MAXMM" |
| sed -e "s:maxatm=1000:maxatm=$QMMM_GAMESS_MAXMM:g" \ |
| -i tinker/sizes.i \ |
| || die "Setting QMMM_GAMESS_MAXMM failed" |
| sed -e "s:MAXATM=1000:MAXATM=$QMMM_GAMESS_MAXMM:g" \ |
| -i source/inputb.src \ |
| || die "Setting QMMM_GAMESS_MAXMM failed" |
| fi |
| if [ "x$QMMM_GAMESS_MAXCLASS" == "x" ]; then |
| einfo "No QMMM_GAMESS_MAXMM set. Using default value = 250" |
| else |
| sed -e "s:maxclass=250:maxclass=$QMMM_GAMESS_MAXCLASS:g" \ |
| -i tinker/sizes.i \ |
| || die "Setting QMMM_GAMESS_MAXCLASS failed" |
| fi |
| if [ "x$QMMM_GAMESS_MAXCTYP" == "x" ]; then |
| einfo "No QMMM_GAMESS_MAXCTYP set. Using default value = 500" |
| else |
| sed -e "s:maxtyp=500:maxtyp=$QMMM_GAMESS_MAXCTYP:g" \ |
| -i tinker/sizes.i \ |
| || die "Setting QMMM_GAMESS_MAXCTYP failed" |
| fi |
| if [ "x$QMMM_GAMESS_MAXHESS" == "x" ]; then |
| einfo "No QMMM_GAMESS_MAXHESS set. Usingdefault value = 1000000" |
| else |
| sed -e "s:maxhess=1000000:maxhess=$QMMM_GAMESS_MAXHESS:g" \ |
| -i tinker/sizes.i \ |
| || die "Setting QMMM_GAMESS_MAXHESS failed" |
| fi |
| fi |
| # greate proper activate sourcefile |
| cp "./tools/actvte.code" "./tools/actvte.f" || \ |
| die "Failed to create actvte.f" |
| sed -e "s/^\*UNX/ /" -i "./tools/actvte.f" || \ |
| die "Failed to perform UNX substitutions in actvte.f" |
| |
| # fix GAMESS' compall script to use proper CC |
| sed -e "s|\$CCOMP -c \$extraflags source/zunix.c|$(tc-getCC) -c \$extraflags source/zunix.c|" \ |
| -i compall || die "Failed setting up compall script" |
| |
| # insert proper FFLAGS into GAMESS' comp makefile |
| # in case we're using ifc let's strip all the gcc |
| # specific stuff |
| if [[ ${FCOMP} == "ifort" ]]; then |
| sed -e "s/gentoo-OPT = '-O2'/OPT = '${FFLAGS} -quiet'/" \ |
| -i comp || die "Failed setting up comp script" |
| elif ! use x86; then |
| sed -e "s/-malign-double //" \ |
| -e "s/gentoo-OPT = '-O2'/OPT = '${FFLAGS}'/" \ |
| -i comp || die "Failed setting up comp script" |
| else |
| sed -e "s/gentoo-OPT = '-O2'/OPT = '${FFLAGS}'/" \ |
| -i comp || die "Failed setting up comp script" |
| fi |
| |
| # fix up GAMESS' linker script; |
| sed -e "s/gentoo-LDOPTS=' '/LDOPTS='${LDFLAGS}'/" \ |
| -i lked || die "Failed setting up lked script" |
| # fix up GAMESS' ddi TCP/IP socket build |
| sed -e "s/gentoo-CC = 'gcc'/CC = '$(tc-getCC)'/" \ |
| -i ddi/compddi || die "Failed setting up compddi script" |
| # Creating install.info |
| cat > install.info <<-EOF |
| #!/bin/csh |
| setenv GMS_PATH $WORKDIR/gamess |
| setenv GMS_TARGET $active_arch |
| setenv GMS_FORTRAN $FCOMP |
| setenv GMS_MATHLIB atlas |
| setenv GMS_MATHLIB_PATH /usr/$(get_libdir)/atlas |
| setenv GMS_DDI_COMM sockets |
| EOF |
| |
| } |
| |
| src_compile() { |
| # build actvte |
| cd "${S}"/tools |
| ${FCOMP} -o actvte.x actvte.f || \ |
| die "Failed to compile actvte.x" |
| |
| # for hardened (PAX) users and ifc we need to turn |
| # MPROTECT off |
| if [[ ${FCOMP} == "ifort" ]] && use pax_kernel; then |
| pax-mark -PemRxS actvte.x |
| fi |
| |
| # build gamess |
| cd "${S}" |
| ./compall || die "compall failed" |
| |
| # build the ddi TCP/IP socket stuff |
| cd ${S}/"ddi" |
| ./compddi || die "compddi failed" |
| |
| # finally, link it all together |
| cd "${S}" |
| ./lked || die "lked failed" |
| |
| # for hardened (PAX) users and ifc we need to turn |
| # MPROTECT off |
| if [[ ${FCOMP} == "ifort" ]] && use pax_kernel; then |
| pax-mark -PemRxS ${PN}.00.x |
| fi |
| } |
| |
| src_install() { |
| # the executables |
| dobin ${PN}.00.x rungms \ |
| || die "Failed installing binaries" |
| if use !mpi; then |
| dobin ddi/ddikick.x \ |
| || die "Failed installing binaries" |
| fi |
| |
| # the docs |
| dodoc *.DOC qmnuc/*.DOC || die "Failed installing docs" |
| |
| # install ericftm |
| insinto /usr/share/${PN} |
| doins auxdata/ericfmt.dat || die "Failed installing ericfmt.dat" |
| |
| # install mcpdata |
| insinto /usr/share/${PN}/MCP |
| doins auxdata/MCP/* || die "Failed installing MCP" |
| |
| # install BASES |
| insinto /usr/share/${PN}/BASES |
| doins auxdata/BASES/* || die "Failed installing BASES" |
| |
| # install QUANPOL |
| insinto /usr/share/${PN}/QUANPOL |
| doins auxdata/QUANPOL/* || die "Failed installing QUANPOL" |
| |
| # install tinker params in case of qmmm |
| if use qmmm-tinker ; then |
| dodoc tinker/simomm.doc || die "Failed installing docs" |
| insinto /usr/share/${PN} |
| doins -r tinker/params51 || die "Failed to install Tinker params" |
| fi |
| |
| # install the tests the user should run, and |
| # fix up the runscript; also grab a copy of rungms |
| # so the user is ready to run the tests |
| insinto /usr/share/${PN}/tests |
| insopts -m0644 |
| doins tests/* || die "Failed installing tests" |
| insopts -m0744 |
| doins runall || die "Failed installing tests" |
| doins tools/checktst/checktst tools/checktst/chkabs || \ |
| die "Failed to install main test checker" |
| doins tools/checktst/exam* || \ |
| die "Failed to install individual test files" |
| |
| insinto /usr/share/${PN}/neotests |
| insopts -m0644 |
| doins -r qmnuc/neotests/* || die "Failed to install NEO tests" |
| } |
| |
| pkg_postinst() { |
| echo |
| einfo "Before you use GAMESS for any serious work you HAVE" |
| einfo "to run the supplied test files located in" |
| einfo "/usr/share/gamess/tests and check them thoroughly." |
| einfo "Otherwise all scientific publications resulting from" |
| einfo "your GAMESS runs should be immediately rejected :)" |
| einfo "To do so copy the content of /usr/share/gamess/tests" |
| einfo "to some temporary location and execute './runall'. " |
| einfo "Then run the checktst script in the same directory to" |
| einfo "validate the tests." |
| einfo "Please consult TEST.DOC and the other docs!" |
| |
| if [[ ${FCOMP} == "ifort" ]]; then |
| echo |
| ewarn "IMPORTANT NOTE: We STRONGLY recommend to stay away" |
| ewarn "from ifc-9.0 for now and use the ifc-8.1 series of" |
| ewarn "compilers UNLESS you can run through ALL of the " |
| ewarn "test cases (see above) successfully." |
| fi |
| |
| echo |
| einfo "If you want to run on more than a single CPU" |
| einfo "you will have to acquaint yourself with the way GAMESS" |
| einfo "does multiprocessor runs and adjust rungms according to" |
| einfo "your target network architecture." |
| echo |
| } |