summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/nek5000/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'var/spack/repos/builtin/packages/nek5000/package.py')
-rw-r--r--var/spack/repos/builtin/packages/nek5000/package.py133
1 files changed, 9 insertions, 124 deletions
diff --git a/var/spack/repos/builtin/packages/nek5000/package.py b/var/spack/repos/builtin/packages/nek5000/package.py
index a522af8cf0..9e2af1d5fe 100644
--- a/var/spack/repos/builtin/packages/nek5000/package.py
+++ b/var/spack/repos/builtin/packages/nek5000/package.py
@@ -5,19 +5,9 @@
from spack import *
-import numbers
import os
-def is_integral(x):
- """Any integer value"""
- try:
- return isinstance(int(x), numbers.Integral) and \
- not isinstance(x, bool) and int(x) > 0
- except ValueError:
- return False
-
-
class Nek5000(Package):
"""A fast and scalable high-order solver for computational fluid
dynamics"""
@@ -40,33 +30,8 @@ class Nek5000(Package):
# TODO: add a variant 'blas' or 'external-blas' to enable the usage of
# Spack installed/configured blas.
- # Variant for MAXNEL, we need to read this from user
- variant(
- 'MAXNEL',
- default=150000,
- description='Maximum number of elements for Nek5000 tools.',
- values=is_integral
- )
-
- # Variants for Nek tools
- variant('genbox', default=True, description='Build genbox tool.')
- variant('int_tp', default=True, description='Build int_tp tool.')
- variant('n2to3', default=True, description='Build n2to3 tool.')
- variant('postnek', default=True, description='Build postnek tool.')
- variant('reatore2', default=True, description='Build reatore2 tool.')
- variant('genmap', default=True, description='Build genmap tool.')
- variant('nekmerge', default=True, description='Build nekmerge tool.')
- variant('prenek', default=True, description='Build prenek tool.')
-
# Dependencies
depends_on('mpi', when="+mpi")
- depends_on('libx11', when="+prenek")
- depends_on('libx11', when="+postnek")
- # libxt is needed for X11/Intrinsic.h but not for linking
- depends_on('libxt', when="+prenek")
- depends_on('xproto', when="+prenek")
- depends_on('libxt', when="+postnek")
- depends_on('visit', when="+visit")
@run_before('install')
def fortran_check(self):
@@ -83,7 +48,6 @@ class Nek5000(Package):
raise RuntimeError(msg)
def install(self, spec, prefix):
- tools_dir = 'tools'
bin_dir = 'bin'
# Do not use the Spack compiler wrappers.
@@ -93,101 +57,22 @@ class Nek5000(Package):
fflags = spec.compiler_flags['fflags']
cflags = spec.compiler_flags['cflags']
- if ('+prenek' in spec) or ('+postnek' in spec):
- libx11_h = find_headers('Xlib', spec['libx11'].prefix.include,
- recursive=True)
- if not libx11_h:
- raise RuntimeError('Xlib.h not found in %s' %
- spec['libx11'].prefix.include)
- cflags += ['-I%s' % os.path.dirname(libx11_h.directories[0])]
-
- xproto_h = find_headers('X', spec['xproto'].prefix.include,
- recursive=True)
- if not xproto_h:
- raise RuntimeError('X.h not found in %s' %
- spec['xproto'].prefix.include)
- cflags += ['-I%s' % os.path.dirname(xproto_h.directories[0])]
-
- libxt_h = find_headers('Intrinsic', spec['libxt'].prefix.include,
- recursive=True)
- if not libxt_h:
- raise RuntimeError('X11/Intrinsic.h not found in %s' %
- spec['libxt'].prefix.include)
- cflags += ['-I%s' % os.path.dirname(libxt_h.directories[0])]
+
if self.compiler.name in ['xl', 'xl_r']:
# Use '-qextname' to add underscores.
# Use '-WF,-qnotrigraph' to fix an error about a string: '... ??'
fflags += ['-qextname', '-WF,-qnotrigraph']
- fflags = ' '.join(fflags)
- cflags = ' '.join(cflags)
- # Build the tools, maketools copy them to Nek5000/bin by default.
- # We will then install Nek5000/bin under prefix after that.
- with working_dir(tools_dir):
- # Update the maketools script to use correct compilers
- filter_file(r'^#FC\s*=.*', 'FC="{0}"'.format(fc), 'maketools')
- filter_file(r'^#CC\s*=.*', 'CC="{0}"'.format(cc), 'maketools')
- if fflags:
- filter_file(r'^#FFLAGS=.*', 'FFLAGS="{0}"'.format(fflags),
- 'maketools')
- if cflags:
- filter_file(r'^#CFLAGS=.*', 'CFLAGS="{0}"'.format(cflags),
- 'maketools')
+ error = Executable(fc)('empty.f', output=str, error=str,
+ fail_on_error=False)
- if self.compiler.name in ['xl', 'xl_r']:
- # Patch 'maketools' to use '-qextname' when checking for
- # underscore becasue 'xl'/'xl_r' use this option to enable the
- # addition of the underscore.
- filter_file(r'^\$FC -c ', '$FC -qextname -c ', 'maketools')
-
- libx11_lib = find_libraries('libX11', spec['libx11'].prefix.lib,
- shared=True, recursive=True)
- if not libx11_lib:
- libx11_lib = \
- find_libraries('libX11', spec['libx11'].prefix.lib64,
- shared=True, recursive=True)
- if not libx11_lib:
- raise RuntimeError('libX11 not found in %s/{lib,lib64}' %
- spec['libx11'].prefix)
- # There is no other way to set the X11 library path except brute
- # force:
- filter_file(r'-L\$\(X\)', libx11_lib.search_flags,
- join_path('prenek', 'makefile'))
- filter_file(r'-L\$\(X\)', libx11_lib.search_flags,
- join_path('postnek', 'makefile'))
+ if 'gfortran' in error or 'GNU' in error or 'gfortran' in fc:
+ # Use '-std=legacy' to suppress an error that used to be a
+ # warning in previous versions of gfortran.
+ fflags += ['-std=legacy']
- if self.compiler.name in ['xl', 'xl_r']:
- # Use '-qextname' when compiling mxm.f
- filter_file(r'\$\(OLAGS\)', '-qextname $(OLAGS)',
- join_path('postnek', 'makefile'))
- # Define 'rename_' function that calls 'rename'
- with open(join_path('postnek', 'xdriver.c'), 'a') as xdriver:
- xdriver.write('\nvoid rename_(char *from, char *to)\n{\n'
- ' rename(from, to);\n}\n')
-
- maxnel = self.spec.variants['MAXNEL'].value
- filter_file(r'^#MAXNEL\s*=.*', 'MAXNEL=' + maxnel, 'maketools')
-
- maketools = Executable('./maketools')
-
- # Build the tools
- if '+genbox' in spec:
- maketools('genbox')
- # "ERROR: int_tp does not exist!"
- # if '+int_tp' in spec:
- # maketools('int_tp')
- if '+n2to3' in spec:
- maketools('n2to3')
- if '+postnek' in spec:
- maketools('postnek')
- if '+reatore2' in spec:
- maketools('reatore2')
- if '+genmap' in spec:
- maketools('genmap')
- if '+nekmerge' in spec:
- maketools('nekmerge')
- if '+prenek' in spec:
- maketools('prenek')
+ fflags = ' '.join(fflags)
+ cflags = ' '.join(cflags)
with working_dir(bin_dir):
if '+mpi' in spec: