# Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ EAPI=4 inherit autotools-utils eutils flag-o-matic fortran-2 multilib toolchain-funcs DESCRIPTION="Find total energy, charge density and electronic structure using density functional theory" HOMEPAGE="http://www.abinit.org/" SRC_URI="http://ftp.abinit.org/${P}.tar.gz" LICENSE="GPL-2" SLOT="0" KEYWORDS="~amd64 ~x86" IUSE="cuda cuda-double -debug +etsf_io +fftw +fftw-threads +fox gsl gui +hdf5 libabinit mpi +netcdf python -test +threads -vdwxc" RDEPEND="~sci-libs/bigdft-1.6_pre1 sci-libs/etsf_io =sci-libs/libxc-1*[fortran] sci-physics/atompaw[libxc] etsf_io? ( sci-libs/etsf_io ) fox? ( >=sci-libs/fox-4.1.2-r1[sax] ) netcdf? ( sci-libs/netcdf[fortran] hdf5? ( sci-libs/netcdf[fortran,hdf5] ) ) hdf5? ( sci-libs/hdf5[fortran] ) sci-libs/wannier90 virtual/blas virtual/lapack gsl? ( sci-libs/gsl ) fftw? ( sci-libs/fftw:3.0 fftw-threads? ( sci-libs/fftw:3.0[threads] ) ) mpi? ( virtual/mpi ) python? ( dev-python/numpy ) cuda? ( dev-util/nvidia-cuda-sdk )" DEPEND="${RDEPEND} dev-util/pkgconfig gui? ( >=virtual/jdk-1.6.0 app-arch/sharutils sys-apps/gawk ) dev-perl/Text-Markdown" S=${WORKDIR}/${P%[a-z]} lat1loc="" DOCS=( AUTHORS ChangeLog COPYING INSTALL KNOWN_PROBLEMS NEWS PACKAGING README README.ChangeLog README.GPU README.xlf RELNOTES THANKS ) FORTRAN_STANDARD=90 pkg_setup() { # Doesn't compile with gcc-4.0, only >=4.1 if [[ $(tc-getFC) == *gfortran ]]; then if [[ $(gcc-major-version) -eq 4 ]] \ && [[ $(gcc-minor-version) -lt 1 ]]; then die "Requires gcc-4.1 or newer" fi fi # fortran-2.eclass does not handle mpi wrappers if use mpi; then export FC="mpif90" export F77="mpif77" export CC="mpicc" export CXX="mpic++" else tc-export FC F77 CC CXX fi # Preprocesor macross can make some lines really long append-fflags -ffree-line-length-none fortran-2_pkg_setup # Sort out some USE options if use fftw-threads && ! use fftw; then ewarn "fftw-threads set but fftw not used, ignored" fi if use cuda-double && ! use cuda; then ewarn "cuda-double set but cuda not used, ignored" fi if use gui; then lat1loc="$(locale |awk '/LC_CTYPE="(.*)"/{sub("LC_CTYPE=\"",""); sub("\" *$", ""); print}')" if locale charmap |grep -i "\"; then einfo "Good, locale compatible with the GUI build" else ewarn "The locale ${lat1loc} incompatible with the GUI build" if latloc=`locale -a| grep -i "\"`; then if echo "${latloc}" |grep -q "^fr"; then lat1loc="$(echo "${latloc}" | grep -im1 "^fr")" else lat1loc="$(echo "${latloc}" | grep -im1 "iso88591")" fi einfo "Will use ${lat1loc} to build the GUI" else ewarn "No ISO-8859-1 nor ISO-8859-15 locale available, the GUI build may crash" fi fi fi } src_prepare() { epatch \ "${FILESDIR}"/6.2.2-change-default-directories.patch \ "${FILESDIR}"/6.0.3-fftw.patch \ "${FILESDIR}"/6.12.1-autoconf.patch \ "${FILESDIR}"/6.12.1-xmalloc.patch \ "${FILESDIR}"/6.12.1-libabinit_options.patch eautoreconf } src_configure() { local libs="-L/usr/$(get_libdir)" local modules="-I/usr/$(get_libdir)/finclude $(FoX-config --sax --fcflags)" local FoX_libs="${libs} $(FoX-config --sax --libs)" local trio_flavor="" use etsf_io && trio_flavor="${trio_flavor}+etsf_io" use fox && trio_flavor="${trio_flavor}+fox" use netcdf && trio_flavor="${trio_flavor}+netcdf" test "no${trio_flavor}" = "no" && trio_flavor="none" local netcdff_libs="-lnetcdff" use hdf5 && netcdff_libs="${netcdff_libs} -lhdf5_fortran" local fft_flavor="fftw3" local fft_libs="-L/usr/lib" # The fftw threads support is protected by black magick. # Anybody removes it, dies. # New USE flag "fftw-threads" was added to control usage # of the threaded fftw variant. Since fftw-3.3 has expanded # the paralel options by MPI and OpenMP support, analogical # USE flags should be added to select them in future; # unusable with previous FFTW versions, they are postponed # for now. if use fftw-threads; then fft_flavor="fftw3-threads" if has_version '>=sci-libs/fftw-3.3'; then # pkg-config files for fftw-3.3 are broken # All the parallel stuff is separated # from the main body of common routines, # and -lfftw3 must be always included alongside. # Until version 3.3 this used to be masked by # .la files. # Bug 384645 fft_libs="${fft_libs} $(pkg-config --libs fftw3_threads) $(pkg-config --libs fftw3)" else fft_libs="${fft_libs} $(pkg-config --libs fftw3_threads)" fi else fft_libs="${fft_libs} $(pkg-config --libs fftw3)" fi local gpu_flavor="none" if use cuda; then gpu_flavor="cuda-single" if use cuda-double; then gpu_flavor="cuda-double" fi fi local myeconfargs=( --enable-clib --enable-exports $(use_enable gui) $(use_enable debug debug enhanced) $(use_enable mpi) $(use_enable mpi mpi-io) --disable-smp $(use_enable vdwxc) $(use_enable cuda gpu) "$(use cuda && echo "--with-gpu-flavor=${gpu_flavor}")" "$(use cuda && echo "--with-gpu-prefix=/opt/cuda/")" "$(use gsl && echo "--with-math-flavor=gsl")" "$(use gsl && echo "--with-math-incs=$(pkg-config --cflags gsl)")" "$(use gsl && echo "--with-math-libs=$(pkg-config --libs gsl)")" --with-linalg-flavor="atlas" --with-linalg-libs="$(pkg-config --libs lapack)" --with-trio-flavor="${trio_flavor}" "$(use netcdf && echo "--with-netcdf-incs=-I/usr/include")" "$(use netcdf && echo "--with-netcdf-libs=$(pkg-config --libs netcdf) ${netcdff_libs}")" "$(use fox && echo "--with-fox-incs=${modules}")" "$(use fox && echo "--with-fox-libs=${FoX_libs}")" "$(use etsf_io && echo "--with-etsf-io-incs=${modules}")" "$(use etsf_io && echo "--with-etsf-io-libs=${libs} -letsf_io -letsf_io_utils -letsf_io_low_level")" --with-dft-flavor="libxc+bigdft+atompaw+wannier90" --with-libxc-incs="${modules}" --with-libxc-libs="${libs} -lxc" --with-bigdft-incs="${modules}" --with-bigdft-libs="$(pkg-config --libs bigdft)" --with-atompaw-incs="${modules}" --with-atompaw-libs="${libs} -latompaw" --with-wannier90-bins="/usr/bin" --with-wannier90-incs="${modules}" --with-wannier90-libs="${libs} -lwannier $(pkg-config --libs lapack)" "$(use fftw && echo "--with-fft-flavor=${fft_flavor}")" "$(use fftw && echo "--with-fft-incs=-I/usr/include")" "$(use fftw && echo "--with-fft-libs=${fft_libs}")" --with-timer-flavor="abinit" LD="$(tc-getLD)" FCFLAGS="${FCFLAGS:- ${FFLAGS:- -O2}} ${modules} -I/usr/include" ) MARKDOWN=Markdown.pl autotools-utils_src_configure if use gui; then # autotools-utils_src_configure() part expanded _check_build_dir pushd "${AUTOTOOLS_BUILD_DIR}" > /dev/null mkdir -p gui cd gui ECONF_SOURCE="${S}"/gui econf UUDECODE="uudecode" fi } src_compile() { autotools-utils_src_compile # Apparently libabinit.a is not built by default # Used by BigDFT. Should probably be built separately, # as a package of its own: BigDFT used by Abinit. # Does libabinit.a depend on BigDFT, if used? # Can Abinit use external libabinit.a? use libabinit && autotools-utils_src_compile libabinit.a if use gui; then #autotools-utils_src_compile() expanded # _check_build_dir has already been called pushd "${AUTOTOOLS_BUILD_DIR}" > /dev/null # now what the function cannot be called to do cd gui LC_CTYPE="${lat1loc}" emake || die "Making GUI failed" popd > /dev/null fi sed -i -e's/libatlas/lapack/' "${AUTOTOOLS_BUILD_DIR}"/config.pc } src_test() { einfo "The tests take quite a while, easily several hours" # autotools-utils_src_test() expanded _check_build_dir pushd "${AUTOTOOLS_BUILD_DIR}" > /dev/null # again something the autotools-utils function cannot be called to do # now quite a lot of work actually cd tests emake tests_acc || ewarn "Accuracy tests failed" emake tests_paw || ewarn "PAW tests failed" emake tests_gw || ewarn "GW tests failed" emake tests_gw_paw || ewarn "GW-PAW tests failed" emake tests_bs || ewarn "BSE tests failed" emake tests_tddft || ewarn "TDDFT tests failed" emake tests_eph || ewarn "Elphon tests failed" local REPORT for REPORT in $(find . -name report); do REPORT=${REPORT#*/} elog "Parameters and unusual results for ${REPORT%%/*} tests" echo "Parameters and unusual results for ${REPORT%%/*} tests" >>tests_summary.txt while read line; do elog "${line}" echo "${line}" >>tests_summary.txt done \ < <(grep -v -e succeeded -e passed ${REPORT}) done local testdir find . -name "tmp-test*" -print | \ while read testdir; do if [ -e summary_of_tests.tar ]; then tar rvf summary_of_tests.tar ${testdir} else tar cvf summary_of_tests.tar ${testdir} fi done popd > /dev/null elog "The full test results will be installed as summary_of_tests.tar.bz2." elog "Also a concise report tests_summary.txt is installed." } src_install() { #autotools-utils_src_install() expanded _check_build_dir pushd "${AUTOTOOLS_BUILD_DIR}" > /dev/null emake DESTDIR="${D}" install || die "make install failed" use libabinit && dolib libabinit.a if use gui; then pushd gui emake DESTDIR="${D}" install || die "The GUI install failed" popd fi if use test; then for dc in tests_summary.txt summary_of_tests.tar; do test -e tests/"${dc}" && dodoc tests/"${dc}" || ewarn "Copying tests results failed" done fi popd > /dev/null # XXX: support installing them from builddir as well!!! if [[ ${DOCS} ]]; then dodoc "${DOCS[@]}" || die "dodoc failed" else local f # same list as in PMS for f in README* ChangeLog AUTHORS NEWS TODO CHANGES \ THANKS BUGS FAQ CREDITS CHANGELOG; do if [[ -s ${f} ]]; then dodoc "${f}" || die "(default) dodoc ${f} failed" fi done fi if [[ ${HTML_DOCS} ]]; then dohtml -r "${HTML_DOCS[@]}" || die "dohtml failed" fi # Remove libtool files and unnecessary static libs remove_libtool_files } pkg_postinst() { if use test; then elog "The full test results will be installed as summary_tests.tar.bz2." elog "Also a concise report tests_summary.txt is installed." fi }