commit:     6393847c5e76ec7097e73f92a47b61f4be6836a2
Author:     Paul Zander <negril.nx+gentoo <AT> gmail <DOT> com>
AuthorDate: Wed Jun 12 23:40:23 2024 +0000
Commit:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Fri Jul 26 15:23:10 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=6393847c

sci-libs/atlas: add 3.10.3

Closes: https://bugs.gentoo.org/662432
Signed-off-by: Paul Zander <negril.nx+gentoo <AT> gmail.com>
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>

 sci-libs/atlas/Manifest                            |   2 +
 sci-libs/atlas/atlas-3.10.3.ebuild                 | 225 ++++++++++++++++
 .../atlas/files/atlas-3.10.3-fix-ancient-c.patch   | 297 +++++++++++++++++++++
 3 files changed, 524 insertions(+)

diff --git a/sci-libs/atlas/Manifest b/sci-libs/atlas/Manifest
index 60a685649a9e..a0826c4336b6 100644
--- a/sci-libs/atlas/Manifest
+++ b/sci-libs/atlas/Manifest
@@ -1,2 +1,4 @@
 DIST atlas3.10.2.tar.bz2 4904923 BLAKE2B 
e2fb0d307907549644cb678c32c4befce7ce6809c348a11fa6084e17d696da8681b3388dd63d8bdee6040999d9ab38a75f1788b42640121a536eb5f13e6f8939
 SHA512 
9fe04cfa1f89449db047d1a4659a656964d13117c783cbbe43344eb32555736f037d9cd30c5ae1514c08ad5b8949a3982d7fe102d707ddb62288e76b2607fbb1
+DIST atlas3.10.3.tar.bz2 5156852 BLAKE2B 
cd3880a6d0c43b5840d4da26ac996cc9fe7615fc996229193ef1f936daa2c54c5465643def19f59dd5c481c447176e2ba3cf85d38c0b5008c2dc1bc18be0e65b
 SHA512 
bf17306f09f2aa973cb776e2c9eacfb2409ad4d95d19802e1c4e0597d0a099fccdb5eaafe273c2682a41e41a3c6fabc8bbba4ce03180cffea40ede5df1d1f56e
+DIST lapack-3.12.0.tar.gz 7933607 BLAKE2B 
dafb1f9a717f2cbc00a26f8cff2c7a1ebb720714fe6d7bd5fabb511a2f4af317165814340864c9d601e4e16c7762f643fbbafc058170ebcdc6529a9b4f2d70b6
 SHA512 
f8f3c733a0221be0b3f5618235408ac59cbd4e5f1c4eab5f509b831a6ec6a9ef14b8849aa6ea10810df1aff90186ca454d15e9438d1dd271c2449d42d3da9dda
 DIST lapack-3.6.0.tgz 6792324 BLAKE2B 
438f3376b63b38ef0fe70f6becac847816f3a11c01f5ab237dc0d941792ceb54dbd2f8dc22d56286f5dab3499289ed94e67521ea951a98973c9640abc294ad6c
 SHA512 
bc50441d415ef8896dd7626d77c6104184b996e758704366288089f03d4c99d068e33153b0d13305310886017e5d2e716130f812a95cfcad36ef37fe20417ab8

