diff options
author | Toyohisa Kameyama <kameyama@riken.jp> | 2019-07-09 08:57:17 +0900 |
---|---|---|
committer | Peter Scheibel <scheibel1@llnl.gov> | 2019-07-08 16:57:17 -0700 |
commit | a718d8af083c7ce6f376e9801084bbe02669e7b9 (patch) | |
tree | 2a87924db62a5e08b41720db8077c340a3792926 /var | |
parent | 68dd327d62e2c3cc4afbac58a23e303e59426ec0 (diff) | |
download | spack-a718d8af083c7ce6f376e9801084bbe02669e7b9.tar.gz spack-a718d8af083c7ce6f376e9801084bbe02669e7b9.tar.bz2 spack-a718d8af083c7ce6f376e9801084bbe02669e7b9.tar.xz spack-a718d8af083c7ce6f376e9801084bbe02669e7b9.zip |
zoltan: use autotools for new architecture host (#11924)
* 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
Diffstat (limited to 'var')
-rw-r--r-- | var/spack/repos/builtin/packages/zoltan/package.py | 126 |
1 files changed, 71 insertions, 55 deletions
diff --git a/var/spack/repos/builtin/packages/zoltan/package.py b/var/spack/repos/builtin/packages/zoltan/package.py index 077396c9ea..d2d6ef2337 100644 --- a/var/spack/repos/builtin/packages/zoltan/package.py +++ b/var/spack/repos/builtin/packages/zoltan/package.py @@ -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 @@ -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'), @@ -63,8 +89,10 @@ class Zoltan(Package): ] 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') @@ -72,66 +100,54 @@ class Zoltan(Package): 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' |