diff options
author | Justin Lecher <jlec@gentoo.org> | 2011-06-15 22:49:43 +0200 |
---|---|---|
committer | Justin Lecher <jlec@gentoo.org> | 2011-06-15 22:49:43 +0200 |
commit | c5e4d2832a36c8b57fb7f0910b5c18500a5a5ff8 (patch) | |
tree | 81f80f55a714573b9eb01a66f13eaa72f0091df4 /eclass | |
parent | Updated to current HEAD (diff) | |
download | sci-c5e4d2832a36c8b57fb7f0910b5c18500a5a5ff8.tar.gz sci-c5e4d2832a36c8b57fb7f0910b5c18500a5a5ff8.tar.bz2 sci-c5e4d2832a36c8b57fb7f0910b5c18500a5a5ff8.zip |
fortran-2.eclass nearly finished for review.
Diffstat (limited to 'eclass')
-rw-r--r-- | eclass/fortran-2.eclass | 149 |
1 files changed, 82 insertions, 67 deletions
diff --git a/eclass/fortran-2.eclass b/eclass/fortran-2.eclass index 5ebf8cad2..b75805199 100644 --- a/eclass/fortran-2.eclass +++ b/eclass/fortran-2.eclass @@ -12,9 +12,10 @@ # @BLURB: Packages, which need a fortran compiler should inherit this eclass. # @DESCRIPTION: # If you need a fortran compiler, inherit this eclass. This eclass tests for -# working fortran compilers. Optional, it checks for openmp capability of the +# working fortran compilers and exports the variables FC and F77. +# Optional, it checks for openmp capability of the # current fortran compiler through FORTRAN_NEED_OPENMP=1. -# Only phase function exported is pkg_setup. +# Only phase function exported is pkg_pretend and pkg_setup. # @ECLASS-VARIABLE: FORTRAN_NEED_OPENMP # @DESCRIPTION: @@ -22,6 +23,16 @@ # # Default is 0 +# @ECLASS-VARIABLE: FORTRAN_STANDARD +# @DESCRIPTION: +# Set this, if a special dialect needs to be support. Generally not needed. +# +# Valid settings are +# +# FORTRAN_STANDARD="77 90 95 2003" +# +# Defaults to FORTRAN_STANDARD="77" which is sufficient for most cases. + inherit toolchain-funcs DEPEND="virtual/fortran" @@ -29,46 +40,47 @@ RDEPEND="${DEPEND}" # internal function # -# FUNCTION: _speaks_fortran_generic -# DESCRIPTION: -# Takes fortran compiler as argument. -# Checks whether the passed fortran compiler is working -_speaks_fortran_generic() { - local base=${T}/test-fortran-generic - local fcomp=${1} +# FUNCTION: _write_testsuite +# DESCRIPTION: writes fortran test code +_write_testsuite() { + local filebase=${T}/test-fortran - [[ -z ${fcomp} ]] && die "_speaks_fortran_generic needs one argument" - - cat <<- EOF > "${base}.f" + # f77 code + cat <<- EOF > "${filebase}.f" end EOF - ${fcomp} "${base}.f" -o "${base}" >&/dev/null - local ret=$? - rm -f "${base}"* - return ${ret} + # f90/95 code + cat <<- EOF > "${filebase}.f90" + end + EOF + + # f2003 code + cat <<- EOF > "${filebase}.f03" + procedure(), pointer :: p + end + EOF } # internal function # -# FUNCTION: _speaks_fortran_2003 +# FUNCTION: _compile_test # DESCRIPTION: -# Takes fortran compiler as argument. -# Checks whether the passed fortran compiler is working -_speaks_fortran_2003() { - local base=${T}/test-fortran-2003 +# Takes fortran compiler as first argument and dialect as second. +# Checks whether the passed fortran compiler speaks the fortran dialect +_compile_test() { + local filebase=${T}/test-fortran local fcomp=${1} + local fdia=${2} - [[ -z ${fcomp} ]] && die "_speaks_fortran_2003 needs one argument" + [[ -z ${fcomp} ]] && die "_compile_test() needs at least one arg" - cat <<- EOF > "${base}.f" - procedure(), pointer :: p - end - EOF - ${fcomp} "${base}.f" -o "${base}" >&/dev/null + [[ -f "${filebase}.f${fdia}" ]] || _write_testsuite + + ${fcomp} "${filebase}.f${fdia}" -o "${filebase}-f${fdia}" >&/dev/null local ret=$? - rm -f "${base}"* + rm -f "${filebase}-f${fdia}" return ${ret} } @@ -79,46 +91,35 @@ _speaks_fortran_2003() { # See if the fortran supports OpenMP. _fortran-has-openmp() { local flag - local base=${T}/test-fc-openmp + local filebase=${T}/test-fc-openmp - cat <<- EOF > "${base}.f" + cat <<- EOF > "${filebase}.f" call omp_get_num_threads end EOF for flag in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do - $(tc-getFC "$@") ${flag} "${base}.f" -o "${base}" >&/dev/null + $(tc-getFC "$@") ${flag} "${filebase}.f" -o "${filebase}" >&/dev/null local ret=$? (( ${ret} )) || break done - rm -f "${base}"* + rm -f "${filebase}"* return ${ret} } -# @FUNCTION: get_fcomp -# @DESCRIPTION: -# Returns the canonical name or the native compiler of the current fortran compiler -# -# e.g. +# internal # -# x86_64-linux-gnu-gfortran -> gfortran -get_fcomp() { - case $(tc-getFC) in - *gfortran* ) - echo "gfortran" ;; - *g77* ) - echo "g77" ;; - ifort ) - echo "ifc" ;; - pathf*) - echo "pathcc" ;; - mpi*) - local _fcomp=$($(tc-getFC) -show | awk '{print $1}') - echo $(FC=${_fcomp} get_fcomp) ;; - * ) - echo $(tc-getFC) ;; - esac +# FUNCTION: _die_msg +# DESCRIPTION: Detailed description how to handle fortran support +_die_msg() { + echo + 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 neccessary" + eerror "fortran dialects are support." + echo + die "Currently no working fortran compiler is available" } # @FUNCTION: fortran-2_pkg_pretend @@ -127,30 +128,44 @@ get_fcomp() { fortran-2_pkg_pretend() { local dialect - _speaks_fortran_generic $(tc-getFC) || \ - _speaks_fortran_generic $(tc-getF77) || \ - die "Please emerge the current gcc with USE=fortran or export FC defining a working fortran compiler" - - [[ -n ${FORTRAN_STANDARD} ]] || FORTRAN_STANDARD="77" + [[ -n ${F77} ]] || F77=$(tc-getFC) + : ${FORTRAN_STANDARD:=77} for dialect in ${FORTRAN_STANDARD}; do case ${dialect} in - 77|90|95) _speaks_fortran_generic $(tc-getFC) || \ - die "Your fortran compiler does not speak the Fortran ${dialect}" ;; - 2003) _speaks_fortran_${dialect} $(tc-getFC) || \ - die "Your fortran compiler does not speak the Fortran ${dialect}" ;; - 2008) die "Future";; - *) die "This dialect is not a fortran ";; + 77) _compile_test $(tc-getF77) || _die_msg ;; + 90|95) _compile_test $(tc-getFC) 90 || _die_msg ;; + 2003) _compile_test $(tc-getFC) 03 || _die_msg ;; + 2008) die "Future" ;; + *) die "${dialect} is not a Fortran dialect." ;; esac done if [[ ${FORTRAN_NEED_OPENMP} == 1 ]]; then _fortran-has-openmp || \ - die "Please emerge current gcc with USE=openmp or export FC with compiler that supports OpenMP" + die "Please install current gcc with USE=openmp or set the FC variable to a compiler that supports OpenMP" + fi +} + +# @FUNCTION: fortran-2_pkg_setup +# @DESCRIPTION: +# In EAPI < 4 it calls the compiler check. This behaviour is deprecated +# and will be removed at 01-Sep-2011. Please migrate to EAPI=4. +# +# Exports the FC and F77 variable according to the compiler checks. +fortran-2_pkg_setup() { + if has ${EAPI:-0} 0 1 2 3; then + ewarn "The support for EAPI=${EAPI} by the fortran-2.eclass" + ewarn "will be end at 01-Sep-2011" + ewarn "Please migrate your package to EAPI=4" + fortran-2_pkg_pretend fi + [[ -n ${F77} ]] || export F77=$(tc-getFC) + [[ -n ${FC} ]] || export FC=$(tc-getFC) } case "${EAPI:-0}" in - 4) EXPORT_FUNCTIONS pkg_pretend;; + 1|2|3) EXPORT_FUNCTIONS pkg_setup ;; + 4) EXPORT_FUNCTIONS pkg_pretend pkg_setup ;; *) die "EAPI=${EAPI} is not supported" ;; esac |