# -*- 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$ PortSystem 1.0 PortGroup compilers 1.0 name SuiteSparse epoch 20120107 version 4.2.1 revision 4 categories math science platforms darwin maintainers michaelld openmaintainer license GPL-2+ LGPL-2.1+ compilers.choose cc cpp cxx compilers.setup description Sparse matrix routines long_description SuiteSparse is a single archive that contains all packages \ authored by Tim Davis. homepage http://faculty.cse.tamu.edu/davis/suitesparse.html master_sites http://faculty.cse.tamu.edu/davis/SuiteSparse/ distname SuiteSparse-${version} worksrcdir ${name} checksums rmd160 9a2fa65845564efad79311f2ff8573217bd79f0d \ sha256 e8023850bc30742e20a3623fabda02421cb5774b980e3e7c9c6d9e7e864946bd # fix Mac configuration file patchfiles-append patch-SuiteSparce_config_Mac.mk.diff # get path ordering correct patchfiles-append patch-CHOLMOD_Lib_Makefile.diff # Real -> RealPart; Imag -> ImagPart to work with some PPC patchfiles-append patch-KLU-Include-klu_version.h.diff # use , and a METIS-specific type (idx_t instead of # idxtype) and routine (METIS_ComputeVertexSeparator in place of # METIS_NodeComputeSeparator) patchfiles-append patch-CHOLMOD-Partition-choldmod_metis.c.diff # do not try to build METIS patchfiles-append \ patch-CHOLMOD-Demo-Makefile.diff \ patch-SPQR-Demo-Makefile.diff \ patch-UMFPACK-Demo-Makefile.diff configure { # SuiteSparse does not use a configure script, so we have to set # configure variables manually. set makefile ${worksrcpath}/SuiteSparse_config/SuiteSparse_config.mk copy -force \ ${worksrcpath}/SuiteSparse_config/SuiteSparse_config_Mac.mk \ ${makefile} # destroot, pretix, and build arch(es) reinplace "s|@DESTROOT@|${destroot}|g" ${makefile} reinplace "s|@PREFIX@|${prefix}|g" ${makefile} reinplace "s|@ARCHES@|\$(TARGET_ARCH)|g" ${makefile} # select BLAS and LAPACK set BLAS "${prefix}/lib/vecLibFort.dylib" if {[variant_isset atlas]} { # Threaded lib gets priority over non-threaded (ppc) if {[file exists ${prefix}/lib/libtatlas.dylib]} { # linking to the threaded dylib, is there a reason to use non-threaded? set BLAS "${prefix}/lib/libtatlas.dylib" } else { set BLAS "${prefix}/lib/libsatlas.dylib" } } elseif {[variant_isset openblas]} { set BLAS "${prefix}/lib/libopenblas.dylib" } reinplace "s|@BLAS_LAPACK@|${BLAS}|g" ${makefile} # select METIS usage, per the variant set METIS_PATH "" set METIS "" set CHOLMOD_CONFIG "-DNPARTITION" if {[variant_isset metis]} { set METIS_PATH "${prefix}" set METIS "${prefix}/lib/libmetis.dylib" set CHOLMOD_CONFIG "\$(GPU_CONFIG)" } reinplace "s|@METIS_PATH@|${METIS_PATH}|g" ${makefile} reinplace "s|@METIS@|${METIS}|g" ${makefile} reinplace "s|@CHOLMOD_CONFIG@|${CHOLMOD_CONFIG}|g" ${makefile} } use_parallel_build no pre-build { build.args-append \ CC="${configure.cc}" \ CXX="${configure.cxx}" \ CFLAGS="${configure.cflags}" \ TARGET_ARCH="[get_canonical_archflags]" } build.target default post-destroot { # Create a dylib from all .a static libs set metis "" if {[variant_isset metis]} { catch {exec port installed metis} output if {[string match *+openmp* ${output}]} { # metis installed with +openmp variant set metis "-lmetis -fopenmp" } else { set metis "-lmetis" } } set atlas "-lvecLibFort" if {[variant_isset atlas]} { if {[file exists ${prefix}/lib/libtatlas.dylib]} { set atlas "-ltatlas" } else { set atlas "-lsatlas" } } elseif {[variant_isset openblas]} { set atlas "-lopenblas" } set major [join [lrange [split ${version} .] 0 0] .] set libs [list libamd.dylib libbtf.dylib libcamd.dylib libccolamd.dylib \ libcholmod.dylib libcolamd.dylib libcxsparse.dylib \ libklu.dylib libldl.dylib librbio.dylib libspqr.dylib \ libsuitesparseconfig.dylib libumfpack.dylib] # check the version number of each package set sversion(amd) 2.4.0 set sversion(camd) 2.4.0 set sversion(btf) 1.2.0 set sversion(ccolamd) 2.9.0 set sversion(colamd) 2.9.0 set sversion(cholmod) 3.0.0 set sversion(cxsparse) 3.1.3 set sversion(klu) 1.3.0 set sversion(ldl) 2.2.0 set sversion(rbio) 2.2.0 set sversion(spqr) 1.3.2 set sversion(umfpack) 5.7.0 system -W ${worksrcpath}/SuiteSparse_config "\ ${configure.cxx} -Wall ${configure.cflags} [get_canonical_archflags cxx] \ -dynamiclib -Wl,-all_load \ -o libsuitesparseconfig.${version}.dylib \ -compatibility_version ${major} -current_version ${version} \ -install_name ${prefix}/lib/libsuitesparseconfig.${version}.dylib *.a" foreach l {AMD BTF CAMD CCOLAMD COLAMD CXSparse LDL RBio} { system -W ${worksrcpath}/$l/Lib "\ ${configure.cxx} -Wall ${configure.cflags} [get_canonical_archflags cxx] \ -dynamiclib -Wl,-all_load -L${prefix}/lib ${atlas} ${metis} \ ../../SuiteSparse_config/libsuitesparseconfig.${version}.dylib \ -o lib[string tolower $l].$sversion([string tolower $l]).dylib \ -compatibility_version \ [join [lrange [split $sversion([string tolower $l]) .] 0 0] .] \ -current_version $sversion([string tolower $l]) \ -install_name ${prefix}/lib/lib[string tolower $l].$sversion([string tolower $l]).dylib \ *.o" } system -W ${worksrcpath}/CHOLMOD/Lib "\ ${configure.cxx} -Wall ${configure.cflags} [get_canonical_archflags cxx] \ -dynamiclib -Wl,-all_load -L${prefix}/lib ${atlas} ${metis} \ ../../SuiteSparse_config/libsuitesparseconfig.${version}.dylib \ ../../AMD/Lib/libamd.$sversion(amd).dylib \ ../../CAMD/Lib/libcamd.$sversion(camd).dylib \ ../../COLAMD/Lib/libcolamd.$sversion(colamd).dylib \ ../../CCOLAMD/Lib/libccolamd.$sversion(ccolamd).dylib \ -o libcholmod.$sversion(cholmod).dylib \ -compatibility_version \ [join [lrange [split $sversion(cholmod) .] 0 0] .] \ -current_version $sversion(cholmod) \ -install_name ${prefix}/lib/libcholmod.$sversion(cholmod).dylib \ *.o" system -W ${worksrcpath}/KLU/Lib "\ ${configure.cxx} -Wall ${configure.cflags} [get_canonical_archflags cxx] \ -dynamiclib -Wl,-all_load -L${prefix}/lib ${atlas} ${metis} \ ../../SuiteSparse_config/libsuitesparseconfig.${version}.dylib \ ../../AMD/Lib/libamd.$sversion(amd).dylib \ ../../BTF/Lib/libbtf.$sversion(btf).dylib \ ../../COLAMD/Lib/libcolamd.$sversion(colamd).dylib \ -o libklu.$sversion(klu).dylib \ -compatibility_version \ [join [lrange [split $sversion(klu) .] 0 0] .] \ -install_name ${prefix}/lib/libklu.$sversion(klu).dylib \ *.o" system -W ${worksrcpath}/SPQR/Lib "\ ${configure.cxx} -Wall ${configure.cflags} [get_canonical_archflags cxx] \ -dynamiclib -Wl,-all_load -L${prefix}/lib ${atlas} ${metis} \ ../../SuiteSparse_config/libsuitesparseconfig.${version}.dylib \ ../../AMD/Lib/libamd.$sversion(amd).dylib \ ../../CHOLMOD/Lib/libcholmod.$sversion(cholmod).dylib \ ../../COLAMD/Lib/libcolamd.$sversion(colamd).dylib \ -o libspqr.$sversion(spqr).dylib \ -compatibility_version \ [join [lrange [split $sversion(spqr) .] 0 0] .] \ -install_name ${prefix}/lib/libspqr.$sversion(spqr).dylib \ *.o" system -W ${worksrcpath}/UMFPACK/Lib "\ ${configure.cxx} -Wall ${configure.cflags} [get_canonical_archflags cxx] \ -dynamiclib -Wl,-all_load -L${prefix}/lib ${atlas} ${metis} \ ../../SuiteSparse_config/libsuitesparseconfig.${version}.dylib \ ../../AMD/Lib/libamd.$sversion(amd).dylib \ ../../CHOLMOD/Lib/libcholmod.$sversion(cholmod).dylib \ -o libumfpack.$sversion(umfpack).dylib \ -compatibility_version \ [join [lrange [split $sversion(umfpack) .] 0 0] .] \ -install_name ${prefix}/lib/libumfpack.$sversion(umfpack).dylib \ *.o" copy ${worksrcpath}/SuiteSparse_config/libsuitesparseconfig.${version}.dylib ${destroot}${prefix}/lib ln -s libsuitesparseconfig.${version}.dylib ${destroot}${prefix}/lib/libsuitesparseconfig.dylib foreach l {AMD BTF CAMD CCOLAMD CHOLMOD COLAMD CXSparse KLU LDL RBio SPQR UMFPACK} { copy ${worksrcpath}/$l/Lib/lib[string tolower $l].$sversion([string tolower $l]).dylib ${destroot}${prefix}/lib ln -s lib[string tolower $l].$sversion([string tolower $l]).dylib ${destroot}${prefix}/lib/lib[string tolower $l].dylib } system -W ${destroot}${prefix}/lib "\ ${configure.cxx} -Wall ${configure.cflags} [get_canonical_archflags cxx] -dynamiclib -Wl,-all_load \ -L${prefix}/lib ${atlas} ${metis} ${libs} -o lib${name}.${version}.dylib \ -compatibility_version ${major} -current_version ${version} \ -install_name ${prefix}/lib/lib${name}.${version}.dylib" ln -s lib${name}.${version}.dylib ${destroot}${prefix}/lib/lib${name}.dylib ln -s lib${name}.${version}.dylib ${destroot}${prefix}/lib/lib${name}.${major}.dylib # install documentation 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 {Include METIS for graph partitioning and sparse matrix ordering} { depends_lib-append port:metis } variant accelerate description {use BLAS from Apple's Accelerate.framework} conflicts atlas openblas { depends_lib-append port:vecLibFort } variant atlas description {use BLAS from MacPorts' atlas port} conflicts accelerate openblas { depends_lib-append port:atlas # +atlas requires atlas to be installed without +nofortran # see: https://trac.macports.org/ticket/47007 PortGroup active_variants 1.1 require_active_variants port:atlas "" nofortran } variant openblas description {use BLAS from MacPorts' openblas port} conflicts accelerate atlas { depends_lib-append path:lib/libopenblas.dylib:OpenBLAS # LAPACK required PortGroup active_variants 1.1 require_active_variants path:lib/libopenblas.dylib:OpenBLAS lapack } if {![variant_isset accelerate] && ![variant_isset openblas] && ![variant_isset atlas] } { default_variants-append +accelerate } if {![variant_isset accelerate] && ![variant_isset openblas] && ![variant_isset atlas] } { ui_error "\n\nYou must select either the +accelerate, +atlas, or +openblas variant.\n" return -code error "Invalid variant selection" } livecheck.type regex livecheck.regex ${name}-(\\d+(\\.\\d+)*)${extract.suffix}