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

name                        mumps
version                     5.9.0
revision                    0
categories                  math
license                     CeCILL-C
maintainers                 {mcalhoun @MarcusCalhoun-Lopez} openmaintainer
description                 MUltifrontal Massively Parallel sparse direct Solver
long_description            MUMPS: a parallel sparse direct solver

depends_lib                 port:scotch \
                            port:scalapack \
                            port:metis \
                            port:parmetis

homepage                    https://mumps-solver.org
master_sites                ${homepage}

distname                    MUMPS_${version}

checksums                   rmd160  59eb8c3c7fb780e88b95461b9ca6c86a35fc18d5 \
                            sha256  02c6efdb91749ec0f82351d40f3f860547272a1eb1d899126a4265b4d6bcc4ca \
                            size    4976904

conflicts_build-append      ${name}

post-extract {
    file copy ${worksrcpath}/Make.inc/Makefile.inc.generic ${worksrcpath}/Makefile.inc
}

mpi.setup                   require \
                            require_fortran

mpi.enforce_variant         scalapack

linalg.setup                blas_only

# Xcode clang of 10.7 fails with error: invalid instruction mnemonic 'cvtsi2ssl'
compiler.blacklist-append \
                    {clang < 500} *gcc-4.* macports-gcc-5 macports-gcc-6

# see https://listes.ens-lyon.fr/sympa/arc/mumps-users/2020-05/msg00000.html
compilers.allow_arguments_mismatch  yes

# when using a non-GCC compiler, avoid:
#     Undefined symbols for architecture i386:
#       "___divmoddi4", referenced from:
#           _dmumps_facto_root_ in libdmumps.a(dfac_root_parallel.o)
#     ld: symbol(s) not found for architecture i386
# see https://gitlab.haskell.org/ghc/ghc/issues/15094
lappend merger_configure_fcflags(i386) \
                            -fno-expensive-optimizations
if {(!${universal_possible} || ![variant_isset universal]) && ${build_arch} eq "i386"} {
    configure.fflags-append -fno-expensive-optimizations
}

if {!${universal_possible} || ![variant_isset universal]} {
    # find correct scotch Fortran header
    if {[file exists ${prefix}/include/${build_arch}]} {
        configure.cppflags-prepend -I${prefix}/include/${build_arch}
    }
} else {
    # find correct scotch Fortran header
    foreach arch ${configure.universal_archs} {
        if {[file exists ${prefix}/include/${arch}]} {
            lappend merger_configure_cppflags(${arch}) -I${prefix}/include/${arch}
        }
    }
}

use_parallel_build          no

build.target                all allshared
build.args-append           LIBEXT_SHARED=.dylib SONAME=-install_name \
                            FL='\$(FC)' \
                            INCPAR= \
                            LAPACK= \
                            LMETIS="-lparmetis -lmetis" \
                            LSCOTCH="-lptesmumps -lptscotch -lptscotcherr -lscotch" \
                            OPTC="${configure.cppflags} ${configure.cflags}" \
                            OPTF="${configure.cppflags} ${configure.fflags}" \
                            OPTL="${configure.ldflags}" \
                            ORDERINGSF="-Dscotch -Dmetis -Dpord -Dptscotch -Dparmetis" \
                            SCALAP='-lscalapack \$(LIBBLAS)'

pre-build {
    build.args-append       LIBBLAS=${linalglib}
}

destroot {
    xinstall -m 644 {*}[glob ${worksrcpath}/include/*.h] ${destroot}${prefix}/include
    xinstall -m 644 {*}[glob ${worksrcpath}/lib/*.a] ${destroot}${prefix}/lib
    xinstall -m 644 {*}[glob ${worksrcpath}/lib/*.dylib] ${destroot}${prefix}/lib
    foreach f [glob -tails -directory ${destroot} ${prefix}/lib/*.dylib] {
        system "install_name_tool -id /$f ${destroot}/$f"
    }
    system "install_name_tool \
        -change libpord.dylib ${prefix}/lib/libpord.dylib \
        ${destroot}${prefix}/lib/libmumps_common.dylib"
    foreach f [glob -tails -directory ${destroot} ${prefix}/lib/lib*mumps.dylib] {
        system "install_name_tool \
            -change libmumps_common.dylib ${prefix}/lib/libmumps_common.dylib \
            -change libpord.dylib ${prefix}/lib/libpord.dylib \
            ${destroot}/$f"
    }
}

livecheck.url               ${homepage}/index.php?page=dwnld
livecheck.regex             {>(\d+(?:\.\d+)*)<}

test.run                    yes
test.target                 all
test.args-append            LPORD=../lib/libpord.a

post-test {
    set runcmd "${mpi.exec} -np ${build.jobs}"

    system -W ${worksrcpath}/examples "${runcmd} ./ssimpletest < input_simpletest_real"
    system -W ${worksrcpath}/examples "${runcmd} ./dsimpletest < input_simpletest_real"
    system -W ${worksrcpath}/examples "${runcmd} ./csimpletest < input_simpletest_cmplx"
    system -W ${worksrcpath}/examples "${runcmd} ./zsimpletest < input_simpletest_cmplx"
    system -W ${worksrcpath}/examples "${runcmd} ./c_example"
}
