# -*- 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
# $Id: Portfile 89910 2012-02-14 22:40:27Z ryandesign@macports.org $

PortSystem          1.0

name                SuiteSparse
epoch               20120107
version             3.4.0
revision            3
categories          math science
platforms           darwin
maintainers         nomaintainer
license             GPL-2+ LGPL-2.1+

description         Sparse matrix routines

long_description    SuiteSparse is a single archive that contains all packages \
                    authored by Tim Davis.

homepage            http://www.cise.ufl.edu/research/sparse/SuiteSparse/
master_sites        http://www.cise.ufl.edu/research/sparse/SuiteSparse/
worksrcdir          ${name}

checksums           md5     e59dcabc9173b1ba1b3659ae147006b8 \
                    sha1    6de027d48a573659b40ddf57c10e32b39ab034c6 \
                    rmd160  77ff7376691d2bc8581de6ae89f246cb289b2708 

patchfiles          makefiles.patch \
                    UFconfig_UFconfig.mk-patch

use_configure       no

# cflags recommended for Macs in ${worksrcpath}/UFconfig/UFconfig.mk
configure.optflags  -O3 -fno-common -fexceptions

variant universal {}
if {[variant_isset universal]} {
    append configure.cflags " " ${configure.universal_cflags}
} else {
    append configure.cflags " " ${configure.cc_archflags}
}

use_parallel_build  no

build.target

post-patch {
    if {[variant_isset metis]} {
        # Use the MacPorts version rather than extracting copy in source dir
        
        # -I$(METIS_PATH)/Lib -> -I$(METIS_PATH)/include
        reinplace \
            "s|-I\$(METIS_PATH)/Lib|-I\$(METIS_PATH)/include|g" \
            ${worksrcpath}/CHOLMOD/Lib/Makefile
        
        # #include "metis.h" -> #include <metis/metis.h>
        reinplace \
            "s|#include \"metis.h\"|#include <metis/metis.h>|g" \
            ${worksrcpath}/CHOLMOD/Partition/cholmod_metis.c
    }
    
    # klu_version.h defines Real and Imag which conflicts with math.h on ppc
    reinplace -E \
        "s|(\[^a-zA-Z\])Real(\[^a-zA-Z\])|\\1RealPart\\2|g" \
        ${worksrcpath}/KLU/Include/klu_version.h
    reinplace -E \
        "s|(\[^a-zA-Z\])Imag(\[^a-zA-Z\])|\\1ImagPart\\2|g" \
        ${worksrcpath}/KLU/Include/klu_version.h
    # ranlib after ar
    # THESE LINES NEED TO HAVE TABS ENCODED IN THE PORTFILE
    reinplace "s|ccolamd_global\.o|ccolamd_global.o\\
	- \$(RANLIB) libccolamd.a|" ${worksrcpath}/CCOLAMD/Lib/Makefile
    reinplace "s|colamd_global\.o|colamd_global.o\\
	- \$(RANLIB) libcolamd.a|" ${worksrcpath}/COLAMD/Lib/Makefile
}

post-configure {
    # SuiteSparse does not use configure, so the variables must be
    #    set manually.
    # This is done in post-configure so that ${configure.cc} is
    #    set to its default value.
    reinplace -E \
        "s|^CC = .*$|CC = ${configure.cc}|g" \
        ${worksrcpath}/UFconfig/UFconfig.mk \
        ${worksrcpath}/CSparse/Demo/Makefile \
        ${worksrcpath}/CSparse/Lib/Makefile
    reinplace -E \
        "s|^CPLUSPLUS = .*$|CPLUSPLUS = ${configure.cxx}|g" \
        ${worksrcpath}/UFconfig/UFconfig.mk
    reinplace -E \
        "s|^CFLAGS = .*$|CFLAGS = ${configure.cflags}|g" \
        ${worksrcpath}/UFconfig/UFconfig.mk
    reinplace -E \
        "s|^CFLAGS = -O|CFLAGS = ${configure.cflags}|g" \
        ${worksrcpath}/CSparse/Demo/Makefile \
        ${worksrcpath}/CSparse/Lib/Makefile
    reinplace -E \
        "s|^BLAS = .*$|BLAS = -framework Accelerate|g" \
        ${worksrcpath}/UFconfig/UFconfig.mk
    reinplace -E \
        "s|^LAPACK = .*$|LAPACK = -framework Accelerate|g" \
        ${worksrcpath}/UFconfig/UFconfig.mk
    reinplace "s|(CC)|(CC) \$(CFLAGS)|" ${worksrcpath}/CXSparse/Demo/Makefile
    
    if {[variant_isset metis]} {
        reinplace -E \
            "s|^METIS_PATH = .*$|METIS_PATH = ${prefix}|g" \
            ${worksrcpath}/UFconfig/UFconfig.mk
        reinplace -E \
            "s|^METIS = .*$|METIS = ${prefix}/lib/libmetis.a|g" \
            ${worksrcpath}/UFconfig/UFconfig.mk
    }
}

destroot {
    # SuiteSparse does not support "make install"
    
    eval xinstall -m 644 \
        [glob ${worksrcpath}/*/Lib/*.a] \
        ${destroot}${prefix}/lib
    
    xinstall -m 755 -d ${destroot}${prefix}/include/ufsparse
    eval xinstall -m 644 \
        [glob ${worksrcpath}/*/Include/*.h] \
        [glob ${worksrcpath}/*/Include/*.hpp] \
        ${worksrcpath}/UFconfig/UFconfig.h \
        ${destroot}${prefix}/include/ufsparse
    
    xinstall -m 755 -d ${destroot}${prefix}/share/doc/${name}
    eval xinstall -m 644 \
        [glob ${worksrcpath}/*/Doc/*.pdf] \
        ${destroot}${prefix}/share/doc/${name}
}

variant metis description {Use METIS (not distributable)} {
    depends_build       port:metis
    patchfiles-delete   UFconfig_UFconfig.mk-patch
}

livecheck.type      regex
livecheck.regex     ${name}-(\\d+(\\.\\d+)*)${extract.suffix}
