# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

PortSystem                  1.0
PortGroup                   mpi 1.0
PortGroup                   muniversal 1.0

name                        slepc
version                     3.22.1
revision                    0
categories                  math science
maintainers                 {mcalhoun @MarcusCalhoun-Lopez} openmaintainer
license                     BSD
description                 Scalable Library for Eigenvalue Problem Computations
long_description            SLEPc is a software library for the solution of large \
                            scale sparse eigenvalue problems on parallel computers. It is an \
                            extension of PETSc and can be used for either standard or generalized \
                            eigenproblems, with real or complex arithmetic. It can also be used for \
                            computing a partial SVD of a large, sparse, rectangular matrix.

notes                       "Add the following lines to your .bash_profile if you plan to\
                            use the PETSC/SLEPC makefile rules in ${prefix}/lib/petsc/conf:\n\
                            \texport PETSC_DIR=${prefix}/lib/petsc\n\
                            \texport SLEPC_DIR=${prefix}/lib/slepc"

homepage                    https://slepc.upv.es
master_sites                https://slepc.upv.es/download/distrib/

checksums                   rmd160  535f248681d580ec48ee705eda2d6a480c7851c7 \
                            sha256  badb5cb038d09dbf1cc8f34d194673ab011c69cc46888101955c786d21c8d8c9 \
                            size    1867493

mpi.setup                   default
mpi.enforce_variant         petsc

depends_lib-append          port:petsc
use_parallel_build          no

set python_ver_dot          3.11
set python.version          [string map {. ""} $python_ver_dot]

depends_build-append        port:sowing \
                            port:python${python.version}

configure.python            ${prefix}/bin/python${python_ver_dot}

post-patch {
    reinplace "s|/usr/bin/env python3|${configure.python}|" ${worksrcpath}/configure
    fs-traverse f [list ${worksrcpath}] {
        if {[string match *.py ${f}]} {
            reinplace "s|/usr/bin/env python3|${configure.python}|" ${f}
        }
    }
}

# allow configure script to find MacPorts Python
configure.env-append        PATH=${frameworks_dir}/Python.framework/Versions/${python_ver_dot}/bin:$env(PATH)

configure.pre_args          --prefix=${prefix}/lib/slepc
if {!${universal_possible} || ![variant_isset universal]} {
configure.env-append        PETSC_DIR=${prefix}/lib/petsc
build.env-append            PETSC_DIR=${prefix}/lib/petsc
destroot.env-append         PETSC_DIR=${prefix}/lib/petsc
} else {
    foreach arch ${configure.universal_archs} {
        if {${arch} eq ${build_arch}} {
            set merger_configure_env(${arch}) PETSC_DIR=${prefix}/lib/petsc
            set merger_build_env(${arch})     PETSC_DIR=${prefix}/lib/petsc
            set merger_destroot_env(${arch})  PETSC_DIR=${prefix}/lib/petsc
        } else {
            set merger_configure_env(${arch}) PETSC_DIR=${prefix}/lib/petsc/${arch}
            set merger_build_env(${arch})     PETSC_DIR=${prefix}/lib/petsc/${arch}
            set merger_destroot_env(${arch})  PETSC_DIR=${prefix}/lib/petsc/${arch}
        }
    }
}

configure.universal_args-delete --disable-dependency-tracking

if {${universal_possible} && [variant_isset universal]} {
    merger-post-destroot {
        foreach arch ${configure.universal_archs} {
            if {${arch} ne ${build_arch}} {
                xinstall -d -m 0755 ${destroot}-${arch}${prefix}/lib/${arch}
                fs-traverse fl ${destroot}-${arch}${prefix}/lib/slepc {
                    set trg [string map "${destroot}-${arch}${prefix}/lib/slepc ${prefix}/lib/slepc" ${fl}]
                    set sfl [string map "${destroot}-${arch}${prefix}/lib/slepc ${destroot}-${arch}${prefix}/lib/${arch}" ${fl}]
                    if {[file isdir ${fl}]} {
                        xinstall -d -m 0755 ${sfl}
                    } elseif {[file extension ${fl}] eq ".pc"} {
                        # do nothing
                    } elseif {[file extension ${fl}] eq ".mod"} {
                        move ${fl} ${sfl}
                    } elseif {[file tail ${fl}] eq "uninstall.py"} {
                        move ${fl} ${sfl}
                    } else {
                        ln -s ${trg} ${sfl}
                    }
                }
                move \
                    ${destroot}-${arch}${prefix}/lib/${arch} \
                    ${destroot}-${arch}${prefix}/lib/slepc/
            }
        }
    }
}

variant arpack description {compile with ARPACK support} {
    mpi.enforce_variant arpack

    pre-fetch {
        if {![file exists ${prefix}/lib/libparpack.a]} {
            return -code error "Please install a mpi variant of arpack first."
        }
    }

    depends_lib-append      port:arpack
    configure.args-append   --with-arpack-dir=${prefix} \
                            --with-arpack-flags=-lparpack,-larpack
}

post-destroot {
    move ${destroot}${prefix}/lib/${name}/lib/pkgconfig/slepc.pc ${destroot}${prefix}/lib/pkgconfig/
}

livecheck.url       https://slepc.upv.es/download
