# -*- 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           muniversal 1.0
PortGroup           mpi 1.0
PortGroup           github 1.0
PortGroup           linear_algebra 1.0

github.setup        opencollab arpack-ng 3.9.1
# Change github.tarball_from to 'releases' or 'archive' next update
github.tarball_from tarball
name                arpack
revision            1
categories          math
license             BSD
maintainers         nomaintainer
description         Package for solving large-scale eigenvalue problems
long_description    ARPACK is a collection of Fortran77 subroutines designed to \
                    solve large scale eigenvalue problems. Parallel ARPACK (PARPACK) \
                    is included if built with an MPI variant.
worksrcdir          ${name}-ng-${version}

checksums           rmd160  8d9e9cd6754a4222e6dcd09cbe32bdcfd6be26d2 \
                    sha256  979ff2bfac27577250a60c78ae377e656f6484c66600376a6735ec3eeb506fe7 \
                    size    1020716

depends_build-append \
                    port:pkgconfig

compiler.cxx_standard   2011
mpi.setup           require_fortran

use_autoreconf      yes
configure.args      home=${worksrcpath} --disable-mpi

# add missing arch flags to one Makefile
patchfiles-append   patch-Makefile.am.diff

if {!${universal_possible} || ![variant_isset universal]} {
    post-configure {
        if {${build_arch} eq "arm64" || ${build_arch} eq "x86_64" || ${build_arch} eq "ppc64"} {
            set arch_flag -m64
        } else {
            set arch_flag -m32
        }
        reinplace \
            "s|@MACPORTS_ARCH_FLAGS@|${arch_flag}|g" \
            ${worksrcpath}/PARPACK/SRC/MPI/Makefile
    }
} else {
    post-configure {
        foreach arch ${configure.universal_archs} {
            reinplace \
                "s|@MACPORTS_ARCH_FLAGS@|[muniversal_get_arch_flag ${arch} fortran]|g" \
                ${worksrcpath}-${arch}/PARPACK/SRC/MPI/Makefile
        }
    }
}

if {!${universal_possible} || ![variant_isset universal]} {
    if {${build_arch} eq "arm64" || ${build_arch} eq "x86_64" || ${build_arch} eq "ppc64"} {
        configure.fflags-append -m64
    } else {
        configure.fflags-append -m32
    }
    if { ${compilers.gcc_default} eq "gcc10"} {
        configure.fflags-append -fallow-argument-mismatch
    }
}

# LDFLAGS needs to be cleared to avoid it having a "-arch" option, considered illegal by gfortran
# also, if it has ${prefix}/lib it will prevent +accelerate from working if atlas is present.
configure.args-append LDFLAGS=''

# Enable ISO_C_BINDING support.
# This requires compiler support, and is supported by GNU Fortran 4.3 or later.
configure.args-append --enable-icb

pre-configure {
    configure.args-append --with-blas="-L${prefix}/lib ${linalglib}"

    if {[mpi_variant_isset]} {
        configure.args-delete  --disable-mpi
        configure.args-append  --enable-mpi
        configure.args-append  F77=${mpi.f77} \
                               MPIF77=${mpi.f77}
    }
}

# Fortran compilers can not cross-compile
if {${os.arch} eq "i386"} {
    set universal_archs_supported "i386 x86_64"
} else {
    set universal_archs_supported "ppc ppc64"
}

test.run    yes
test.target check
