You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
5.2 KiB
201 lines
5.2 KiB
# Copyright 1999-2015 Gentoo Foundation
|
|
# Distributed under the terms of the GNU General Public License v2
|
|
# $Id$
|
|
|
|
EAPI=5
|
|
|
|
inherit eutils fortran-2 multilib toolchain-funcs versionator
|
|
|
|
MY_P=${PN}-$(replace_all_version_separators -)
|
|
|
|
DESCRIPTION="AMD Core Math Library for x86 and amd64 CPUs"
|
|
HOMEPAGE="http://developer.amd.com/acml.jsp"
|
|
SRC_URI="
|
|
amd64? (
|
|
ifc? ( ${MY_P}-ifort-64bit.tgz
|
|
int64? ( ${MY_P}-ifort-64bit-int64.tgz ) )
|
|
gfortran? ( ${MY_P}-gfortran-64bit.tgz
|
|
int64? ( ${MY_P}-gfortran-64bit-int64.tgz ) )
|
|
!ifc? (
|
|
!gfortran? ( ${MY_P}-gfortran-64bit.tgz
|
|
int64? ( ${MY_P}-gfortran-64bit-int64.tgz ) ) ) )
|
|
x86? (
|
|
ifc? ( ${MY_P}-ifort-32bit.tgz )
|
|
gfortran? ( ${MY_P}-gfortran-32bit.tgz )
|
|
!ifc? ( !gfortran? ( ${MY_P}-gfortran-32bit.tgz ) ) )"
|
|
|
|
SLOT="0"
|
|
LICENSE="ACML"
|
|
KEYWORDS="-* ~amd64 ~x86"
|
|
IUSE="doc examples gfortran ifc int64 openmp test"
|
|
|
|
RESTRICT="strip fetch"
|
|
|
|
CDEPEND="
|
|
ifc? ( dev-lang/ifc )
|
|
gfortran? ( =sys-devel/gcc-4.2* )
|
|
!gfortran? ( !ifc? ( =sys-devel/gcc-4.2* ) )"
|
|
|
|
DEPEND="
|
|
app-eselect/eselect-blas
|
|
app-eselect/eselect-lapack
|
|
test? ( ${CDEPEND} )"
|
|
|
|
RDEPEND="${CDEPEND}
|
|
app-eselect/eselect-blas
|
|
app-eselect/eselect-lapack
|
|
doc? ( app-doc/blas-docs app-doc/lapack-docs )"
|
|
|
|
S="${WORKDIR}"
|
|
|
|
pkg_nofetch() {
|
|
einfo "Please download the ACML from:"
|
|
einfo "${HOMEPAGE}"
|
|
einfo "and place it in ${DISTDIR}."
|
|
einfo "The previous versions could be found at"
|
|
einfo "http://developer.amd.com/acmlarchive.jsp"
|
|
einfo "SRC=${A} $SRC_URI"
|
|
}
|
|
|
|
get_fcomp() {
|
|
case $(tc-getFC) in
|
|
*gfortran* )
|
|
FCOMP="gfortran" ;;
|
|
ifort )
|
|
FCOMP="ifc" ;;
|
|
* )
|
|
FCOMP=$(tc-getFC) ;;
|
|
esac
|
|
}
|
|
|
|
pkg_setup() {
|
|
if use test; then
|
|
# work around incomplete fortran eclass
|
|
if use gfortran &&
|
|
[[ $(tc-getFC) =~ gfortran ]] &&
|
|
[[ $(gcc-version) != 4.2 ]]
|
|
then
|
|
eerror "You need gfortran-4.2 to test acml"
|
|
eerror "Please use gcc-config to switch gcc version 4.2"
|
|
die "gfortran check failed"
|
|
fi
|
|
fi
|
|
if use openmp; then
|
|
tc-has-openmp || die "Please ensure your compiler has openmp support"
|
|
FORTRAN_NEED_OPENMP=1
|
|
fi
|
|
fortran-2_pkg_setup
|
|
get_fcomp
|
|
# construct default profile dprof from default ddir
|
|
local ddir=gfortran
|
|
use ifc && ddir=ifort
|
|
use x86 && ddir=${ddir}32 || ddir=${ddir}64
|
|
use openmp && ddir=${ddir}_mp
|
|
use int64 && ddir=${ddir}_int64
|
|
ACML_DEFAULT_DIR=${ddir}
|
|
}
|
|
|
|
src_unpack() {
|
|
unpack ${A}
|
|
unpack ./contents-acml-*.tgz
|
|
use openmp || rm -rf *_mp*
|
|
}
|
|
|
|
src_test() {
|
|
# only testing with current chosen compiler
|
|
for fdir in ${ACML_DEFAULT_DIR/_mp}*; do
|
|
einfo "Testing acml in ${fdir}"
|
|
for d in . acml_mv; do
|
|
cd "${S}"/${fdir}/examples/${d}
|
|
emake \
|
|
ACMLDIR="${S}"/${fdir} \
|
|
F77=$(tc-getFC) \
|
|
CC="$(tc-getCC)" \
|
|
CPLUSPLUS="$(tc-getCXX)"
|
|
emake clean
|
|
done
|
|
done
|
|
}
|
|
|
|
make_acml_profile_name() {
|
|
local fort=${1%%[[:digit:]]*}
|
|
local opt=${1#*[0-9][0-9]}
|
|
echo ${PN}-${fort}${opt/mp/openmp} | tr '_' '-'
|
|
}
|
|
|
|
src_install() {
|
|
# respect acml default install dir (and FHS)
|
|
local instdir=/opt/${PN}${PV}
|
|
dodir ${instdir}
|
|
|
|
for lib in */lib; do
|
|
local fdir=${lib%/*}
|
|
# install acml
|
|
use examples || rm -rf "${S}"/${fdir}/examples
|
|
cp -pPR "${S}"/${fdir} "${D}"${instdir} || die "copy ${fdir} failed"
|
|
|
|
# install profiles
|
|
local prof=$(make_acml_profile_name ${fdir})
|
|
local acmldir=${instdir}/${fdir}
|
|
local acmllibs="-lacml"
|
|
local libname=${acmldir}/lib/libacml
|
|
local extlibs
|
|
local extflags
|
|
[[ ${fdir} =~ int64 ]] && extflags="${extflags} -fdefault-integer-8"
|
|
[[ ${fdir} =~ gfortran ]] && extlibs="${extlibs} -lgfortran"
|
|
if [[ ${fdir} =~ _mp ]]; then
|
|
[[ ${fdir} =~ ifort ]] && extlibs="${extlibs} -lguide"
|
|
extlibs="${extlibs} -lpthread"
|
|
extflags="${extflags} -fopenmp"
|
|
acmllibs="-lacml_mp"
|
|
libname=${libname}_mp
|
|
fi
|
|
use amd64 && acmllibs="${acmllibs} -lacml_mv"
|
|
for x in blas lapack; do
|
|
# pkgconfig files
|
|
sed -e "s:@LIBDIR@:$(get_libdir):" \
|
|
-e "s:@PV@:${PV}:" \
|
|
-e "s:@ACMLDIR@:${acmldir}:g" \
|
|
-e "s:@ACMLLIBS@:${acmllibs}:g" \
|
|
-e "s:@EXTLIBS@:${extlibs}:g" \
|
|
-e "s:@EXTFLAGS@:${extflags}:g" \
|
|
"${FILESDIR}"/${x}.pc.in > ${x}.pc \
|
|
|| die "sed ${x}.pc failed"
|
|
insinto ${acmldir}/lib
|
|
doins ${x}.pc
|
|
|
|
# eselect files
|
|
cat > eselect.${prof}.${x} <<-EOF
|
|
${libname}.so /usr/@LIBDIR@/lib${x}.so.0
|
|
${libname}.so /usr/@LIBDIR@/lib${x}.so
|
|
${libname}.a /usr/@LIBDIR@/lib${x}.a
|
|
${acmldir}/lib/${x}.pc /usr/@LIBDIR@/pkgconfig/${x}.pc
|
|
EOF
|
|
eselect ${x} add $(get_libdir) eselect.${prof}.${x} ${prof}
|
|
done
|
|
done
|
|
|
|
echo "LDPATH=${instdir}/${ACML_DEFAULT_DIR}/lib" > 35acml
|
|
doenvd "${S}"/35acml
|
|
use doc || rm -rf "${S}"/Doc/acml.pdf "${S}"/Doc/html
|
|
cp -pPR "${S}"/Doc "${D}"${instdir} || die "copy doc failed"
|
|
}
|
|
|
|
pkg_postinst() {
|
|
local dprof="$(make_acml_profile_name ${ACML_DEFAULT_DIR})"
|
|
for x in blas lapack; do
|
|
local cprof=$(eselect ${x} show | cut -d' ' -f2)
|
|
if [[ ${cprof} == ${dprof} || -z ${cprof} ]]; then
|
|
# work around eselect bug #189942
|
|
local configfile="${ROOT}"/etc/env.d/${x}/$(get_libdir)/config
|
|
[[ -e ${configfile} ]] && rm -f ${configfile}
|
|
eselect ${x} set ${dprof}
|
|
elog "${x} has been eselected to ${dprof}"
|
|
else
|
|
elog "Current eselected ${x} implementation is ${cprof}"
|
|
elog "To use you have one of ${PN}, issue (as root):"
|
|
elog "\t eselect ${x} set <profile>"
|
|
fi
|
|
done
|
|
}
|