--- /dev/null
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=6
+
+FORTRAN_NEEDED=fortran
+
+inherit fortran-2 toolchain-funcs versionator
+
+LAPACKP=lapack-3.6.0.tgz
+
+DESCRIPTION="Automatically Tuned Linear Algebra Software"
+HOMEPAGE="http://math-atlas.sourceforge.net/"
+SRC_URI="mirror://sourceforge/math-atlas/${PN}${PV}.tar.bz2
+ fortran? ( lapack? ( http://www.netlib.org/lapack/${LAPACKP} ) )"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux"
+IUSE="doc fortran generic lapack static-libs threads"
+
+RDEPEND=""
+DEPEND="${RDEPEND}"
+
+S="${WORKDIR}/ATLAS"
+
+PATCHES=(
+ "${FILESDIR}/${P}-x32-support.patch"
+ "${FILESDIR}/${P}-format-security.patch"
+)
+
+pkg_setup() {
+ local _cpufreq
+ for _cpufreq in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
+ if [ -f ${_cpufreq} ]; then
+ if ! grep -q performance ${_cpufreq}; then
+ echo 2> /dev/null performance > ${_cpufreq} || \
+ die "${PN} needs all cpu set to performance"
+ fi
+ fi
+ done
+ use fortran && fortran-2_pkg_setup
+}
+
+src_configure() {
+ # hack needed to trick the flaky gcc detection
+ local mycc="$(type -P $(tc-getCC))"
+ [[ ${mycc} == *gcc* ]] && mycc=gcc
+ atlas_configure() {
+ local myconf=(
+ --prefix="${ED}/usr"
+ --libdir="${ED}/usr/$(get_libdir)"
+ --incdir="${ED}/usr/include"
+ --cc="$(tc-getCC)"
+ "-D c -DWALL"
+ "-C acg '${mycc}'"
+ "-F acg '${CFLAGS}'"
+ "-Ss pmake '\$(MAKE) ${MAKEOPTS}'"
+ )
+
+ # OpenMP shown to decreased performance over POSIX threads
+ # (at least in 3.9.x, see atlas-dev mailing list)
+ if use threads; then
+ if use generic; then # 2 threads is most generic
+ myconf+=( "-t 2" "-Si omp 0" )
+ else
+ myconf+=( "-t -1" "-Si omp 0" )
+ fi
+ else
+ myconf+=( "-t 0" "-Si omp 0" )
+ fi
+
+ if use amd64 || use ppc64 || use sparc; then
+ if [ ${ABI} = amd64 ] || [ ${ABI} = ppc64 ] || [ ${ABI} = sparc64 ] ; then
+ myconf+=( "-b 64" )
+ elif [ ${ABI} = x86 ] || [ ${ABI} = ppc ] || [ ${ABI} = sparc32 ] ; then
+ myconf+=( "-b 32" )
+ elif [ ${ABI} = x32 ] ; then
+ myconf+=( "-b 48" )
+ else
+ myconf+=( "-b 64" )
+ fi
+ elif use ppc || use x86; then
+ myconf+=( "-b 32" )
+ elif use ia64; then
+ myconf+=( "-b 64" )
+ fi
+ if use fortran; then
+ myconf+=(
+ "-C if '$(type -P $(tc-getFC))'"
+ "-F if '${FFLAGS}'"
+ )
+ if use lapack; then
+ myconf+=(
+ "-Si latune 1"
+ "--with-netlib-lapack-tarfile=${DISTDIR}/${LAPACKP}"
+ )
+ else
+ myconf+=( "-Si latune 0" )
+ fi
+ else
+ myconf+=( "-Si latune 0" "--nof77" )
+ fi
+ # generic stuff found by make make xprint_enums in atlas build dir
+ # basically assuming sse2+sse1 and 2 threads max
+ use generic && use x86 && myconf+=( "-V 384 -A 13")
+ use generic && use amd64 && myconf+=( "-V 384 -A 24")
+
+ local confdir="${S}_${1}"; shift
+ myconf+=( $@ )
+ mkdir "${confdir}" && cd "${confdir}"
+ # for debugging
+ echo ${myconf[@]} > myconf.out
+ "${S}"/configure ${myconf[@]} || die "configure in ${confdir} failed"
+ }
+
+ atlas_configure shared "-Fa alg -fPIC" ${EXTRA_ECONF}
+ use static-libs && atlas_configure static ${EXTRA_ECONF}
+}
+
+src_compile() {
+ atlas_compile() {
+ pushd "${S}_${1}" > /dev/null
+ # atlas does its own parallel builds
+ emake -j1 build
+ cd lib
+ emake libclapack.a
+ [[ -e libptcblas.a ]] && emake libptclapack.a
+ popd > /dev/null
+ }
+
+ atlas_compile shared
+ use static-libs && atlas_compile static
+}
+
+src_test() {
+ cd "${S}_shared"
+ emake -j1 check time
+}
+
+# transform a static archive into a shared library and install them
+# atlas_install_libs <mylib.a> [extra link flags]
+atlas_install_libs() {
+ local libname=$(basename ${1%.*})
+ einfo "Installing ${libname}"
+ local soname=${libname}.so.$(get_major_version)
+ shift
+ pushd "${S}_shared"/lib > /dev/null
+ ${LINK:-$(tc-getCC)} ${LDFLAGS} -shared -Wl,-soname=${soname} \
+ -Wl,--whole-archive ${libname}.a -Wl,--no-whole-archive \
+ "$@" -o ${soname} || die "Creating ${soname} failed"
+ dolib.so ${soname}
+ ln -s ${soname} ${soname%.*}
+ dosym ${soname} /usr/$(get_libdir)/${soname%.*}
+ popd > /dev/null
+ use static-libs && dolib.a "${S}_static"/lib/${libname}.a
+}
+
+src_install() {
+ cd "${S}_shared/lib"
+ # rename to avoid collision with other packages
+ local l
+ for l in {,c}{blas,lapack}; do
+ if [[ -e lib${l}.a ]]; then
+ mv lib{,atl}${l}.a
+ use static-libs && mv "${S}"_static/lib/lib{,atl}${l}.a
+ fi
+ done
+
+ [[ -e libptcblas.a ]] && PTLIBS="-lpthread"
+
+ # atlas
+ atlas_install_libs libatlas.a -lm ${PTLIBS}
+
+ # cblas
+ atlas_install_libs libatlcblas.a -lm -L. -latlas
+
+ # cblas threaded
+ [[ -e libptcblas.a ]] && \
+ atlas_install_libs libptcblas.a -lm -L. -latlas ${PTLIBS}
+
+ if use lapack; then
+ # clapack
+ atlas_install_libs libatlclapack.a -lm -L. -latlas -latlcblas
+
+ # clapack threaded
+ [[ -e libptclapack.a ]] && \
+ atlas_install_libs libptclapack.a -lm -L. -latlas -lptcblas ${PTLIBS}
+ fi
+
+ if use fortran; then
+ LINK=$(tc-getF77)
+
+ # blas
+ atlas_install_libs libf77blas.a -lm -L. -latlas
+
+ # blas threaded
+ [[ -e libptf77blas.a ]] && \
+ atlas_install_libs libptf77blas.a -lm -L. -latlas ${PTLIBS}
+
+ if use lapack; then
+ # lapack
+ atlas_install_libs libatllapack.a \
+ -lm -L. -latlas -latlcblas -lf77blas
+ # lapack threaded
+ [[ -e libptlapack.a ]] && \
+ atlas_install_libs libptlapack.a -lm -L. -latlas -lptcblas -lptf77blas ${PTLIBS}
+ fi
+ fi
+
+ cd "${S}"
+ insinto /usr/include/${PN}
+ doins include/*.h
+
+ cd "${S}/doc"
+ dodoc INDEX.txt AtlasCredits.txt ChangeLog
+ use doc && dodoc atlas*pdf cblas.pdf cblasqref.pdf
+ use doc && use fortran && dodoc f77blas*pdf
+ use doc && use fortran && use lapack && dodoc *lapack*pdf
+}
--- /dev/null
+ bin/atlas_install.c | 46 +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
+
+diff --git a/bin/atlas_install.c b/bin/atlas_install.c
+index 2753cbf..21b716d 100644
+--- a/bin/atlas_install.c
++++ b/bin/atlas_install.c
+@@ -483,9 +483,9 @@ void PrintStartStop(FILE *fp0, FILE *fp1, int nspc, int START, int sec,
+ fprintf(fp1, "\n\n");
+ }
+ if (fp0)
+- fprintf(fp0, ln);
++ fprintf(fp0, "%s", ln);
+ if (fp1)
+- fprintf(fp1, ln);
++ fprintf(fp1, "%s", ln);
+ }
+
+ int LnIsCont(char *ln)
+@@ -776,11 +776,11 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ if (DefInstall)
+ {
+ sprintf(ln, "%s IRunMMDef pre=%c %s %s\n", fmake, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "BUILDING BLOCK MATMUL TUNE", ln2);
+ }
+ sprintf(ln, "%s %s pre=%c %s %s\n", fmake, fnam, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "BUILDING BLOCK MATMUL TUNE", ln2);
+ PrintBanner(ln2, 0, 2, ip+1, 1);
+ }
+@@ -836,7 +836,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ if (!FileExists(fnam))
+ {
+ sprintf(ln, "%s %s pre=%c %s %s", fmake, fnam, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "BUILDING BLOCK MATMUL TUNE", ln2);
+ }
+ fp = fopen(fnam, "r");
+@@ -854,7 +854,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ {
+ sprintf(ln, "%s %s pre=%c nb=%d %s %s",
+ fmake, fnam, pre, ncnb, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "BUILDING BLOCK MATMUL TUNE", ln2);
+ }
+ GetInstLogFile(fnam, pre, &muladd, &pf, &lat, &nb, &mu, &nu, &ku,
+@@ -881,7 +881,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ }
+
+ sprintf(ln, "%s MMinstall pre=%c %s %s\n", fmake, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "BUILDING BLOCK MATMUL TUNE", ln2);
+
+ fprintf(fpsum, "\n");
+@@ -896,7 +896,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ PrintBanner(ln2, 1, 2, ip+1, 2);
+ sprintf(ln, "%s INSTALL_LOG/atlas_cacheedge.h pre=%c %s %s\n",
+ fmake, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "CACHEEDGE DETECTION", ln2);
+ PrintBanner(ln2, 0, 2, ip+1, 2);
+ }
+@@ -922,7 +922,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ {
+ sprintf(ln, "%s %s pre=%c %s %s\n",
+ fmake, ln3, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "CACHEEDGE DETECTION", ln2);
+ }
+ fp = fopen(ln3, "r");
+@@ -955,7 +955,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ "\n\n STAGE 2-%d-3: COPY/NO-COPY CROSSOVER DETECTION\n", ip+1);
+
+ sprintf(ln, "%s %s pre=%c %s %s\n", fmake, fnam, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "COPY/NO-COPY CROSSOVER DETECTION", ln2);
+ PrintBanner(ln2, 0, 2, ip+1, 3);
+ fprintf(stdout, " done.\n");
+@@ -970,17 +970,17 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ {
+ sprintf(ln, "%s INSTALL_LOG/atlas_%ctrsmXover.h pre=%c %s %s\n",
+ fmake, pre, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "L3BLAS TUNING", ln2);
+ }
+ else
+ {
+ sprintf(ln, "%s Il3lib pre=%c %s %s\n", fmake, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "L3BLAS TUNING", ln2);
+ }
+ sprintf(ln, "%s %ccblaslib %s %s\n", fmake, pre, redir, ln2); /* cblas */
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "L3BLAS TUNING", ln2);
+ PrintBanner(ln2, 0, 2, ip+1, 5);
+ PrintStartStop(stdout, fpsum, 3, 0, 2, ip+1, 4, "L3BLAS TUNE");
+@@ -993,7 +993,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ sprintf(ln2, "INSTALL_LOG/%cMVNTUNE.LOG", pre);
+ PrintBanner(ln2, 1, 2, ip+1, 7);
+ sprintf(ln, "%s %s pre=%c %s %s\n", fmake, fnam, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "MVNTUNE", ln2);
+ ATL_Cassert(FileIsThere(fnam), "MVNTUNE", ln2);
+ PrintBanner(ln2, 0, 2, ip+1, 7);
+@@ -1026,7 +1026,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ sprintf(ln2, "INSTALL_LOG/%cMVTTUNE.LOG", pre);
+ PrintBanner(ln2, 1, 2, ip+1, 7);
+ sprintf(ln, "%s %s pre=%c %s %s\n", fmake, fnam, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "MVTTUNE", ln2);
+ ATL_Cassert(FileIsThere(fnam), "MVTTUNE", ln2);
+ PrintBanner(ln2, 0, 2, ip+1, 7);
+@@ -1061,7 +1061,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ sprintf(ln2, "INSTALL_LOG/%cR1TUNE.LOG", pre);
+ PrintBanner(ln2, 1, 2, ip+1, 7);
+ sprintf(ln, "%s %s pre=%c %s %s\n", fmake, fnam, pre, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "R1TUNE", ln2);
+ ATL_Cassert(FileIsThere(fnam), "R1TUNE", ln2);
+ PrintBanner(ln2, 0, 2, ip+1, 7);
+@@ -1099,7 +1099,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ sprintf(ln2, "INSTALL_LOG/LIBBUILD.LOG");
+ PrintBanner(ln2, 1, 3, 1, 1);
+ sprintf(ln, "%s IBuildLibs %s %s\n", fmake, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "LIBRARY BUILD", ln2);
+ ATL_Cassert(FileIsThere(fnam), "LIBRARY BUILD", ln2);
+ PrintBanner(ln2, 0, 3, 1, 1);
+@@ -1110,7 +1110,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ PrintBanner(ln2, 1, 4, 1, 1);
+ PrintStartStop(stdout, fpsum, 3, 1, 4, 1, 1, "TRSM TUNE");
+ sprintf(ln, "%s IPostTune %s %s\n", fmake, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "POST-BUILD TUNE", ln2);
+ PrintStartStop(stdout, fpsum, 3, 0, 4, 1, 0, NULL);
+ ATL_Cassert(FileIsThere(fnam), "POST-BUILD TUNE", ln2);
+@@ -1121,7 +1121,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ sprintf(ln2, "INSTALL_LOG/PTTUNE.LOG");
+ PrintBanner(ln2, 1, 4, 2, 0);
+ sprintf(ln, "%s IPTtune %s %s\n", fmake, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "THREADING TUNE", ln2);
+ PrintStartStop(stdout, fpsum, 3, 0, 4, 2, 0, "THREADING TUNE");
+
+@@ -1129,7 +1129,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ sprintf(ln2, "INSTALL_LOG/LIBPTBUILD.LOG");
+ PrintBanner(ln2, 1, 4, 2, 1);
+ sprintf(ln, "%s IBuildPtlibs %s %s\n", fmake, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "PTLIBRARY BUILD", ln2);
+ PrintBanner(ln2, 0, 4, 2, 1);
+ PrintStartStop(stdout, fpsum, 3, 0, 4, 2, 1, "THREADING BUILD");
+@@ -1144,7 +1144,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ PrintStartStop(stdout, fpsum, 6, 1, 4, 3, ip+1, ln2);
+ sprintf(ln2, "INSTALL_LOG/%cLATUNE.LOG", pre);
+ PrintBanner(ln2, 1, 4, 3, ip+1);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ sprintf(ln, "%s ILATune pre=%c %s %s\n", fmake, pre, redir, ln2);
+ ATL_Cassert(system(ln)==0, "LAPACK TUNE", ln2);
+ PrintStartStop(stdout, fpsum, 6, 0, 4, 3, ip+1, NULL);
+@@ -1162,7 +1162,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ #else
+ sprintf(ln, "%s IBuildLibs %s %s\n", fmake, redir, ln2);
+ #endif
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "STATIC LIBRARY UPDATE", ln2);
+ PrintBanner(ln2, 0, 5, 1, 1);
+ PrintStartStop(stdout, fpsum, 3, 0, 5, 1, 0, "FINAL STATIC LIBRARY UPDATE");
+@@ -1172,7 +1172,7 @@ void GoToTown(int ARCHDEF, int L1DEF, int TuneLA)
+ sprintf(ln2, "INSTALL_LOG/LIBDYBUILD.LOG");
+ PrintBanner(ln2, 1, 5, 2, 1);
+ sprintf(ln, "%s IBuildDyLibs %s %s\n", fmake, redir, ln2);
+- fprintf(stdout, ln);
++ fprintf(stdout, "%s", ln);
+ ATL_Cassert(system(ln)==0, "DYLIBRARY BUILD", ln2);
+ PrintBanner(ln2, 0, 5, 2, 1);
+ PrintStartStop(stdout, fpsum, 3, 0, 5, 2, 0, NULL);