diff options
-rw-r--r-- | lib/spack/spack/cmd/create.py | 20 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/elk/package.py | 80 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/openblas/package.py | 12 |
3 files changed, 64 insertions, 48 deletions
diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 7071af2686..41bfa741f6 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -1,3 +1,4 @@ +_copyright = """\ ############################################################################## # Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. @@ -22,6 +23,7 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +""" import string import os import hashlib @@ -47,22 +49,22 @@ from spack.stage import Stage description = "Create a new package file from an archive URL" -package_template = string.Template("""\ -# FIXME: -# This is a template package file for Spack. We've conveniently -# put "FIXME" labels next to all the things you'll want to change. +package_template = string.Template( + _copyright + """ # -# Once you've edited all the FIXME's, delete this whole message, -# save this file, and test out your package like this: +# This is a template package file for Spack. We've put "FIXME" +# next to all the things you'll want to change. Once you've handled +# them, you can save this file and test your package like this: # # spack install ${name} # -# You can always get back here to change things with: +# You can edit this file again by typing: # # spack edit ${name} # -# See the spack documentation for more information on building -# packages. +# See the Spack documentation for more information on packaging. +# If you submit this package back to Spack as a pull request, +# please first remove this boilerplate and all FIXME comments. # from spack import * diff --git a/var/spack/repos/builtin/packages/elk/package.py b/var/spack/repos/builtin/packages/elk/package.py index 9367dfdd78..b089e585dd 100644 --- a/var/spack/repos/builtin/packages/elk/package.py +++ b/var/spack/repos/builtin/packages/elk/package.py @@ -22,8 +22,9 @@ # 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 * import spack +from spack import * + class Elk(Package): '''An all-electron full-potential linearised augmented-plane wave @@ -35,79 +36,90 @@ class Elk(Package): version('3.3.17', 'f57f6230d14f3b3b558e5c71f62f0592') # Elk provides these libraries, but allows you to specify your own - variant('blas', default=True, description='Build with custom BLAS library') - variant('lapack', default=True, description='Build with custom LAPACK library') - variant('fft', default=True, description='Build with custom FFT library') + variant('blas', default=True, + description='Build with custom BLAS library') + variant('lapack', default=True, + description='Build with custom LAPACK library') + variant('fft', default=True, + description='Build with custom FFT library') # Elk does not provide these libraries, but allows you to use them - variant('mpi', default=True, description='Enable MPI parallelism') - variant('openmp', default=True, description='Enable OpenMP support') - variant('libxc', default=True, description='Link to Libxc functional library') + variant('mpi', default=True, + description='Enable MPI parallelism') + variant('openmp', default=True, + description='Enable OpenMP support') + variant('libxc', default=True, + description='Link to Libxc functional library') depends_on('blas', when='+blas') depends_on('lapack', when='+lapack') depends_on('fftw', when='+fft') - depends_on('mpi', when='+mpi') + depends_on('mpi@2:', when='+mpi') depends_on('libxc', when='+libxc') # Cannot be built in parallel parallel = False - def configure(self, spec): # Dictionary of configuration options config = { - 'MAKE': 'make', - 'F90': join_path(spack.build_env_path, 'f90'), - 'F77': join_path(spack.build_env_path, 'f77'), - 'AR': 'ar', - 'LIB_FFT': 'fftlib.a', - 'SRC_MPI': 'mpi_stub.f90', - 'SRC_OMP': 'omp_stub.f90', - 'SRC_libxc': 'libxcifc_stub.f90', - 'SRC_FFT': 'zfftifc.f90' + 'MAKE': 'make', + 'AR': 'ar' } # Compiler-specific flags flags = '' - if self.compiler.name == 'intel': - flags = '-O3 -ip -unroll -no-prec-div -openmp' + if self.compiler.name == 'intel': + flags = '-O3 -ip -unroll -no-prec-div' elif self.compiler.name == 'gcc': - flags = '-O3 -ffast-math -funroll-loops -fopenmp' + flags = '-O3 -ffast-math -funroll-loops' elif self.compiler.name == 'pgi': - flags = '-O3 -mp -lpthread' + flags = '-O3 -lpthread' elif self.compiler.name == 'g95': flags = '-O3 -fno-second-underscore' elif self.compiler.name == 'nag': flags = '-O4 -kind=byte -dusty -dcfuns' elif self.compiler.name == 'xl': - flags = '-O3 -qsmp=omp' + flags = '-O3' config['F90_OPTS'] = flags config['F77_OPTS'] = flags # BLAS/LAPACK support + # Note: BLAS/LAPACK must be compiled with OpenMP support + # if the +openmp variant is chosen blas = 'blas.a' lapack = 'lapack.a' - if '+blas' in spec: - blas = join_path(spec['blas'].prefix.lib, 'libblas.so') + if '+blas' in spec: + blas = spec['blas'].blas_shared_lib if '+lapack' in spec: - lapack = join_path(spec['lapack'].prefix.lib, 'liblapack.so') - config['LIB_LPK'] = ' '.join([lapack, blas]) # lapack must come before blas + lapack = spec['lapack'].lapack_shared_lib + # lapack must come before blas + config['LIB_LPK'] = ' '.join([lapack, blas]) # FFT support if '+fft' in spec: - config['LIB_FFT'] = join_path(spec['fftw'].prefix.lib, 'libfftw3.so') + config['LIB_FFT'] = join_path(spec['fftw'].prefix.lib, + 'libfftw3.so') config['SRC_FFT'] = 'zfftifc_fftw.f90' + else: + config['LIB_FFT'] = 'fftlib.a' + config['SRC_FFT'] = 'zfftifc.f90' # MPI support if '+mpi' in spec: - config.pop('SRC_MPI') - config['F90'] = join_path(spec['mpi'].prefix.bin, 'mpif90') - config['F77'] = join_path(spec['mpi'].prefix.bin, 'mpif77') + config['F90'] = spec['mpi'].mpifc + config['F77'] = spec['mpi'].mpif77 + else: + config['F90'] = join_path(spack.build_env_path, 'f90') + config['F77'] = join_path(spack.build_env_path, 'f77') + config['SRC_MPI'] = 'mpi_stub.f90' # OpenMP support if '+openmp' in spec: - config.pop('SRC_OMP') + config['F90_OPTS'] += ' ' + self.compiler.openmp_flag + config['F77_OPTS'] += ' ' + self.compiler.openmp_flag + else: + config['SRC_OMP'] = 'omp_stub.f90' # Libxc support if '+libxc' in spec: @@ -120,13 +132,14 @@ class Elk(Package): 'libxc.f90', 'libxcifc.f90' ]) + else: + config['SRC_libxc'] = 'libxcifc_stub.f90' # Write configuration options to include file with open('make.inc', 'w') as inc: for key in config: inc.write('{0} = {1}\n'.format(key, config[key])) - def install(self, spec, prefix): # Elk only provides an interactive setup script self.configure(spec) @@ -143,4 +156,3 @@ class Elk(Package): install_tree('examples', join_path(prefix, 'examples')) install_tree('species', join_path(prefix, 'species')) - diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index ebfec4bded..22e49daaa7 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -48,11 +48,13 @@ class Openblas(Package): patch('make.patch') def install(self, spec, prefix): - # Openblas is picky about compilers. Configure fails with - # FC=/abs/path/to/f77, whereas FC=f77 works fine. - # To circumvent this, provide basename only: - make_defs = ['CC=%s' % os.path.basename(spack_cc), - 'FC=%s' % os.path.basename(spack_f77), + # Configure fails to pick up fortran from FC=/abs/path/to/f77, but + # works fine with FC=/abs/path/to/gfortran. + # When mixing compilers make sure that + # $SPACK_ROOT/lib/spack/env/<compiler> have symlinks with reasonable + # names and hack them inside lib/spack/spack/compilers/<compiler>.py + make_defs = ['CC=%s' % spack_cc, + 'FC=%s' % spack_f77, 'MAKE_NO_J=1'] make_targets = ['libs', 'netlib'] |