Hi all, please review and comment the attached eclass.
Purpose of this eclass is the correct setting of a working fortran compiler. There are numerous bugs which suffer from one or the other defect here. Anybody who touch a fortran package knows what I am talking about. Currently we support two fortran compilers in the tree, soonish there will be three. But we also like to like to allowed any out-of-tree compiler. So depending on gcc[fortran] or virtual/fortran doesn't fullfill the needs for one or the other reason, which I will not elaborate again. Our solution: 1. Depend on virtual/fortran. This will force the ordinary user to use gfortran through gcc[fortran]. Or the intel compiler has to be selected via FC=ifort. With this also any other solution can be selected. 2. Test whether FC is a working fortran compiler. Why? gcc:4.5[fortran] and gcc:4.6[-fortran] can be emerged and gcc-4.6 selected. Thereby virtual/fortran dependdencies are fullfiled but no working compiler is there. Same happens in many other constellations. 3. Test for openmp support. For a mixture of the above reasons, it is impossible to depend on openmp capabilities if user do change anything from default. 4. Get_fcomp is needed for some packages which do not work with the full name, e.g. seperate makefiles for intel and gnu compiler. 5. Once FC is working, set all other variable possibly defining fortran compilers of any flavour to FC. 6. It is still possible without any change to ebuilds to integrate the test functions in the toolchain-funcs eclass later, if we decide this is a better way to handle those functions. Thanks for attention, justin
# Copyright 1999-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ # Author Justin Lecher <j...@gentoo.org> # Test functions provided by Sebastien Fabbro and Kacper Kowalik # @ECLASS: fortran-2.eclass # @MAINTAINER: # j...@gentoo.org # s...@gentoo.org # @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 # current fortran compiler through FC_NEED_OPENMP=1. # Only phase function exported is pkg_setup. # @ECLASS-VARIABLE: FC_NEED_OPENMP # @DESCRIPTION: # Set FC_NEED_OPENMP=1 in order to test FC for openmp capabilities # # Default is 0 inherit toolchain-funcs DEPEND="virtual/fortran" RDEPEND="${DEPEND}" # internal function # # FUNCTION: _have-valid-fortran # DESCRIPTION: # Check whether FC returns a working fortran compiler _have-valid-fortran() { local base=${T}/test-tc-fortran cat <<- EOF > "${base}.f" end EOF $(tc-getFC "$@") "${base}.f" -o "${base}" >&/dev/null local ret=$? rm -f "${base}"* return ${ret} } # internal function # # FUNCTION: _fortran-has-openmp # DESCRIPTION: # See if the fortran supports OpenMP. _fortran-has-openmp() { local flag case $(tc-getFC) in *gfortran*|pathf*) flag=-fopenmp ;; ifort) flag=-openmp ;; mpi*) local _fcomp=$($(tc-getFC) -show | awk '{print $1}') FC=${_fcomp} _fortran-has-openmp return $? ;; *) return 0 ;; esac local base=${T}/test-fc-openmp # leave extra leading space to make sure it works on fortran 77 as well cat <<- EOF > "${base}.f" call omp_get_num_threads end EOF $(tc-getFC "$@") ${flag} "${base}.f" -o "${base}" >&/dev/null local ret=$? rm -f "${base}"* return ${ret} } # @FUNCTION: get_fcomp # @DESCRIPTION: # Returns the canonical name or the native compiler of the current fortran compiler # # e.g. # # x86_64-linux-gnu-gfortran -> gfortran get_fcomp() { case $(tc-getFC) in *gfortran* ) echo "gfortran" ;; 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: fortran-2_pkg_setup # @DESCRIPTION: # Setup functionallity, checks for a valid fortran compiler and optionally for its openmp support. fortran-2_pkg_setup() { _have-valid-fortran || \ die "Please emerge the current gcc with USE=fortran or export FC defining a working fortran compiler" export FC=$(tc-getFC) export F77=$(tc-getFC) export F90=$(tc-getFC) export F95=$(tc-getFC) if [[ ${FC_NEED_OPENMP} == 1 ]]; then _fortran-has-openmp || \ die "Please emerge current gcc with USE=openmp or export FC with compiler that supports OpenMP" fi } EXPORT_FUNCTIONS pkg_setup