Skip to content

Commit

Permalink
zoltan: use autotools for new architecture host (spack#11924)
Browse files Browse the repository at this point in the history
* use autoreconf to regenerate configure script and config.guess for
  newer architectures
* Add perl build dependency for older versions. The required perl
  version is constrained because the perl script uses syntax that
  is deprecated in older versions
  • Loading branch information
Toyohisa Kameyama authored and scheibelp committed Jul 8, 2019
1 parent 68dd327 commit a718d8a
Showing 1 changed file with 71 additions and 55 deletions.
126 changes: 71 additions & 55 deletions var/spack/repos/builtin/packages/zoltan/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@

from spack import *
import re
import os
import glob


class Zoltan(Package):
class Zoltan(AutotoolsPackage):
"""The Zoltan library is a toolkit of parallel combinatorial algorithms
for parallel, unstructured, and/or adaptive scientific
applications. Zoltan's largest component is a suite of dynamic
Expand Down Expand Up @@ -43,15 +41,43 @@ class Zoltan(Package):
depends_on('parmetis@4:', when='+parmetis')
depends_on('metis', when='+parmetis')

depends_on('perl@:5.21', type='build', when='@:3.6')
depends_on('autoconf', type='build')
depends_on('automake', type='build')
depends_on('m4', type='build')

conflicts('+parmetis', when='~mpi')

def install(self, spec, prefix):
build_directory = 'spack-build'

@property
def configure_directory(self):
spec = self.spec

# FIXME: The older Zoltan versions fail to compile the F90 MPI wrappers
# because of some complicated generic type problem.
if spec.satisfies('@:3.6+fortran+mpi'):
raise RuntimeError(('Cannot build Zoltan v{0} with +fortran and '
'+mpi; please disable one of these features '
'or upgrade versions.').format(self.version))
if spec.satisfies('@:3.6'):
zoltan_path = 'Zoltan_v{0}'.format(self.version)
return zoltan_path
return '.'

@property
def parallel(self):
# NOTE: Earlier versions of Zoltan cannot be built in parallel
# because they contain nested Makefile dependency bugs.
return not self.spec.satisfies('@:3.6+fortran')

def autoreconf(self, spec, prefix):
autoreconf = which('autoreconf')
with working_dir(self.configure_directory):
autoreconf('-ivf')

def configure_args(self):
spec = self.spec

config_args = [
self.get_config_flag('f90interface', 'fortran'),
Expand All @@ -63,75 +89,65 @@ def install(self, spec, prefix):
]

if '+shared' in spec:
config_args.append('RANLIB=echo')
config_args.append('--with-ar=$(CXX) -shared $(LDFLAGS) -o')
config_args.extend([
'RANLIB=echo',
'--with-ar=$(CXX) -shared $(LDFLAGS) -o'
])
config_cflags.append(self.compiler.pic_flag)
if spec.satisfies('%gcc'):
config_args.append('--with-libs=-lgfortran')
if spec.satisfies('%intel'):
config_args.append('--with-libs=-lifcore')

if '+parmetis' in spec:
config_args.append('--with-parmetis')
config_args.append('--with-parmetis-libdir={0}'
.format(spec['parmetis'].prefix.lib))
config_args.append('--with-parmetis-incdir={0}'
.format(spec['parmetis'].prefix.include))
config_args.append('--with-incdirs=-I{0}'
.format(spec['metis'].prefix.include))
config_args.append('--with-ldflags=-L{0}'
.format(spec['metis'].prefix.lib))
parmetis_prefix = spec['parmetis'].prefix
config_args.extend([
'--with-parmetis',
'--with-parmetis-libdir={0}'.format(parmetis_prefix.lib),
'--with-parmetis-incdir={0}'.format(parmetis_prefix.include),
'--with-incdirs=-I{0}'.format(spec['metis'].prefix.include),
'--with-ldflags=-L{0}'.format(spec['metis'].prefix.lib)
])
if '+int64' in spec['metis']:
config_args.append('--with-id-type=ulong')
else:
config_args.append('--with-id-type=uint')

if '+mpi' in spec:
config_args.append('CC={0}'.format(spec['mpi'].mpicc))
config_args.append('CXX={0}'.format(spec['mpi'].mpicxx))
config_args.append('FC={0}'.format(spec['mpi'].mpifc))

config_args.append('--with-mpi={0}'.format(spec['mpi'].prefix))

# NOTE: Zoltan assumes that it's linking against an MPI library
# that can be found with '-lmpi' which isn't the case for many
# MPI packages. We rely on the MPI-wrappers to automatically add
# what is required for linking and thus pass an empty list of libs
config_args.append('--with-mpi-libs= ')
config_args.extend([
'CC={0}'.format(spec['mpi'].mpicc),
'CXX={0}'.format(spec['mpi'].mpicxx),
'FC={0}'.format(spec['mpi'].mpifc),
'--with-mpi={0}'.format(spec['mpi'].prefix),

# NOTE: Zoltan assumes that it's linking against an MPI library
# that can be found with '-lmpi' which isn't the case for many
# MPI packages. We rely on the MPI-wrappers to automatically
# add what is required for linking and thus pass an empty
# list of libs
'--with-mpi-libs= '
])

# NOTE: Early versions of Zoltan come packaged with a few embedded
# library packages (e.g. ParMETIS, Scotch), which messes with Spack's
# ability to descend directly into the package's source directory.
source_directory = self.stage.source_path
if spec.satisfies('@:3.6'):
zoltan_directory = 'Zoltan_v{0}'.format(self.version)
source_directory = join_path(source_directory, zoltan_directory)

build_directory = join_path(source_directory, 'build')
with working_dir(build_directory, create=True):
config = Executable(join_path(source_directory, 'configure'))
config(
'--prefix={0}'.format(prefix),
'--with-cflags={0}'.format(' '.join(config_cflags)),
'--with-cxxflags={0}'.format(' '.join(config_cflags)),
'--with-fcflags={0}'.format(' '.join(config_cflags)),
*config_args
)

# NOTE: Earlier versions of Zoltan cannot be built in parallel
# because they contain nested Makefile dependency bugs.
make(parallel=not spec.satisfies('@:3.6+fortran'))
make('install')

# NOTE: Unfortunately, Zoltan doesn't provide any configuration
# options for the extension of the output library files, so this
# script must change these extensions as a post-processing step.
if '+shared' in spec:
for lib_path in glob.glob(join_path(prefix, 'lib', '*.a')):
lib_static_name = os.path.basename(lib_path)
config_args.extend([
'--with-cflags={0}'.format(' '.join(config_cflags)),
'--with-cxxflags={0}'.format(' '.join(config_cflags)),
'--with-fcflags={0}'.format(' '.join(config_cflags))
])
return config_args

# NOTE: Unfortunately, Zoltan doesn't provide any configuration
# options for the extension of the output library files, so this
# script must change these extensions as a post-processing step.
@run_after('install')
def solib_install(self):
if '+shared' in self.spec:
for lib_path in find(self.spec.prefix.lib, 'lib*.a'):
lib_shared_name = re.sub(r'\.a$', '.{0}'.format(dso_suffix),
lib_static_name)
move(lib_path, join_path(prefix, 'lib', lib_shared_name))
lib_path)
move(lib_path, lib_shared_name)

def get_config_flag(self, flag_name, flag_variant):
flag_pre = 'en' if '+{0}'.format(flag_variant) in self.spec else 'dis'
Expand Down

0 comments on commit a718d8a

Please sign in to comment.