--- Portfile.orig	2009-04-10 10:59:30.000000000 -0700
+++ Portfile	2009-04-27 18:30:14.000000000 -0700
@@ -4,6 +4,7 @@
 
 name		SuiteSparse
 version		3.3.0
+revision        1
 categories	math science
 maintainers     stechert
 platforms	darwin
@@ -23,10 +24,29 @@
             sha1    f7496a4e1bdc6e915a45d69e2321f80856b0b4ff \
             rmd160  20645aac5828655424ef9036da0ab40a3709c0d9
 
+array set sub_version {
+	AMD            2.2.0
+	CAMD           2.2.0
+	COLAMD         2.7.1
+	CCOLAMD        2.7.1
+	CHOLMOD	       1.7.1
+	CSparse	       2.2.3
+	CXSparse       2.2.3
+	KLU            1.1.0
+	BTF            1.0.1
+	LDL	       2.0.1
+	UMFPACK	       5.3.0
+	RBio	       1.1.1
+	UFcollection   1.2.0
+	LINFACTOR      1.1.0
+	MESHND         1.1.1
+	SSMULT         2.0.0
+	SPQR           1.1.1
+}
+
 # cflags recommended for Macs in ${worksrcpath}/UFconfig/UFconfig.mk
 configure.cflags -O3 -fno-common -no-cpp-precomp -fexceptions
 
-use_configure	no
 build.target
 
 post-patch {
@@ -52,11 +72,9 @@
 		${worksrcpath}/KLU/Include/klu_version.h
 }
 
-post-configure	{
+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 \
@@ -84,20 +102,95 @@
 	reinplace -E \
 		"s|^METIS = .*$|METIS = ${prefix}/lib/libmetis.a|g" \
 		${worksrcpath}/UFconfig/UFconfig.mk
+
+	# LDL does not get built because of:
+	#     make[1]: Nothing to be done for `default'.
+	reinplace "s|demo:|demo: Makefile|" \
+		${worksrcpath}/LDL/Makefile
 }
 
 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
+
+	# Do not install cerbla library.
+	foreach lname {AMD BTF CAMD CCOLAMD COLAMD CHOLMOD CSparse CXSparse KLU LDL SPQR UMFPACK} {
+
+		set ldir ${worksrcpath}/${lname}/Lib
+
+		foreach lib [glob -directory ${ldir} -tails *.a] {
+			xinstall -m 0644 ${ldir}/${lib} ${destroot}${prefix}/lib
+
+			file mkdir ${ldir}/MacPorts_Temp
+
+			if { ! [variant_isset universal] } {
+				system "cd ${ldir}/MacPorts_Temp && /usr/bin/ar -x ../${lib}"
+			} else {
+				foreach arch ${universal_archs} {
+					file mkdir ${ldir}/MacPorts_Temp/${arch}
+					system "cd ${ldir}/MacPorts_Temp/${arch} && /usr/bin/lipo -thin ${arch} ../../${lib} -output ${lib}"
+					system "cd ${ldir}/MacPorts_Temp/${arch} && /usr/bin/ar -x ${lib}"
+				}
+				foreach ofile [glob -tails -directory ${ldir}/MacPorts_Temp/[lindex ${universal_archs} 0] *.o] {
+					system "cd ${ldir}/MacPorts_Temp && lipo -create */${ofile} -output ${ofile}"
+				}
+			}
+
+			set insl_ver $sub_version(${lname})
+			set cmpt_ver [join [lrange [split ${insl_ver} .] 0 0] .]
+
+			set base [file rootname ${lib}]
+
+			set install_name ${prefix}/lib/${base}.${cmpt_ver}.dylib
+
+			set linker ""
+
+			if { ${lname}=="SPQR" } {
+				lappend linker ${configure.cxx}
+			} else {
+				lappend linker ${configure.cc}
+			}
+
+			eval lappend linker -dynamiclib ${configure.ldflags}
+			lappend linker -install_name ${install_name} -current_version ${insl_ver} -compatibility_version ${cmpt_ver}
+			lappend linker -o ${base}.${insl_ver}.dylib *.o
+
+			if { ${lname}=="CHOLMOD" } {
+				lappend linker -L${destroot}${prefix}/lib
+				lappend linker -lcolamd
+				lappend linker -lccolamd
+				lappend linker -lcamd
+				lappend linker -lamd
+				lappend linker -lmetis
+				lappend linker -framework Accelerate
+			} elseif { ${lname}=="KLU" } {
+				lappend linker -L${destroot}${prefix}/lib
+				lappend linker -lbtf
+				lappend linker -lamd
+				lappend linker -lcolamd
+			} elseif { ${lname}=="SPQR" } {
+				lappend linker -L${destroot}${prefix}/lib
+				lappend linker -lcholmod
+				lappend linker -framework Accelerate
+			} elseif { ${lname}=="UMFPACK" } {
+				lappend linker -L${destroot}${prefix}/lib
+				lappend linker -lamd
+				lappend linker -framework Accelerate
+			}
+
+			system "cd ${ldir}/MacPorts_Temp && ${linker}"
+			xinstall -m 0755 ${ldir}/MacPorts_Temp/${base}.${insl_ver}.dylib ${destroot}${prefix}/lib
+
+			ln -sf ${base}.${insl_ver}.dylib ${destroot}${prefix}/lib/${base}.dylib
+			ln -sf ${base}.${insl_ver}.dylib ${destroot}${prefix}/lib/${base}.[join [lrange [split ${insl_ver} .] 0 0] .].dylib
+			ln -sf ${base}.${insl_ver}.dylib ${destroot}${prefix}/lib/${base}.[join [lrange [split ${insl_ver} .] 0 1] .].dylib
+		}
+	}
+
+	xinstall -m 755 -d ${destroot}${prefix}/include/suitesparse
 	eval xinstall -m 644 \
 		[glob ${worksrcpath}/*/Include/*.h] \
 		${worksrcpath}/UFconfig/UFconfig.h \
-		${destroot}${prefix}/include/ufsparse
+		${destroot}${prefix}/include/suitesparse
 	
 	xinstall -m 755 -d ${destroot}${prefix}/share/doc/${name}
 	eval xinstall -m 644 \
@@ -105,5 +198,19 @@
 		${destroot}${prefix}/share/doc/${name}
 }
 
+variant universal {
+	eval configure.cflags-append  ${configure.universal_cflags}
+	eval configure.ldflags-append  ${configure.universal_ldflags}
+	post-configure {
+		reinplace "s|AR = ar cr|AR = ar crs|" \
+			${worksrcpath}/UFconfig/UFconfig.mk
+
+		reinplace -E \
+			"s|^CFLAGS = |CFLAGS = ${configure.universal_cflags} |g" \
+			${worksrcpath}/CSparse/Demo/Makefile \
+			${worksrcpath}/CSparse/Lib/Makefile
+	}
+}
+
 livecheck.check	regex
 livecheck.regex	${name}-(\\d+(\\.\\d+)*)${extract.suffix}
