# $Id: Portfile 68542 2010-06-05 20:16:45Z mmoll@macports.org $

PortSystem 1.0
PortGroup  muniversal 1.0

name          arpack
version       1
revision      4
categories    math
platforms     darwin
maintainers		mmoll
description		Package for solving large scale eigenvalue problems
long_description  \
	ARPACK is a collection of Fortran77 subroutines designed to solve large \
	scale eigenvalue problems.
homepage      	http://www.caam.rice.edu/software/ARPACK
master_sites	${homepage}/SRC/
distfiles     arpack96.tar.gz patch.tar.gz
checksums     arpack96.tar.gz md5 fffaa970198b285676f4156cebc8626e \
	      patch.tar.gz md5 14830d758f195f272b8594a493501fa2

use_configure	no
worksrcdir	ARPACK
patchfiles	patch-arpack.diff

use_parallel_build	no

pre-fetch { 
	if {"darwin" == ${os.platform} && ${os.major} < 9} { 
		ui_error "${name} ${version} requires Mac OS X 10.5 or greater" 
		return -code error "incompatible Mac OS X version" 
	} 
}

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

if { ! [variant_isset universal]} {
	build.args-append home=${worksrcpath}
	if { ${build_arch}=="x86_64" || ${build_arch}=="ppc64" } {
		build.args-append FFLAGS='-O2 -m64'
	} else {
		build.args-append FFLAGS='-O2 -m32'
	}
} else {
	foreach arch {x86_64 i386 ppc ppc64} {
		set merger_build_args(${arch}) home=${worksrcpath}-${arch}
		if { ${arch}=="x86_64" || ${arch}=="ppc64" } {
			lappend merger_build_args(${arch}) FFLAGS='-O2 -m64'
		} else {
			lappend merger_build_args(${arch}) FFLAGS='-O2 -m32'
		}
	}

}

proc make_dylib { name lib_dir arch libs curVer } {
    global destroot prefix gccnumber

    set comVer [join [lrange [split ${curVer} '.'] 0 0] '.']

    set cmd "\
              /usr/bin/ld -arch ${arch} -dynamic -dylib -single_module -dead_strip \
              -x -all_load -L. -L${prefix}/lib/gcc${gccnumber}/${arch} -L${prefix}/lib/gcc${gccnumber} -L${prefix}/lib \
              -dylib_install_name ${prefix}/lib/lib${name}.${comVer}.dylib \
              -current_version ${curVer} \
              -compatibility_version ${comVer} \
              lib${name}.a -o lib${name}.${curVer}.dylib ${libs}"

    system "cd ${lib_dir} && ${cmd}"
}

pre-build {
	build.args-append FC=${configure.fc} MAKE=${build.cmd}
}

post-build {
    set curVer ${version}
    set comVer [join [lrange [split ${version} '.'] 0 1 ] '.']

    if { ![variant_isset universal] } {
        set archs ${build_arch}
    } else {
        set archs ${universal_archs_to_use}
    }

    foreach arch ${archs} {
        if { ![variant_isset universal] } {
            set dir ${worksrcpath}
        } else {
            set dir ${worksrcpath}-${arch}
        }

        make_dylib arpack ${dir} ${arch} "-latlas -llapack -lgfortran -lSystem" ${version}

        if { [variant_isset mpi] } {
            make_dylib parpack ${dir} ${arch} "-llapack -lblas -lgfortran -lmpi_f77 -lSystem -larpack.1" ${version}
        }
    }
}

post-configure {
        if { [variant_isset mpi] } {
            set stlibs "libarpack.a libparpack.a"
            set shlibs "libarpack.1.dylib libparpack.1.dylib"
        } else {
            set stlibs "libarpack.a"
            set shlibs "libarpack.1.dylib"
        }

        if { ![variant_isset universal] } {
            set fl [open ${worksrcpath}/Makefile "a"]
            puts ${fl} "\n.PHONY: install"
            puts ${fl} "install: ${stlibs} ${shlibs}"
            foreach lib ${stlibs} {
                puts ${fl} "\tinstall -m 644 -v ${lib} ${destroot}${prefix}/lib"
            }
            foreach lib ${shlibs} {
                puts ${fl} "\tinstall -m 755 -v ${lib} ${destroot}${prefix}/lib"
            }
            close ${fl}
        } else {
            foreach arch ${universal_archs_to_use} {
                set fl [open ${worksrcpath}-${arch}/Makefile "a"]
                puts ${fl} "\n.PHONY: install"
                puts ${fl} "install: ${stlibs} ${shlibs}"
                foreach lib ${stlibs} {
                    puts ${fl} "\tinstall -m 644 -v ${lib} ${destroot}-${arch}${prefix}/lib"
                }
                foreach lib ${shlibs} {
                    puts ${fl} "\tinstall -m 755 -v ${lib} ${destroot}-${arch}${prefix}/lib"
                }
                close ${fl}
            }
        }
}

variant gcc42 description {build with gfortran-mp-4.2} conflicts gcc43 gcc44 gcc45 universal {
	depends_build-append    port:gcc42
	configure.fc ${prefix}/bin/gfortran-mp-4.2
}

variant gcc43 description {build with gfortran-mp-4.3} conflicts gcc42 gcc44 gcc45 universal {
	depends_build-append    port:gcc43
	configure.fc ${prefix}/bin/gfortran-mp-4.3
}

variant gcc44 description {build with gfortran-mp-4.4} conflicts gcc42 gcc43 gcc45 {
	depends_build-append    port:gcc44
	configure.fc ${prefix}/bin/gfortran-mp-4.4
}

variant gcc45 description {build with gfortran-mp-4.5} conflicts gcc42 gcc43 gcc44 {
	depends_build-append    port:gcc45
	configure.fc ${prefix}/bin/gfortran-mp-4.5
}

if { ![variant_isset gcc42] && ![variant_isset gcc43] && ![variant_isset gcc44] && ![variant_isset gcc45] } {
	default_variants      +gcc44
}

if { [variant_isset gcc42] } {
  set gccversion    4.2
} elseif { [variant_isset gcc43] } {
  set gccversion    4.3
} elseif { [variant_isset gcc44] } {
  set gccversion    4.4
} else {
  set gccversion    4.5
}
set gccnumber       [join [split ${gccversion} .] ""]

variant mpi description {build PARPACK, the parallel eigenvalue solver library} conflicts universal {
  distfiles-append parpack96.tar.gz ppatch.tar.gz
  checksums-append parpack96.tar.gz md5 598d0453b938ccd99a078246be5927f3 \
  		   ppatch.tar.gz md5 e6f0d70dd99f719c0efee351d0875c96
	pre-fetch { 	 
	   if {![file exists ${prefix}/bin/openmpif77]} {
	     return -code error "Please install one of the following variants of the openmpi port: gcc42, gcc43, gcc44, gcc45."
	   }
	}
	pre-build { foreach entry [glob -directory ${worksrcpath}/PARPACK */MPI/mpif.h] { delete $entry } }

	depends_build port:openmpi
	configure.fc ${prefix}/bin/openmpif77
}



livecheck.type  none
