Merge pull request #338 from epfl-scitas/packages/metis
Improved packages : metis and parmetis
This commit is contained in:
		@@ -1,28 +1,83 @@
 | 
				
			|||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					# Copyright (c) 2013-2015, Lawrence Livermore National Security, LLC.
 | 
				
			||||||
 | 
					# Produced at the Lawrence Livermore National Laboratory.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This file is part of Spack.
 | 
				
			||||||
 | 
					# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
 | 
				
			||||||
 | 
					# LLNL-CODE-647188
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# For details, see https://github.com/llnl/spack
 | 
				
			||||||
 | 
					# Please also see the LICENSE file for our notice and the LGPL.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					# it under the terms of the GNU General Public License (as published by
 | 
				
			||||||
 | 
					# the Free Software Foundation) version 2.1 dated February 1999.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This program is distributed in the hope that it will be useful, but
 | 
				
			||||||
 | 
					# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
 | 
				
			||||||
 | 
					# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
 | 
				
			||||||
 | 
					# conditions of the GNU General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# You should have received a copy of the GNU Lesser General Public License
 | 
				
			||||||
 | 
					# along with this program; if not, write to the Free Software Foundation,
 | 
				
			||||||
 | 
					# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from spack import *
 | 
					from spack import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Metis(Package):
 | 
					 | 
				
			||||||
    """METIS is a set of serial programs for partitioning graphs,
 | 
					 | 
				
			||||||
       partitioning finite element meshes, and producing fill reducing
 | 
					 | 
				
			||||||
       orderings for sparse matrices. The algorithms implemented in
 | 
					 | 
				
			||||||
       METIS are based on the multilevel recursive-bisection,
 | 
					 | 
				
			||||||
       multilevel k-way, and multi-constraint partitioning schemes."""
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    homepage = "http://glaros.dtc.umn.edu/gkhome/metis/metis/overview"
 | 
					class Metis(Package):
 | 
				
			||||||
    url      = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.1.0.tar.gz"
 | 
					    """
 | 
				
			||||||
 | 
					    METIS is a set of serial programs for partitioning graphs, partitioning finite element meshes, and producing fill
 | 
				
			||||||
 | 
					    reducing orderings for sparse matrices. The algorithms implemented in METIS are based on the multilevel
 | 
				
			||||||
 | 
					    recursive-bisection, multilevel k-way, and multi-constraint partitioning schemes.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    homepage = 'http://glaros.dtc.umn.edu/gkhome/metis/metis/overview'
 | 
				
			||||||
 | 
					    url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.1.0.tar.gz"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    version('5.1.0', '5465e67079419a69e0116de24fce58fe')
 | 
					    version('5.1.0', '5465e67079419a69e0116de24fce58fe')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    depends_on("cmake @2.8:")   # build-time dependency
 | 
					    variant('shared', default=True, description='Enables the build of shared libraries')
 | 
				
			||||||
    depends_on('mpi')
 | 
					    variant('debug', default=False, description='Builds the library in debug mode')
 | 
				
			||||||
 | 
					    variant('gdb', default=False, description='Enables gdb support')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    variant('idx64', default=False, description='Use int64_t as default index type')
 | 
				
			||||||
 | 
					    variant('double', default=False, description='Use double precision floating point types')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    depends_on('cmake @2.8:')  # build-time dependency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    depends_on('gdb', when='+gdb')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def install(self, spec, prefix):
 | 
					    def install(self, spec, prefix):
 | 
				
			||||||
        cmake(".",
 | 
					 | 
				
			||||||
              '-DGKLIB_PATH=%s/GKlib' % pwd(),
 | 
					 | 
				
			||||||
              '-DSHARED=1',
 | 
					 | 
				
			||||||
              '-DCMAKE_C_COMPILER=mpicc',
 | 
					 | 
				
			||||||
              '-DCMAKE_CXX_COMPILER=mpicxx',
 | 
					 | 
				
			||||||
              '-DSHARED=1',
 | 
					 | 
				
			||||||
              *std_cmake_args)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        make()
 | 
					        options = []
 | 
				
			||||||
        make("install")
 | 
					        options.extend(std_cmake_args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        build_directory = join_path(self.stage.path, 'spack-build')
 | 
				
			||||||
 | 
					        source_directory = self.stage.source_path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        options.append('-DGKLIB_PATH:PATH={metis_source}/GKlib'.format(metis_source=source_directory))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+shared' in spec:
 | 
				
			||||||
 | 
					            options.append('-DSHARED:BOOL=ON')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+debug' in spec:
 | 
				
			||||||
 | 
					            options.extend(['-DDEBUG:BOOL=ON',
 | 
				
			||||||
 | 
					                            '-DCMAKE_BUILD_TYPE:STRING=Debug'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+gdb' in spec:
 | 
				
			||||||
 | 
					            options.append('-DGDB:BOOL=ON')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        metis_header = join_path(source_directory, 'include', 'metis.h')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+idx64' in spec:
 | 
				
			||||||
 | 
					            filter_file('IDXTYPEWIDTH 32', 'IDXTYPEWIDTH 64', metis_header)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+double' in spec:
 | 
				
			||||||
 | 
					            filter_file('REALTYPEWIDTH 32', 'REALTYPEWIDTH 64', metis_header)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with working_dir(build_directory, create=True):
 | 
				
			||||||
 | 
					            cmake(source_directory, *options)
 | 
				
			||||||
 | 
					            make()
 | 
				
			||||||
 | 
					            make("install")
 | 
				
			||||||
@@ -1,27 +1,95 @@
 | 
				
			|||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					# Copyright (c) 2013-2015, Lawrence Livermore National Security, LLC.
 | 
				
			||||||
 | 
					# Produced at the Lawrence Livermore National Laboratory.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This file is part of Spack.
 | 
				
			||||||
 | 
					# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
 | 
				
			||||||
 | 
					# LLNL-CODE-647188
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# For details, see https://github.com/llnl/spack
 | 
				
			||||||
 | 
					# Please also see the LICENSE file for our notice and the LGPL.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					# it under the terms of the GNU General Public License (as published by
 | 
				
			||||||
 | 
					# the Free Software Foundation) version 2.1 dated February 1999.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This program is distributed in the hope that it will be useful, but
 | 
				
			||||||
 | 
					# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
 | 
				
			||||||
 | 
					# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
 | 
				
			||||||
 | 
					# conditions of the GNU General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# You should have received a copy of the GNU Lesser General Public License
 | 
				
			||||||
 | 
					# along with this program; if not, write to the Free Software Foundation,
 | 
				
			||||||
 | 
					# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from spack import *
 | 
					from spack import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# FIXME : lot of code is duplicated from packages/metis/package.py . Inheriting from there may reduce
 | 
				
			||||||
 | 
					# FIXME : the installation rules to just a few lines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Parmetis(Package):
 | 
					class Parmetis(Package):
 | 
				
			||||||
    """ParMETIS is an MPI-based parallel library that implements a
 | 
					    """
 | 
				
			||||||
       variety of algorithms for partitioning unstructured graphs,
 | 
					    ParMETIS is an MPI-based parallel library that implements a variety of algorithms for partitioning unstructured
 | 
				
			||||||
       meshes, and for computing fill-reducing orderings of sparse
 | 
					    graphs, meshes, and for computing fill-reducing orderings of sparse matrices.
 | 
				
			||||||
       matrices."""
 | 
					    """
 | 
				
			||||||
    homepage = "http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview"
 | 
					    homepage = 'http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview'
 | 
				
			||||||
    url      = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-4.0.3.tar.gz"
 | 
					    url = 'http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-4.0.3.tar.gz'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    version('4.0.3', 'f69c479586bf6bb7aff6a9bc0c739628')
 | 
					    version('4.0.3', 'f69c479586bf6bb7aff6a9bc0c739628')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    depends_on('cmake @2.8:')   # build dependency
 | 
					    variant('shared', default=True, description='Enables the build of shared libraries')
 | 
				
			||||||
 | 
					    variant('debug', default=False, description='Builds the library in debug mode')
 | 
				
			||||||
 | 
					    variant('gdb', default=False, description='Enables gdb support')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    variant('idx64', default=False, description='Use int64_t as default index type')
 | 
				
			||||||
 | 
					    variant('double', default=False, description='Use double precision floating point types')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    depends_on('cmake @2.8:')  # build dependency
 | 
				
			||||||
    depends_on('mpi')
 | 
					    depends_on('mpi')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def install(self, spec, prefix):
 | 
					    # FIXME : this should conflict with metis as it builds its own version internally
 | 
				
			||||||
        cmake(".",
 | 
					 | 
				
			||||||
              '-DGKLIB_PATH=%s/metis/GKlib' % pwd(),
 | 
					 | 
				
			||||||
              '-DMETIS_PATH=%s/metis' % pwd(),
 | 
					 | 
				
			||||||
              '-DSHARED=1',
 | 
					 | 
				
			||||||
              '-DCMAKE_C_COMPILER=mpicc',
 | 
					 | 
				
			||||||
              '-DCMAKE_CXX_COMPILER=mpicxx',
 | 
					 | 
				
			||||||
              '-DSHARED=1',
 | 
					 | 
				
			||||||
              *std_cmake_args)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        make()
 | 
					    depends_on('gdb', when='+gdb')
 | 
				
			||||||
        make("install")
 | 
					
 | 
				
			||||||
 | 
					    def install(self, spec, prefix):
 | 
				
			||||||
 | 
					        options = []
 | 
				
			||||||
 | 
					        options.extend(std_cmake_args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        build_directory = join_path(self.stage.path, 'spack-build')
 | 
				
			||||||
 | 
					        source_directory = self.stage.source_path
 | 
				
			||||||
 | 
					        metis_source = join_path(source_directory, 'metis')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # FIXME : Once a contract is defined, MPI compilers should be retrieved indirectly via spec['mpi'] in case
 | 
				
			||||||
 | 
					        # FIXME : they use a non-standard name
 | 
				
			||||||
 | 
					        options.extend(['-DGKLIB_PATH:PATH={metis_source}/GKlib'.format(metis_source=metis_source),
 | 
				
			||||||
 | 
					                        '-DMETIS_PATH:PATH={metis_source}'.format(metis_source=metis_source),
 | 
				
			||||||
 | 
					                        '-DCMAKE_C_COMPILER:STRING=mpicc',
 | 
				
			||||||
 | 
					                        '-DCMAKE_CXX_COMPILER:STRING=mpicxx'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+shared' in spec:
 | 
				
			||||||
 | 
					            options.append('-DSHARED:BOOL=ON')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+debug' in spec:
 | 
				
			||||||
 | 
					            options.extend(['-DDEBUG:BOOL=ON',
 | 
				
			||||||
 | 
					                            '-DCMAKE_BUILD_TYPE:STRING=Debug'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+gdb' in spec:
 | 
				
			||||||
 | 
					            options.append('-DGDB:BOOL=ON')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        metis_header = join_path(metis_source, 'include', 'metis.h')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+idx64' in spec:
 | 
				
			||||||
 | 
					            filter_file('IDXTYPEWIDTH 32', 'IDXTYPEWIDTH 64', metis_header)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if '+double' in spec:
 | 
				
			||||||
 | 
					            filter_file('REALTYPEWIDTH 32', 'REALTYPEWIDTH 64', metis_header)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with working_dir(build_directory, create=True):
 | 
				
			||||||
 | 
					            cmake(source_directory, *options)
 | 
				
			||||||
 | 
					            make()
 | 
				
			||||||
 | 
					            make("install")
 | 
				
			||||||
 | 
					            # Parmetis build system doesn't allow for an external metis to be used, but doesn't copy the required
 | 
				
			||||||
 | 
					            # metis header either
 | 
				
			||||||
 | 
					            install(metis_header, self.prefix.include)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user