summaryrefslogtreecommitdiff
blob: a3d63f5d8665a763c7fe7cec1f2a5637bd132512 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# Copyright 1999-2008 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sci-libs/blas-goto/blas-goto-1.22-r1.ebuild,v 1.1 2008/02/12 17:56:31 bicatali Exp $

inherit eutils fortran flag-o-matic toolchain-funcs

MY_PN="GotoBLAS"
MY_P="${MY_PN}-${PV}"
DESCRIPTION="Fast implementations of the Basic Linear Algebra Subroutines"
HOMEPAGE="http://www.tacc.utexas.edu/resources/software/software.php"
SRC_URI="http://www.tacc.utexas.edu/resources/software/login/gotoblas/${MY_P}.tar.gz"
LICENSE="tacc"
SLOT="0"
# See http://www.tacc.utexas.edu/resources/software/gotoblasfaq.php
# for supported architectures
KEYWORDS="~x86 ~amd64"
IUSE="int64 threads doc"
RESTRICT="mirror"
RDEPEND="app-admin/eselect-blas
	dev-util/pkgconfig
	doc? ( app-doc/blas-docs )"

DEPEND="app-admin/eselect-blas
	>=sys-devel/binutils-2.17"

S="${WORKDIR}/${MY_PN}"
FORTRAN="gfortran g77 ifc"

ESELECT_PROF=goto

src_unpack() {
	unpack ${A}
	cd "${S}"

	# patch to link with m and fortran libs, works with asneeded
	epatch "${FILESDIR}"/${P}-sharedlibs.patch

	# Set up C compiler: forcing gcc for now
	if [[ $(tc-getCC) != *gcc ]]; then
		ewarn "Your C compiler is set to $(tc-getCC)"
		ewarn "${PN} needs gcc to inline assembler, others compilers have reported failures"
		ewarn "Forcing gcc"
	fi
	C_COMPILER=GNU

	# Set up FORTRAN 77 compiler
	case ${FORTRANC} in
		g77) F_COMPILER=G77;;
		gfortran) F_COMPILER=GFORTRAN;;
		ifc|ifort) F_COMPILER=INTEL;;
		*)
			die "Invalid Fortran compiler: ${FORTRANC}; valid are ${FORTRAN}."
	esac

	# Set up compilers
	sed -i \
		-e "s:^# \(C_COMPILER =\) GNU:\1 ${C_COMPILER}:g" \
		-e "s:^# \(F_COMPILER =\) G77:\1 ${F_COMPILER}:g" \
		-e "s:\$(CROSS_BINUTILS)ar:$(tc-getAR):" \
		-e "s:\$(CROSS_BINUTILS)as:$(tc-getAS):" \
		-e "s:\$(CROSS_BINUTILS)ld:$(tc-getLD):" \
		-e "s:\$(CROSS_BINUTILS)ranlib:$(tc-getRANLIB):" \
		Makefile.rule \
		|| die "sed for toolchain failed"

	if use threads; then
		sed -i \
			-e "s:^# \(SMP = 1\):\1:g" \
			Makefile.rule \
			|| die "sed for threads failed"
	fi

	if use amd64; then
		sed -i \
			-e "s:^# \(BINARY64  = 1\):\1:g" \
			Makefile.rule \
			|| die "sed for 64 binary failed"
	fi

	if use int64; then
		sed -i \
			-e "s:^# \(INTERFACE64  = 1\):\1:g" \
			Makefile.rule \
			|| die "sed for 64 integers failed"
		ESELECT_PROF="${ESELECT_PROF}-int64"
	fi
}

src_compile() {

	# Make static library
	emake LDFLAGS="$(raw-ldflags)" || die "emake failed"

	# Make shared library
	cd exports
	emake so -j1 || die "emake failed"
}

src_test() {
	cd test
	emake || die "emake test failed"
	make clean
}

src_install() {
	local install_dir=/usr/$(get_libdir)/blas/goto
	dodir ${install_dir}

	# dolib.so doesn't support our alternate locations
	exeinto ${install_dir}
	doexe libgoto_*.so || die "installing shared lib failed"
	dosym libgoto_*.so ${install_dir}/libgoto.so
	dosym libgoto_*.so ${install_dir}/libgoto.so.0
	dosym libgoto_*.so ${install_dir}/libgoto.so.0.0.0

	# dolib.a doesn't support our alternate locations
	insinto ${install_dir}
	doins libgoto_*.a || die "installing static lib failed"
	dosym libgoto_*.a ${install_dir}/libgoto.a

	dodoc 01Readme.txt 03History.txt 04FAQ.txt || die

	cp "${FILESDIR}"/blas.pc.in blas.pc
	local extlibs=""
	use threads && extlibs="${extlibs} -lpthread"
	sed -i \
		-e "s/@LIBDIR@/$(get_libdir)/" \
		-e "s/@PV@/${PV}/" \
		-e "s/@EXTLIBS@/${extlibs}/" \
		blas.pc || die "sed blas.pc failed"
	insinto /usr/$(get_libdir)/blas/goto
	doins blas.pc
	eselect blas add $(get_libdir) "${FILESDIR}"/eselect.blas.goto ${ESELECT_PROF}
}

pkg_postinst() {
	local p=blas
	local current_lib=$(eselect ${p} show | cut -d' ' -f2)
	if [[ ${current_lib} == ${ESELECT_PROF} || -z ${current_lib} ]]; then
		# work around eselect bug #189942
		local configfile="${ROOT}"/etc/env.d/${p}/$(get_libdir)/config
		[[ -e ${configfile} ]] && rm -f ${configfile}
		eselect ${p} set ${ESELECT_PROF}
		elog "${p} has been eselected to ${ESELECT_PROF}"
	else
		elog "Current eselected ${p} is ${current_lib}"
		elog "To use ${p} ${ESELECT_PROF} implementation, you have to issue (as root):"
		elog "\t eselect ${p} set ${ESELECT_PROF}"
	fi
}