diff --git a/sci-libs/atlas/atlas-3.10.3.ebuild 
b/sci-libs/atlas/atlas-3.10.3.ebuild
new file mode 100644
index 000000000000..aa0e6a6826fb
--- /dev/null
+++ b/sci-libs/atlas/atlas-3.10.3.ebuild
@@ -0,0 +1,225 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+FORTRAN_NEEDED=fortran
+
+inherit fortran-2 toolchain-funcs
+
+LAPACKPV=3.12.0
+
+DESCRIPTION="Automatically Tuned Linear Algebra Software"
+HOMEPAGE="https://math-atlas.sourceforge.net";
+SRC_URI="https://downloads.sourceforge.net/math-atlas/${PN}${PV}.tar.bz2
+       fortran? ( lapack? (
+               
https://github.com/Reference-LAPACK/lapack/archive/refs/tags/v${LAPACKPV}.tar.gz
+               -> lapack-${LAPACKPV}.tar.gz
+       ) )
+"
+S="${WORKDIR}/ATLAS"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux"
+IUSE="doc fortran generic lapack static-libs threads"
+
+PATCHES=(
+       "${FILESDIR}/${PN}-3.10.2-x32-support.patch"
+       "${FILESDIR}/${PN}-3.10.2-format-security.patch"
+       "${FILESDIR}/${PN}-3.10.3-fix-ancient-c.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
+       mycc="$(type -P "$(tc-getCC)")"
+       [[ ${mycc} == *gcc* ]] && mycc=gcc
+       atlas_configure() {
+               local myconf=(
+                       --cripple-atlas-performance
+                       --prefix="/usr"
+                       --libdir="/usr/$(get_libdir)"
+                       --incdir="/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}/lapack-${LAPACKPV}.tar.gz"
+                               )
+                       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}" || die
+               cd "${confdir}" || die
+               # 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 || die
+               # atlas does its own parallel builds
+               emake -j1 build
+               cd lib || die
+               emake libclapack.a
+               [[ -e libptcblas.a ]] && emake libptclapack.a
+               popd > /dev/null || die
+       }
+
+       atlas_compile shared
+       use static-libs && atlas_compile static
+}
+
+src_test() {
+       cd "${S}_shared" || die
+       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 soname
+       libname=$(basename "${1%.*}")
+       einfo "Installing ${libname}"
+       soname=${libname}.so.$(ver_cut 1)
+       shift
+       pushd "${S}_shared"/lib > /dev/null || die
+       ${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 || die
+       use static-libs && dolib.a "${S}_static/lib/${libname}.a"
+}
+
+src_install() {
+       cd "${S}_shared/lib" || die
+       # 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}" || die
+       insinto "/usr/include/${PN}"
+       doins include/*.h
+
+       cd "${S}/doc" || die
+       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
+}

diff --git a/sci-libs/atlas/files/atlas-3.10.3-fix-ancient-c.patch 
b/sci-libs/atlas/files/atlas-3.10.3-fix-ancient-c.patch
new file mode 100644
index 000000000000..5a8a257a1a9b
--- /dev/null
+++ b/sci-libs/atlas/files/atlas-3.10.3-fix-ancient-c.patch
@@ -0,0 +1,297 @@
+From 3d330dc50a608581c81d269b661af0c938155428 Mon Sep 17 00:00:00 2001
+From: Paul Zander <[email protected]>
+Date: Fri, 26 Jul 2024 00:10:33 +0200
+Subject: [PATCH 1/5] main must return int
+
+Signed-off-by: Paul Zander <[email protected]>
+--- a/CONFIG/src/backend/archinfo_aix.c
++++ b/CONFIG/src/backend/archinfo_aix.c
+@@ -180,7 +180,7 @@ int ProbeThrottle()
+    return(iret);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int flags, CacheLevel, ncpu, mhz, bits, sure;
+    enum MACHTYPE arch=MACHOther;
+--- a/CONFIG/src/backend/archinfo_freebsd.c
++++ b/CONFIG/src/backend/archinfo_freebsd.c
+@@ -243,7 +243,7 @@ int ProbeThrottle()
+    return(iret);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int flags, CacheLevel, ncpu, mhz, bits, sure;
+    enum MACHTYPE arch=MACHOther;
+--- a/CONFIG/src/backend/archinfo_irix.c
++++ b/CONFIG/src/backend/archinfo_irix.c
+@@ -198,7 +198,7 @@ int ProbeThrottle()
+    return(iret);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int flags, CacheLevel, ncpu, mhz, bits, sure;
+    enum MACHTYPE arch=MACHOther;
+--- a/CONFIG/src/backend/archinfo_linux.c
++++ b/CONFIG/src/backend/archinfo_linux.c
+@@ -571,7 +571,7 @@ int ProbeThrottle()
+    return(iret);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int flags, CacheLevel, ncpu, mhz, bits, sure;
+    enum MACHTYPE arch=MACHOther;
+--- a/CONFIG/src/backend/archinfo_sfu.c
++++ b/CONFIG/src/backend/archinfo_sfu.c
+@@ -151,7 +151,7 @@ int ProbeThrottle()
+    return(iret);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int flags, CacheLevel, ncpu, mhz, bits, sure;
+    enum MACHTYPE arch=MACHOther;
+--- a/CONFIG/src/backend/archinfo_sunos.c
++++ b/CONFIG/src/backend/archinfo_sunos.c
+@@ -212,7 +212,7 @@ int ProbeThrottle()
+    return(iret);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int flags, CacheLevel, ncpu, mhz, bits, sure;
+    enum MACHTYPE arch=MACHOther;
+--- a/CONFIG/src/backend/archinfo_win.c
++++ b/CONFIG/src/backend/archinfo_win.c
+@@ -221,7 +221,7 @@ int ProbeThrottle()
+    return(iret);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int flags, CacheLevel, ncpu, mhz, bits, sure;
+    enum MACHTYPE arch=MACHOther;
+--- a/CONFIG/src/backend/archinfo_x86.c
++++ b/CONFIG/src/backend/archinfo_x86.c
+@@ -460,7 +460,7 @@ int GetFlags(int nargs, char **args, int *CacheLevel)
+    return(flag);
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int ierr, x86_64, flags, CacheLevel;
+    unsigned family, model;
+--- a/bin/extract.c
++++ b/bin/extract.c
+@@ -3904,7 +3904,7 @@ void HandleLine(EXTENV *EE, char *line)
+ }
+ 
+ 
+-main(int nargs, char *args[])
++int main(int nargs, char *args[])
+ {
+    char line[LNLEN], *path;
+    int i;
+--- a/bin/gpmmtst.c
++++ b/bin/gpmmtst.c
+@@ -783,11 +783,11 @@ void GetFlags(int nargs, char *args[], int *TEST,
+       #endif
+    }
+ }
+-___main(){}
+-__main(){}
+-MAIN__(){}
+-_MAIN_(){}
+-main(int nargs, char *args[])
++int ___main(){}
++int __main(){}
++int MAIN__(){}
++int _MAIN_(){}
++int main(int nargs, char *args[])
+ /*
+  *  tst <tst> <# TA> <TA's> <# TB's> <TB's> <M0> <MN> <incM> <N0> <NN> <incN>
+  *      <K0> <KN> <incK> <# alphas> <alphas> <# betas> <betas>
+--- a/bin/invtst.c
++++ b/bin/invtst.c
+@@ -743,7 +743,7 @@ void GetFlags(int nargs, char **args, int *MFLOP, int 
*CacheSize, TYPE *thresh,
+    }
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int MFLOP, CacheSize, ldagap, nord, nuplo, N0, NN, incN;
+    enum TEST_UPLO *Uplo;
+--- a/bin/llttst.c
++++ b/bin/llttst.c
+@@ -538,7 +538,7 @@ void GetFlags(int nargs, char **args, int *MFLOP, int 
*CacheSize, TYPE *thresh,
+    }
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int MFLOP, CacheSize, ldagap, nuplo, N0, NN, incN;
+    TYPE thresh;
+--- a/bin/lutst.c
++++ b/bin/lutst.c
+@@ -476,7 +476,7 @@ void GetFlags(int nargs, char **args, int *MFLOP, int 
*CacheSize, TYPE *thresh,
+    if (*M0 == -1) *M0 = *MN = *incM = *MisN = 1;
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int MFLOP, CacheSize, LdaIsM, MisN, NisM, M0, MN, incM, N0, NN, incN;
+    int norders;
+--- a/bin/slvtst.c
++++ b/bin/slvtst.c
+@@ -743,7 +743,7 @@ static int DoAllTests(int nrep, int N0, int NN, int incN, 
int R0, int RN,
+    else fprintf(stdout, "\n%d TESTS RUN, %d FAILED!!\n\n", i, ierr);
+    return(ierr);
+ }
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int ierr, N0, NN, incN, R0, RN, incR, ldagap, ldbgap, nord, nuplo;
+    int CS, MFLOP, QR, nrep;
+--- a/bin/uumtst.c
++++ b/bin/uumtst.c
+@@ -566,7 +566,7 @@ void GetFlags(int nargs, char **args, int *MFLOP, int 
*CacheSize, TYPE *thresh,
+    }
+ }
+ 
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    int MFLOP, CacheSize, ldagap, nuplo, N0, NN, incN;
+    TYPE thresh;
+--- a/lib/qr.c
++++ b/lib/qr.c
+@@ -5,7 +5,7 @@
+ #elif defined(UpCase)
+    #define dgeqrf_ DGEQRF
+ #endif
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    extern void dgeqrf_(F77_INTEGER*,F77_INTEGER*,double*,F77_INTEGER*,
+                        double*,double*,F77_INTEGER*,F77_INTEGER*);
+--- a/lib/test_dynlink.c
++++ b/lib/test_dynlink.c
+@@ -1,6 +1,6 @@
+ #include <cblas.h>
+ #include <clapack.h>
+-main(int nargs, char **args)
++int main(int nargs, char **args)
+ {
+    double A[1]={1.0}, b[1]={1.0};
+    int ipiv[1];
+--- a/tune/sysinfo/masrch.c
++++ b/tune/sysinfo/masrch.c
+@@ -169,7 +169,7 @@ int FindMflop
+    return(mf);
+ }
+ 
+-FindNreg
++int FindNreg
+ (
+    char pre,   /* precision: s,d,q */
+    int fmf,    /* number of mflops to force timer on */
+-- 
+2.45.2
+
+
+From 537f1afe821d5bad24fe401c8cb1294f2235f5b7 Mon Sep 17 00:00:00 2001
+From: Paul Zander <[email protected]>
+Date: Fri, 26 Jul 2024 00:11:42 +0200
+Subject: [PATCH 2/5] add missing function declarations
+
+Signed-off-by: Paul Zander <[email protected]>
+--- a/CONFIG/include/atlconf_misc.h
++++ b/CONFIG/include/atlconf_misc.h
+@@ -41,6 +41,8 @@ char *NameWithoutPath(char *file);
+ char *GetPathWithoutName(char *file);
+ void GetGccVers(char *gcc, int *comp, int *major, int *minor, int *patch);
+ int CompIsGcc(char *comp);
++int CompIsClang(char *comp);
++int CompIsMinGW(char *comp);
+ int CompIsAppleGcc(char *comp);
+ int CompIsMIPSpro(char *comp);
+ int CompIsPathScale(char *comp);
+-- 
+2.45.2
+
+
+From 975b10d484ec2c18fcc3eccbdf30fd166f2072c3 Mon Sep 17 00:00:00 2001
+From: Paul Zander <[email protected]>
+Date: Fri, 26 Jul 2024 00:11:49 +0200
+Subject: [PATCH 3/5] fix typo osnam -> osname
+
+Signed-off-by: Paul Zander <[email protected]>
+--- a/CONFIG/src/probe_arch.c
++++ b/CONFIG/src/probe_arch.c
+@@ -198,7 +198,7 @@ int ConfirmPtrbits(enum OSTYPE OS0, enum ASMDIA asmd0, 
char *targ0,
+ /*
+  * Try OS-specific probe, compiling with -m64 (assumes gcc workalike)
+  */
+-   i = 1 + strlen(frm) + strlen(osnam) + strlen(osnam[OS]) +
++   i = 1 + strlen(frm) + strlen(osname) + strlen(osnam[OS]) +
+        strlen(ASMNAM[asmd]) + strlen(flag) + strlen(targ) + strlen(find);
+    cmnd = malloc(i*sizeof(char));
+    assert(cmnd);
+-- 
+2.45.2
+
+
+From 550c8ff309c6896635bc86001af6dbecbf043d51 Mon Sep 17 00:00:00 2001
+From: Paul Zander <[email protected]>
+Date: Fri, 26 Jul 2024 00:15:08 +0200
+Subject: [PATCH 4/5] use long long in format string
+
+Signed-off-by: Paul Zander <[email protected]>
+--- a/bin/atlas_install.c
++++ b/bin/atlas_install.c
+@@ -278,7 +278,7 @@ long long GetFirstLongHex(char *ln)
+    {
+       if (isxdigit(ln[i]))
+       {
+-         sscanf(ln+i, "%lx", &iret);
++         sscanf(ln+i, "%llx", &iret);
+          break;
+       }
+    }
+-- 
+2.45.2
+
+
+From 9a9d7f5f83ea6235ee8e40d49b93545bb3c5b7c2 Mon Sep 17 00:00:00 2001
+From: Paul Zander <[email protected]>
+Date: Fri, 26 Jul 2024 00:16:03 +0200
+Subject: [PATCH 5/5] add missing string.h include
+
+Signed-off-by: Paul Zander <[email protected]>
+--- a/bin/qrtst.c
++++ b/bin/qrtst.c
+@@ -41,6 +41,7 @@
+ #ifndef TimeF77
+    #include "clapack.h"
+ #endif
++#include <string.h>
+ 
+ #ifdef ATL_FULL_LAPACK
+    #include "atlas_C2Flapack.h"
+-- 
+2.45.2
+

Reply via email to