aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'eclass/fortran-int64.eclass')
-rw-r--r--eclass/fortran-int64.eclass288
1 files changed, 288 insertions, 0 deletions
diff --git a/eclass/fortran-int64.eclass b/eclass/fortran-int64.eclass
new file mode 100644
index 000000000..ea46d0c37
--- /dev/null
+++ b/eclass/fortran-int64.eclass
@@ -0,0 +1,288 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+# @ECLASS: fortran-int64.eclass
+# @MAINTAINER:
+# sci team <sci@gentoo.org>
+# @AUTHOR:
+# Author: Mark Wright <gienah@gentoo.org>
+# @BLURB: flags and utility functions for building Fortran multilib int64
+# multibuild packages
+# @DESCRIPTION:
+# The fortran-int64.eclass exports USE flags and utility functions
+# necessary to build packages for multilib int64 multibuild in a clean
+# and uniform manner.
+
+if [[ ! ${_FORTRAN_INT64_ECLASS} ]]; then
+
+# EAPI=4 is required for meaningful MULTILIB_USEDEP.
+case ${EAPI:-0} in
+ 4|5) ;;
+ *) die "EAPI=${EAPI} is not supported" ;;
+esac
+
+inherit multilib-build toolchain-funcs
+
+# @ECLASS-VARIABLE: EBASE_PROFNAME
+# @DESCRIPTION:
+: ${EBASE_PROFNAME:=blas}
+
+# @ECLASS-VARIABLE: ESTATIC_MULTIBUILD
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# If this is set, then do separate static multibuilds.
+
+INT64_SUFFIX="int64"
+STATIC_SUFFIX="static"
+
+# @FUNCTION: fortran-int64_is_int64_build
+# @DESCRIPTION:
+# Returns shell true if the current multibuild is a int64 build,
+# else returns shell false.
+# @CODE
+# $(fortran-int64_is_int64_build) && \
+# openblas_abi_cflags+=" -DOPENBLAS_USE64BITINT"
+# @CODE
+fortran-int64_is_int64_build() {
+ debug-print-function ${FUNCNAME} "${@}"
+ if [[ "${MULTIBUILD_ID}" =~ "_${INT64_SUFFIX}" ]]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+# @FUNCTION: fortran-int64_is_static_build
+# @DESCRIPTION:
+# Returns shell true if ESTATIC_MULTIBUILD is true and the current multibuild
+# is a static build, else returns shell false.
+# @CODE
+# if $(fortran-int64_is_static_build); then
+# ...
+# @CODE
+fortran-int64_is_static_build() {
+ debug-print-function ${FUNCNAME} "${@}"
+ if [[ "${MULTIBUILD_ID}" =~ "_${STATIC_SUFFIX}" ]]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+# @FUNCTION: fortran-int64_get_profname
+# @USAGE: [<profname>]
+# @DESCRIPTION: Return the pkgbuild profile name, without the .pc extension,
+# for the current fortran int64 build. If the current build is not an int64
+# build, and the ebuild does not have dynamic, threads or openmp USE flags or
+# they are disabled, then the profname is ${EBASE_PROFNAME} or <profname> if
+# <profname> is specified.
+#
+# Takes an optional <profname> parameter. If no <profname> is specified, uses
+# ${EBASE_PROFNAME} as the base to calculate the profname for the current
+# build.
+fortran-int64_get_profname() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local profname="${1:-${EBASE_PROFNAME}}"
+ if has dynamic ${IUSE} && use dynamic; then
+ profname+="-dynamic"
+ fi
+ if $(fortran-int64_is_int64_build); then
+ profname+="-${INT64_SUFFIX}"
+ fi
+ # choose posix threads over openmp when the two are set
+ # yet to see the need of having the two profiles simultaneously
+ if has threads ${IUSE} && use threads; then
+ profname+="-threads"
+ elif has openmp ${IUSE} && use openmp; then
+ profname+="-openmp"
+ fi
+ echo "${profname}"
+}
+
+# @FUNCTION: fortran-int64_get_blas_provider
+# @DESCRIPTION: Returns the eselect blas provider for the current build.
+# Which is blas-int64 if called from an int64 build, or blas otherwise.
+# @CODE
+# local profname=$(fortran-int64_get_profname)
+# local provider=$(fortran-int64_get_blas_provider)
+# alternatives_for ${provider} $(fortran-int64_get_profname "reference") 0 \
+# /usr/$(get_libdir)/pkgconfig/${provider}.pc ${profname}.pc
+# @CODE
+fortran-int64_get_blas_provider() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local provider_name="blas"
+ if $(fortran-int64_is_int64_build); then
+ provider_name+="-${INT64_SUFFIX}"
+ fi
+ echo "${provider_name}"
+}
+
+# @FUNCTION: fortran-int64_get_cblas_provider
+# @DESCRIPTION: Returns the eselect cblas provider for the current build.
+# Which is cblas-int64 if called from an int64 build, or cblas otherwise.
+# @CODE
+# local profname=$(fortran-int64_get_profname)
+# local provider=$(fortran-int64_get_cblas_provider)
+# alternatives_for ${provider} $(fortran-int64_get_profname "reference") 0 \
+# /usr/$(get_libdir)/pkgconfig/${provider}.pc ${profname}.pc
+# @CODE
+fortran-int64_get_cblas_provider() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local provider_name="cblas"
+ if $(fortran-int64_is_int64_build); then
+ provider_name+="-${INT64_SUFFIX}"
+ fi
+ echo "${provider_name}"
+}
+
+# @FUNCTION: fortran-int64_get_lapack_provider
+# @DESCRIPTION: Returns the eselect lapack provider for the current build.
+# Which is lapack-int64 if called from an int64 build, or lapack otherwise.
+# @CODE
+# local profname=$(fortran-int64_get_profname)
+# local provider=$(fortran-int64_get_lapack_provider)
+# alternatives_for ${provider} $(fortran-int64_get_profname "reference") 0 \
+# /usr/$(get_libdir)/pkgconfig/${provider}.pc ${profname}.pc
+# @CODE
+fortran-int64_get_lapack_provider() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local provider_name="lapack"
+ if $(fortran-int64_is_int64_build); then
+ provider_name+="-${INT64_SUFFIX}"
+ fi
+ echo "${provider_name}"
+}
+
+# @FUNCTION: fortran-int64_get_blas_profname
+# @DESCRIPTION: Returns the pkg-config file name, without the .pc extension,
+# for the currently selected blas-int64 module if we are performing an int64
+# build, or the currently selected blas module otherwise.
+# @CODE
+# cat <<-EOF > ${profname}.pc
+# ...
+# Requires: $(fortran-int64_get_blas_profname)
+# ...
+# @CODE
+fortran-int64_get_blas_profname() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local blas_provider=$(fortran-int64_get_blas_provider)
+ local blas_symlinks=( $(eselect "${blas_provider}" files) )
+ local blas_prof_symlink="$(readlink -f "${blas_symlinks[0]}")"
+ local blas_prof_file="${blas_prof_symlink##*/}"
+ echo "${blas_prof_file%.pc}"
+}
+
+# @FUNCTION: fortran-int64_get_xblas_profname
+# @DESCRIPTION: Returns the xblas pkg-config file name, without the .pc extension,
+# for the current build. Which is xblas-int64 if we are performing an int64
+# build, or xblas otherwise.
+# @CODE
+# cat <<-EOF > ${profname}.pc
+# ...
+# Requires: $(fortran-int64_get_xblas_profname)
+# ...
+# @CODE
+fortran-int64_get_xblas_profname() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local xblas_provider="xblas"
+ if $(fortran-int64_is_int64_build); then
+ xblas_provider+="-${INT64_SUFFIX}"
+ fi
+ echo "${xblas_provider}"
+}
+
+# @FUNCTION: fortran-int64_get_fortran_int64_abi_fflags
+# @DESCRIPTION: Return the Fortran compiler flag to enable 64 bit integers for
+# array indices if we are performing an int64 build, or the empty string
+# otherwise.
+# @CODE
+# src_configure() {
+# local MULTIBUILD_VARIANTS=( $(fortran-int64_multilib_get_enabled_abis) )
+# my_configure() {
+# export FCFLAGS="${FCFLAGS} $(get_abi_CFLAGS) $(fortran-int64_get_fortran_int64_abi_fflags)"
+# econf $(use_enable fortran)
+# }
+# multibuild_foreach_variant run_in_build_dir fortran-int64_multilib_multibuild_wrapper my_configure
+# }
+# @CODE
+fortran-int64_get_fortran_int64_abi_fflags() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local openblas_abi_fflags=""
+ if $(fortran-int64_is_int64_build); then
+ openblas_abi_fflags+="-fdefault-integer-8"
+ fi
+ echo "${openblas_abi_fflags}"
+}
+
+# @FUNCTION: fortran-int64_multilib_get_enabled_abis
+# @DESCRIPTION: Returns the array of multilib int64 and optionally static
+# build combinations. Each ebuild function that requires multibuild
+# functionalits needs to set the MULTIBUILD_VARIANTS variable to the
+# array returned by this function.
+# @CODE
+# src_prepare() {
+# local MULTIBUILD_VARIANTS=( $(fortran-int64_multilib_get_enabled_abis) )
+# multibuild_copy_sources
+# }
+# @CODE
+fortran-int64_multilib_get_enabled_abis() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local MULTILIB_VARIANTS=( $(multilib_get_enabled_abis) )
+ local MULTILIB_INT64_VARIANTS=()
+ local i
+ for i in "${MULTILIB_VARIANTS[@]}"; do
+ if use int64 && [[ "${i}" =~ 64$ ]]; then
+ MULTILIB_INT64_VARIANTS+=( "${i}_${INT64_SUFFIX}" )
+ fi
+ MULTILIB_INT64_VARIANTS+=( "${i}" )
+ done
+ local MULTIBUILD_VARIANTS=()
+ if [[ -n ${ESTATIC_MULTIBUILD} ]]; then
+ local j
+ for j in "${MULTILIB_INT64_VARIANTS[@]}"; do
+ use static-libs && MULTIBUILD_VARIANTS+=( "${j}_${STATIC_SUFFIX}" )
+ MULTIBUILD_VARIANTS+=( "${j}" )
+ done
+ else
+ MULTIBUILD_VARIANTS="${MULTILIB_INT64_VARIANTS[@]}"
+ fi
+ echo "${MULTIBUILD_VARIANTS[@]}"
+}
+
+# @FUNCTION: fortran-int64_ensure_blas
+# @DESCRIPTION: Check the blas pkg-config files are available for the currently
+# selected blas module, and for the currently select blas-int64 module if the
+# int64 USE flag is enabled.
+# @CODE
+# src_prepare() {
+# fortran-int64_ensure_blas
+# ...
+# @CODE
+fortran-int64_ensure_blas() {
+ local MULTILIB_INT64_VARIANTS=( $(fortran-int64_multilib_get_enabled_abis) )
+ local MULTIBUILD_ID
+ for MULTIBUILD_ID in "${MULTILIB_INT64_VARIANTS[@]}"; do
+ local blas_profname=$(fortran-int64_get_blas_profname)
+ $(tc-getPKG_CONFIG) --exists "${blas_profname}" \
+ || die "${PN} requires the pkgbuild module ${blas_profname}"
+ done
+}
+
+# @FUNCTION: fortran-int64_multilib_multibuild_wrapper
+# @USAGE: <argv>...
+# @DESCRIPTION:
+# Initialize the environment for ABI selected for multibuild.
+# @CODE
+# multibuild_foreach_variant run_in_build_dir fortran-int64_multilib_multibuild_wrapper my_src_install
+# @CODE
+fortran-int64_multilib_multibuild_wrapper() {
+ debug-print-function ${FUNCNAME} "${@}"
+ local v="${MULTIBUILD_VARIANT/_${INT64_SUFFIX}/}"
+ local ABI="${v/_${STATIC_SUFFIX}/}"
+ multilib_toolchain_setup "${ABI}"
+ "${@}"
+}
+
+_FORTRAN_INT64_ECLASS=1
+fi