public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-dev] Please review fortran-2.eclass
@ 2011-06-13  9:06 justin
  2011-06-13  9:19 ` "Paweł Hajdan, Jr."
  2011-06-15 21:32 ` [gentoo-dev] Please review fortran-2.eclass next round justin
  0 siblings, 2 replies; 26+ messages in thread
From: justin @ 2011-06-13  9:06 UTC (permalink / raw
  To: gentoo-dev

[-- Attachment #1: Type: text/plain, Size: 1690 bytes --]

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

[-- Attachment #2: fortran-2.eclass --]
[-- Type: text/plain, Size: 3011 bytes --]

# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

# Author Justin Lecher <jlec@gentoo.org>
# Test functions provided by Sebastien Fabbro and Kacper Kowalik

# @ECLASS: fortran-2.eclass
# @MAINTAINER:
# jlec@gentoo.org
# sci@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

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2011-06-18 17:36 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-13  9:06 [gentoo-dev] Please review fortran-2.eclass justin
2011-06-13  9:19 ` "Paweł Hajdan, Jr."
2011-06-13  9:30   ` justin
2011-06-13 10:30   ` justin
2011-06-17 16:25     ` [gentoo-dev] write to filesystem in pkg_pretend Torsten Veller
2011-06-17 16:36       ` Michał Górny
2011-06-17 16:42       ` Ulrich Mueller
2011-06-17 17:18       ` Mike Frysinger
2011-06-18 11:18         ` Petteri Räty
2011-06-18 12:18           ` justin
2011-06-18 12:57             ` Ulrich Mueller
2011-06-18 13:08             ` Ciaran McCreesh
2011-06-18 13:30               ` justin
2011-06-18 14:55               ` justin
2011-06-18 17:35                 ` Mike Frysinger
2011-06-15 21:32 ` [gentoo-dev] Please review fortran-2.eclass next round justin
2011-06-17  3:03   ` Mike Frysinger
2011-06-17  6:05     ` justin
2011-06-17  6:31       ` Mike Frysinger
2011-06-17  6:40         ` justin
2011-06-17  7:13           ` Mike Frysinger
2011-06-17  9:01     ` Kacper Kowalik
2011-06-17 10:32       ` justin
2011-06-17 16:41       ` Mike Frysinger
2011-06-17 18:39         ` Kacper Kowalik
2011-06-17 18:42           ` Mike Frysinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox