[prev in list] [next in list] [prev in thread] [next in thread]
List: gentoo-dev
Subject: Re: [gentoo-dev] [PATCH] fortran-2.eclass: support EAPI 7
From: Michał_Górny <mgorny () gentoo ! org>
Date: 2018-10-30 7:18:58
Message-ID: 1540883938.1250.6.camel () gentoo ! org
[Download RAW message or body]
On Mon, 2018-10-29 at 03:57 +0300, Andrew Savchenko wrote:
> On Sun, 28 Oct 2018 19:29:28 +0100 Michał Górny wrote:
> > On Sun, 2018-10-28 at 01:38 +0300, Andrew Savchenko wrote:
> > > Hi all!
> > >
> > > The only blocker for EAPI 7 update is eutils inheritance, but it
> > > seems to be not used within the current eclass code, probably a
> > > remnant from older days. So it is removed.
> > >
> > > Looks like no other EAPI 7 specific changes needed.
> > >
> >
> > Please use -U99999 to include more context to the patches.
I'm going to include a few 'easy cleanup' comments since EAPI 7
is a good opportunity to improve the eclass. I'm going to skip horribly
bad design decisions since I suppose nobody cares.
> diff --git a/eclass/fortran-2.eclass b/eclass/fortran-2.eclass
> index 820cbbcb49bd..1baf776e368a 100644
> --- a/eclass/fortran-2.eclass
> +++ b/eclass/fortran-2.eclass
> @@ -1,285 +1,285 @@
> -# Copyright 1999-2017 Gentoo Foundation
> +# Copyright 1999-2018 Gentoo Authors
> # Distributed under the terms of the GNU General Public License v2
>
> # @ECLASS: fortran-2.eclass
> # @MAINTAINER:
> # jlec@gentoo.org
> # sci@gentoo.org
> # @AUTHOR:
> # Author Justin Lecher <jlec@gentoo.org>
> # Test functions provided by Sebastien Fabbro and Kacper Kowalik
> -# @SUPPORTED_EAPIS: 4 5 6
> +# @SUPPORTED_EAPIS: 4 5 6 7
> # @BLURB: Simplify fortran compiler management
> # @DESCRIPTION:
> # If you need a fortran compiler, then you should be inheriting this eclass.
> # In case you only need optional support, please export FORTRAN_NEEDED before
> # inheriting the eclass.
> #
> # The eclass tests for working fortran compilers
> # and exports the variables FC and F77.
> # Optionally, it checks for extended capabilities based on
> # the variable options selected in the ebuild
> # The only phase function exported is fortran-2_pkg_setup.
> # @EXAMPLE:
> # FORTRAN_NEEDED="lapack fortran"
> #
> # inherit fortran-2
> #
> # FORTRAN_NEED_OPENMP=1
>
> -inherit eutils toolchain-funcs
> +inherit toolchain-funcs
>
> case ${EAPI:-0} in
> - 4|5|6) EXPORT_FUNCTIONS pkg_setup ;;
> + 4|5|6|7) EXPORT_FUNCTIONS pkg_setup ;;
> *) die "EAPI=${EAPI} is not supported" ;;
> esac
>
> if [[ ! ${_FORTRAN_2_CLASS} ]]; then
>
> # @ECLASS-VARIABLE: FORTRAN_NEED_OPENMP
> # @DESCRIPTION:
> # Set to "1" in order to automatically have the eclass abort if the fortran
> # compiler lacks openmp support.
> > ${FORTRAN_NEED_OPENMP:=0}
>
> # @ECLASS-VARIABLE: FORTRAN_STANDARD
> # @DESCRIPTION:
> # Set this, if a special dialect needs to be supported.
> # Generally not needed as default is sufficient.
> #
> # Valid settings are any combination of: 77 90 95 2003
> > ${FORTRAN_STANDARD:=77}
>
> # @ECLASS-VARIABLE: FORTRAN_NEEDED
> # @DESCRIPTION:
> # If your package has an optional fortran support, set this variable
> # to the space separated list of USE triggering the fortran
> # dependency.
> #
> # e.g. FORTRAN_NEEDED=lapack would result in
> #
> # DEPEND="lapack? ( virtual/fortran )"
> #
> # If unset, we always depend on virtual/fortran.
> > ${FORTRAN_NEEDED:=always}
>
> for _f_use in ${FORTRAN_NEEDED}; do
> case ${_f_use} in
> always)
> DEPEND+=" virtual/fortran"
> RDEPEND+=" virtual/fortran"
> break
> ;;
> no)
> break
> ;;
> test)
> DEPEND+=" ${_f_use}? ( virtual/fortran )"
> ;;
> *)
> DEPEND+=" ${_f_use}? ( virtual/fortran )"
> RDEPEND+=" ${_f_use}? ( virtual/fortran )"
> ;;
> esac
> done
> unset _f_use
>
> # @FUNCTION: fortran_int64_abi_fflags
> # @DESCRIPTION:
> # Return the Fortran compiler flag to enable 64 bit integers for
> # array indices
> # @CODE
> fortran_int64_abi_fflags() {
> debug-print-function ${FUNCNAME} "${@}"
>
> _FC=$(tc-getFC)
Any reason not to make it local?
> if [[ ${_FC} == *gfortran* ]]; then
> echo "-fdefault-integer-8"
> elif [[ ${_FC} == ifort ]]; then
> echo "-integer-size 64"
> else
> die "Compiler flag for 64bit interger for ${_FC} unknown"
> fi
> }
>
> # @FUNCTION: _fortran_write_testsuite
> # @INTERNAL
> # @DESCRIPTION:
> # writes fortran test code
> _fortran_write_testsuite() {
> debug-print-function ${FUNCNAME} "${@}"
>
> local filebase=${T}/test-fortran
>
> # f77 code
> cat <<- EOF > "${filebase}.f"
> > die
> end
> EOF
>
> # f90/95 code
> cat <<- EOF > "${filebase}.f90"
> > die
> end
Also, why different indentation?
> EOF
>
> # f2003 code
> cat <<- EOF > "${filebase}.f03"
> > die
> procedure(), pointer :: p
> end
> EOF
> }
>
> # @FUNCTION: _fortran_compile_test
> # @USAGE: <compiler> [dialect]
> # @INTERNAL
> # @DESCRIPTION:
> # Takes fortran compiler as first argument and dialect as second.
> # Checks whether the passed fortran compiler speaks the fortran dialect
> _fortran_compile_test() {
> debug-print-function ${FUNCNAME} "${@}"
>
> local filebase=${T}/test-fortran
> local fcomp=${1}
> local fdia=${2}
> local fcode=${filebase}.f${fdia}
> local ret
>
> [[ $# -lt 1 ]] && \
> die "_fortran_compile_test() needs at least one argument"
>
> [[ -f ${fcode} ]] || _fortran_write_testsuite
>
> ${fcomp} "${fcode}" -o "${fcode}.x" \
> >> "${T}"/_fortran_compile_test.log 2>&1
> ret=$?
>
> rm -f "${fcode}.x"
> return ${ret}
> }
>
> # @FUNCTION: _fortran-has-openmp
> # @RETURN: return code of the compiler
> # @INTERNAL
> # @DESCRIPTION:
> # See if the fortran supports OpenMP.
> _fortran-has-openmp() {
> debug-print-function ${FUNCNAME} "${@}"
>
> local flag
> local filebase=${T}/test-fc-openmp
> local fcode=${filebase}.f
> local ret
> local _fc=$(tc-getFC)
>
> cat <<- EOF > "${fcode}"
> > die
> call omp_get_num_threads
> end
> EOF
>
> for flag in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do
> ${_fc} ${flag} "${fcode}" -o "${fcode}.x" \
> &>> "${T}"/_fortran_compile_test.log
> ret=$?
> (( ${ret} )) || break
This (( ... )) is unreadable at best; please replace it with clear
condition.
> done
>
> rm -f "${fcode}.x"
> return ${ret}
> }
>
> # @FUNCTION: _fortran_die_msg
> # @INTERNAL
> # @DESCRIPTION:
> # Detailed description how to handle fortran support
> _fortran_die_msg() {
> debug-print-function ${FUNCNAME} "${@}"
>
> echo
Don't mix echo with eerror.
> eerror "Please install currently selected gcc version with USE=fortran."
> eerror "If you intend to use a different compiler then gfortran, please"
> eerror "set FC variable accordingly and take care that the necessary"
> eerror "fortran dialects are supported."
> echo
> die "Currently no working fortran compiler is available (see \
> ${T}/_fortran_compile_test.log for information)" }
>
> # @FUNCTION: _fortran_test_function
> # @INTERNAL
> # @DESCRIPTION:
> # Internal test function for working fortran compiler.
> # It is called in fortran-2_pkg_setup.
> _fortran_test_function() {
> debug-print-function ${FUNCNAME} "${@}"
>
> local dialect
>
> : ${F77:=$(tc-getFC)}
>
> : ${FORTRAN_STANDARD:=77}
> for dialect in ${FORTRAN_STANDARD}; do
> case ${dialect} in
> 77) _fortran_compile_test $(tc-getF77) || \
> _fortran_die_msg ;;
> 90|95) _fortran_compile_test $(tc-getFC) 90 || \
> _fortran_die_msg ;;
> 2003) _fortran_compile_test $(tc-getFC) 03 || \
> _fortran_die_msg ;;
> 2008) die "Future" ;;
> *) die "${dialect} is not a Fortran dialect." ;;
> esac
> done
>
> tc-export F77 FC
> einfo "Using following Fortran compiler:"
> einfo " F77: ${F77}"
> einfo " FC: ${FC}"
>
> if [[ ${FORTRAN_NEED_OPENMP} == 1 ]]; then
> if _fortran-has-openmp; then
> einfo "${FC} has OPENMP support"
> else
> die "Please install current gcc with USE=openmp or set the FC variable to a \
> compiler that supports OpenMP" fi
> fi
> }
>
> # @FUNCTION: _fortran-2_pkg_setup
> # @INTERNAL
> # @DESCRIPTION:
> # _The_ fortran-2_pkg_setup() code
> _fortran-2_pkg_setup() {
> for _f_use in ${FORTRAN_NEEDED}; do
> case ${_f_use} in
> always)
> _fortran_test_function && break
> ;;
> no)
> einfo "Forcing fortran support off"
> break
> ;;
> *)
> if use ${_f_use}; then
> _fortran_test_function && break
> else
> unset FC
> unset F77
> fi
This contradicts the dependency atoms.
If FORTRAN_NEEDED="foo bar", you'll get:
DEP="foo? ( virtual/fortran ) bar? ( virtual/fortran )"
However, with USE="foo -bar" this will first set the compiler
for USE=foo, then reset it for USE=bar.
> ;;
> esac
> done
> }
>
>
> # @FUNCTION: fortran-2_pkg_setup
> # @DESCRIPTION:
> # Setup functionality,
> # checks for a valid fortran compiler and optionally for its openmp support.
> fortran-2_pkg_setup() {
> debug-print-function ${FUNCNAME} "${@}"
>
> if [[ ${MERGE_TYPE} != binary ]]; then
> _fortran-2_pkg_setup
> fi
> }
>
> _FORTRAN_2_ECLASS=1
> fi
--
Best regards,
Michał Górny
["signature.asc" (application/pgp-signature)]
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic