Merge remote-tracking branch 'upstream/develop' into develop
"Updating NERSC branch"
This commit is contained in:
commit
8af1c5fc8f
2
.flake8
2
.flake8
@ -19,5 +19,5 @@
|
|||||||
# - F999: name name be undefined or undefined from star imports.
|
# - F999: name name be undefined or undefined from star imports.
|
||||||
#
|
#
|
||||||
[flake8]
|
[flake8]
|
||||||
ignore = E221,E241,E731,F403,F821,F999
|
ignore = E221,E241,E731,F403,F821,F999,F405
|
||||||
max-line-length = 79
|
max-line-length = 79
|
||||||
|
@ -64,12 +64,14 @@ def info(message, *args, **kwargs):
|
|||||||
format = kwargs.get('format', '*b')
|
format = kwargs.get('format', '*b')
|
||||||
stream = kwargs.get('stream', sys.stdout)
|
stream = kwargs.get('stream', sys.stdout)
|
||||||
wrap = kwargs.get('wrap', False)
|
wrap = kwargs.get('wrap', False)
|
||||||
|
break_long_words = kwargs.get('break_long_words', False)
|
||||||
|
|
||||||
cprint("@%s{==>} %s" % (format, cescape(str(message))), stream=stream)
|
cprint("@%s{==>} %s" % (format, cescape(str(message))), stream=stream)
|
||||||
for arg in args:
|
for arg in args:
|
||||||
if wrap:
|
if wrap:
|
||||||
lines = textwrap.wrap(
|
lines = textwrap.wrap(
|
||||||
str(arg), initial_indent=indent, subsequent_indent=indent)
|
str(arg), initial_indent=indent, subsequent_indent=indent,
|
||||||
|
break_long_words=break_long_words)
|
||||||
for line in lines:
|
for line in lines:
|
||||||
stream.write(line + '\n')
|
stream.write(line + '\n')
|
||||||
else:
|
else:
|
||||||
|
@ -311,7 +311,11 @@ def reindex(self, directory_layout):
|
|||||||
for spec in directory_layout.all_specs():
|
for spec in directory_layout.all_specs():
|
||||||
# Create a spec for each known package and add it.
|
# Create a spec for each known package and add it.
|
||||||
path = directory_layout.path_for_spec(spec)
|
path = directory_layout.path_for_spec(spec)
|
||||||
self._add(spec, path, directory_layout)
|
old_info = old_data.get(spec.dag_hash())
|
||||||
|
explicit = False
|
||||||
|
if old_info is not None:
|
||||||
|
explicit = old_info.explicit
|
||||||
|
self._add(spec, path, directory_layout, explicit=explicit)
|
||||||
|
|
||||||
self._check_ref_counts()
|
self._check_ref_counts()
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
import spack
|
import spack
|
||||||
import llnl.util.tty as tty
|
import llnl.util.tty as tty
|
||||||
from llnl.util.filesystem import join_path
|
from llnl.util.filesystem import join_path, mkdirp
|
||||||
|
|
||||||
|
|
||||||
def pre_install(pkg):
|
def pre_install(pkg):
|
||||||
@ -154,6 +154,9 @@ def symlink_license(pkg):
|
|||||||
target = pkg.global_license_file
|
target = pkg.global_license_file
|
||||||
for filename in pkg.license_files:
|
for filename in pkg.license_files:
|
||||||
link_name = join_path(pkg.prefix, filename)
|
link_name = join_path(pkg.prefix, filename)
|
||||||
|
license_dir = os.path.dirname(link_name)
|
||||||
|
if not os.path.exists(license_dir):
|
||||||
|
mkdirp(license_dir)
|
||||||
if os.path.exists(target):
|
if os.path.exists(target):
|
||||||
os.symlink(target, link_name)
|
os.symlink(target, link_name)
|
||||||
tty.msg("Added local symlink %s to global license file" %
|
tty.msg("Added local symlink %s to global license file" %
|
||||||
|
@ -397,14 +397,20 @@ def __init__(self, spec):
|
|||||||
if self.is_extension:
|
if self.is_extension:
|
||||||
spack.repo.get(self.extendee_spec)._check_extendable()
|
spack.repo.get(self.extendee_spec)._check_extendable()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def global_license_dir(self):
|
||||||
|
"""Returns the directory where global license files for all
|
||||||
|
packages are stored."""
|
||||||
|
spack_root = ancestor(__file__, 4)
|
||||||
|
return join_path(spack_root, 'etc', 'spack', 'licenses')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def global_license_file(self):
|
def global_license_file(self):
|
||||||
"""Returns the path where a global license file should be stored."""
|
"""Returns the path where a global license file for this
|
||||||
|
particular package should be stored."""
|
||||||
if not self.license_files:
|
if not self.license_files:
|
||||||
return
|
return
|
||||||
spack_root = ancestor(__file__, 4)
|
return join_path(self.global_license_dir, self.name,
|
||||||
global_license_dir = join_path(spack_root, 'etc', 'spack', 'licenses')
|
|
||||||
return join_path(global_license_dir, self.name,
|
|
||||||
os.path.basename(self.license_files[0]))
|
os.path.basename(self.license_files[0]))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
50
var/spack/repos/builtin/packages/bertini/package.py
Normal file
50
var/spack/repos/builtin/packages/bertini/package.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
|
||||||
|
|
||||||
|
class Bertini(Package):
|
||||||
|
"""Bertini is a general-purpose solver, written in C, that was created
|
||||||
|
for research about polynomial continuation. It solves for the numerical
|
||||||
|
solution of systems of polynomial equations using homotopy continuation."""
|
||||||
|
|
||||||
|
homepage = "https://bertini.nd.edu/"
|
||||||
|
url = "https://bertini.nd.edu/BertiniSource_v1.5.tar.gz"
|
||||||
|
|
||||||
|
version('1.5', 'e3f6cc6e7f9a0cf1d73185e8671af707')
|
||||||
|
|
||||||
|
variant('mpi', default=True, description='Compile in parallel')
|
||||||
|
|
||||||
|
depends_on('flex')
|
||||||
|
depends_on('bison')
|
||||||
|
depends_on('gmp')
|
||||||
|
depends_on('mpfr')
|
||||||
|
depends_on('mpi', when='+mpi')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
configure('--prefix=%s' % prefix)
|
||||||
|
|
||||||
|
make()
|
||||||
|
make("install")
|
28
var/spack/repos/builtin/packages/daal/package.py
Normal file
28
var/spack/repos/builtin/packages/daal/package.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
from spack import *
|
||||||
|
import os
|
||||||
|
|
||||||
|
from spack.pkg.builtin.intel import IntelInstaller
|
||||||
|
|
||||||
|
|
||||||
|
class Daal(IntelInstaller):
|
||||||
|
"""Intel Data Analytics Acceleration Library.
|
||||||
|
|
||||||
|
Note: You will have to add the download file to a
|
||||||
|
mirror so that Spack can find it. For instructions on how to set up a
|
||||||
|
mirror, see http://software.llnl.gov/spack/mirrors.html"""
|
||||||
|
|
||||||
|
homepage = "https://software.intel.com/en-us/daal"
|
||||||
|
|
||||||
|
version('2016.2.181', 'aad2aa70e5599ebfe6f85b29d8719d46',
|
||||||
|
url="file://%s/l_daal_2016.2.181.tgz" % os.getcwd())
|
||||||
|
version('2016.3.210', 'ad747c0dd97dace4cad03cf2266cad28',
|
||||||
|
url="file://%s/l_daal_2016.3.210.tgz" % os.getcwd())
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
|
||||||
|
self.intel_prefix = os.path.join(prefix, "pkg")
|
||||||
|
IntelInstaller.install(self, spec, prefix)
|
||||||
|
|
||||||
|
daal_dir = os.path.join(self.intel_prefix, "daal")
|
||||||
|
for f in os.listdir(daal_dir):
|
||||||
|
os.symlink(os.path.join(daal_dir, f), os.path.join(self.prefix, f))
|
@ -26,20 +26,28 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
class Espresso(Package):
|
class Espresso(Package):
|
||||||
"""
|
"""
|
||||||
QE is an integrated suite of Open-Source computer codes for electronic-structure calculations and materials
|
QE is an integrated suite of Open-Source computer codes for
|
||||||
modeling at the nanoscale. It is based on density-functional theory, plane waves, and pseudopotentials.
|
electronic-structure calculations and materials modeling at
|
||||||
|
the nanoscale. It is based on density-functional theory, plane
|
||||||
|
waves, and pseudopotentials.
|
||||||
"""
|
"""
|
||||||
homepage = 'http://quantum-espresso.org'
|
homepage = 'http://quantum-espresso.org'
|
||||||
url = 'http://www.qe-forge.org/gf/download/frsrelease/204/912/espresso-5.3.0.tar.gz'
|
url = 'http://www.qe-forge.org/gf/download/frsrelease/204/912/espresso-5.3.0.tar.gz'
|
||||||
|
|
||||||
|
version(
|
||||||
|
'5.4.0',
|
||||||
|
'8bb78181b39bd084ae5cb7a512c1cfe7',
|
||||||
|
url='http://www.qe-forge.org/gf/download/frsrelease/211/968/espresso-5.4.0.tar.gz'
|
||||||
|
)
|
||||||
version('5.3.0', '6848fcfaeb118587d6be36bd10b7f2c3')
|
version('5.3.0', '6848fcfaeb118587d6be36bd10b7f2c3')
|
||||||
|
|
||||||
variant('mpi', default=True, description='Build Quantum-ESPRESSO with mpi support')
|
variant('mpi', default=True, description='Builds with mpi support')
|
||||||
variant('openmp', default=False, description='Enables openMP support')
|
variant('openmp', default=False, description='Enables openMP support')
|
||||||
variant('scalapack', default=True, description='Enables scalapack support')
|
variant('scalapack', default=True, description='Enables scalapack support')
|
||||||
variant('elpa', default=True, description='Use elpa as an eigenvalue solver')
|
variant('elpa', default=True, description='Uses elpa as an eigenvalue solver')
|
||||||
|
|
||||||
depends_on('blas')
|
depends_on('blas')
|
||||||
depends_on('lapack')
|
depends_on('lapack')
|
||||||
@ -47,7 +55,12 @@ class Espresso(Package):
|
|||||||
depends_on('mpi', when='+mpi')
|
depends_on('mpi', when='+mpi')
|
||||||
depends_on('fftw~mpi', when='~mpi')
|
depends_on('fftw~mpi', when='~mpi')
|
||||||
depends_on('fftw+mpi', when='+mpi')
|
depends_on('fftw+mpi', when='+mpi')
|
||||||
depends_on('scalapack', when='+scalapack+mpi') # TODO : + mpi needed to avoid false dependencies installation
|
# TODO : + mpi needed to avoid false dependencies installation
|
||||||
|
depends_on('scalapack', when='+scalapack+mpi')
|
||||||
|
|
||||||
|
# Spurious problems running in parallel the Makefile
|
||||||
|
# generated by qe configure
|
||||||
|
parallel = False
|
||||||
|
|
||||||
def check_variants(self, spec):
|
def check_variants(self, spec):
|
||||||
error = 'you cannot ask for \'+{variant}\' when \'+mpi\' is not active'
|
error = 'you cannot ask for \'+{variant}\' when \'+mpi\' is not active'
|
||||||
@ -93,4 +106,3 @@ def install(self, spec, prefix):
|
|||||||
install(filename, prefix.bin)
|
install(filename, prefix.bin)
|
||||||
else:
|
else:
|
||||||
make('install')
|
make('install')
|
||||||
|
|
||||||
|
119
var/spack/repos/builtin/packages/hpl/package.py
Normal file
119
var/spack/repos/builtin/packages/hpl/package.py
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
|
||||||
|
|
||||||
|
class Hpl(Package):
|
||||||
|
"""HPL is a software package that solves a (random) dense linear system
|
||||||
|
in double precision (64 bits) arithmetic on distributed-memory computers.
|
||||||
|
It can thus be regarded as a portable as well as freely available
|
||||||
|
implementation of the High Performance Computing Linpack Benchmark."""
|
||||||
|
|
||||||
|
homepage = "http://www.netlib.org/benchmark/hpl/"
|
||||||
|
url = "http://www.netlib.org/benchmark/hpl/hpl-2.2.tar.gz"
|
||||||
|
|
||||||
|
version('2.2', '0eb19e787c3dc8f4058db22c9e0c5320')
|
||||||
|
|
||||||
|
variant('openmp', default=False, description='Enable OpenMP support')
|
||||||
|
|
||||||
|
depends_on('mpi@1.1:')
|
||||||
|
depends_on('blas')
|
||||||
|
|
||||||
|
parallel = False
|
||||||
|
|
||||||
|
def configure(self, spec, arch):
|
||||||
|
# List of configuration options
|
||||||
|
# Order is important
|
||||||
|
config = []
|
||||||
|
|
||||||
|
# OpenMP support
|
||||||
|
if '+openmp' in spec:
|
||||||
|
config.append(
|
||||||
|
'OMP_DEFS = {0}'.format(self.compiler.openmp_flag)
|
||||||
|
)
|
||||||
|
|
||||||
|
config.extend([
|
||||||
|
# Shell
|
||||||
|
'SHELL = /bin/sh',
|
||||||
|
'CD = cd',
|
||||||
|
'CP = cp',
|
||||||
|
'LN_S = ln -fs',
|
||||||
|
'MKDIR = mkdir -p',
|
||||||
|
'RM = /bin/rm -f',
|
||||||
|
'TOUCH = touch',
|
||||||
|
# Platform identifier
|
||||||
|
'ARCH = {0}'.format(arch),
|
||||||
|
# HPL Directory Structure / HPL library
|
||||||
|
'TOPdir = {0}'.format(os.getcwd()),
|
||||||
|
'INCdir = $(TOPdir)/include',
|
||||||
|
'BINdir = $(TOPdir)/bin/$(ARCH)',
|
||||||
|
'LIBdir = $(TOPdir)/lib/$(ARCH)',
|
||||||
|
'HPLlib = $(LIBdir)/libhpl.a',
|
||||||
|
# Message Passing library (MPI)
|
||||||
|
'MPinc = -I{0}'.format(spec['mpi'].prefix.include),
|
||||||
|
'MPlib = -L{0}'.format(spec['mpi'].prefix.lib),
|
||||||
|
# Linear Algebra library (BLAS or VSIPL)
|
||||||
|
'LAinc = {0}'.format(spec['blas'].prefix.include),
|
||||||
|
'LAlib = {0}'.format(spec['blas'].blas_shared_lib),
|
||||||
|
# F77 / C interface
|
||||||
|
'F2CDEFS = -DAdd_ -DF77_INTEGER=int -DStringSunStyle',
|
||||||
|
# HPL includes / libraries / specifics
|
||||||
|
'HPL_INCLUDES = -I$(INCdir) -I$(INCdir)/$(ARCH) ' +
|
||||||
|
'-I$(LAinc) -I$(MPinc)',
|
||||||
|
'HPL_LIBS = $(HPLlib) $(LAlib) $(MPlib)',
|
||||||
|
'HPL_OPTS = -DHPL_DETAILED_TIMING -DHPL_PROGRESS_REPORT',
|
||||||
|
'HPL_DEFS = $(F2CDEFS) $(HPL_OPTS) $(HPL_INCLUDES)',
|
||||||
|
# Compilers / linkers - Optimization flags
|
||||||
|
'CC = {0}'.format(spec['mpi'].mpicc),
|
||||||
|
'CCNOOPT = $(HPL_DEFS)',
|
||||||
|
'CCFLAGS = $(HPL_DEFS) -O3',
|
||||||
|
'LINKER = $(CC)',
|
||||||
|
'LINKFLAGS = $(CCFLAGS) $(OMP_DEFS)',
|
||||||
|
'ARCHIVER = ar',
|
||||||
|
'ARFLAGS = r',
|
||||||
|
'RANLIB = echo'
|
||||||
|
])
|
||||||
|
|
||||||
|
# Write configuration options to include file
|
||||||
|
with open('Make.{0}'.format(arch), 'w') as makefile:
|
||||||
|
for var in config:
|
||||||
|
makefile.write('{0}\n'.format(var))
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
# Arch used for file naming purposes only
|
||||||
|
arch = '{0}-{1}'.format(platform.system(), platform.processor())
|
||||||
|
|
||||||
|
# Generate Makefile include
|
||||||
|
self.configure(spec, arch)
|
||||||
|
|
||||||
|
make('arch={0}'.format(arch))
|
||||||
|
|
||||||
|
# Manual installation
|
||||||
|
install_tree(join_path('bin', arch), prefix.bin)
|
||||||
|
install_tree(join_path('lib', arch), prefix.lib)
|
||||||
|
install_tree(join_path('include', arch), prefix.include)
|
||||||
|
install_tree('man', prefix.man)
|
@ -0,0 +1,144 @@
|
|||||||
|
from spack import *
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
from spack.pkg.builtin.intel import IntelInstaller, filter_pick, \
|
||||||
|
get_all_components
|
||||||
|
|
||||||
|
|
||||||
|
class IntelParallelStudio(IntelInstaller):
|
||||||
|
"""Intel Parallel Studio.
|
||||||
|
|
||||||
|
Note: You will have to add the download file to a
|
||||||
|
mirror so that Spack can find it. For instructions on how to set up a
|
||||||
|
mirror, see http://software.llnl.gov/spack/mirrors.html"""
|
||||||
|
|
||||||
|
homepage = "https://software.intel.com/en-us/intel-parallel-studio-xe"
|
||||||
|
|
||||||
|
# TODO: can also try the online installer (will download files on demand)
|
||||||
|
version('composer.2016.2', '1133fb831312eb519f7da897fec223fa',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_composer_edition_update2.tgz" # NOQA: ignore=E501
|
||||||
|
% os.getcwd())
|
||||||
|
version('professional.2016.2', '70be832f2d34c9bf596a5e99d5f2d832',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_update2.tgz" % os.getcwd()) # NOQA: ignore=E501
|
||||||
|
version('cluster.2016.2', '70be832f2d34c9bf596a5e99d5f2d832',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_update2.tgz" % os.getcwd()) # NOQA: ignore=E501
|
||||||
|
version('composer.2016.3', '3208eeabee951fc27579177b593cefe9',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_composer_edition_update3.tgz" # NOQA: ignore=E501
|
||||||
|
% os.getcwd())
|
||||||
|
version('professional.2016.3', 'eda19bb0d0d19709197ede58f13443f3',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_update3.tgz" % os.getcwd()) # NOQA: ignore=E501
|
||||||
|
version('cluster.2016.3', 'eda19bb0d0d19709197ede58f13443f3',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_update3.tgz" % os.getcwd()) # NOQA: ignore=E501
|
||||||
|
|
||||||
|
variant('rpath', default=True, description="Add rpath to .cfg files")
|
||||||
|
variant('newdtags', default=False,
|
||||||
|
description="Allow use of --enable-new-dtags in MPI wrappers")
|
||||||
|
variant('all', default=False,
|
||||||
|
description="Install all files with the requested edition")
|
||||||
|
variant('mpi', default=True,
|
||||||
|
description="Install the Intel MPI library and ITAC tool")
|
||||||
|
variant('mkl', default=True, description="Install the Intel MKL library")
|
||||||
|
variant('daal',
|
||||||
|
default=True, description="Install the Intel DAAL libraries")
|
||||||
|
variant('ipp', default=True, description="Install the Intel IPP libraries")
|
||||||
|
variant('tools', default=True, description="""Install the Intel Advisor,\
|
||||||
|
VTune Amplifier, and Inspector tools""")
|
||||||
|
|
||||||
|
provides('mpi', when='@cluster:+mpi')
|
||||||
|
provides('mkl', when='+mkl')
|
||||||
|
provides('daal', when='+daal')
|
||||||
|
provides('ipp', when='+ipp')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
|
||||||
|
base_components = "ALL" # when in doubt, install everything
|
||||||
|
mpi_components = ""
|
||||||
|
mkl_components = ""
|
||||||
|
daal_components = ""
|
||||||
|
ipp_components = ""
|
||||||
|
|
||||||
|
if spec.satisfies('+all'):
|
||||||
|
base_components = "ALL"
|
||||||
|
else:
|
||||||
|
all_components = get_all_components()
|
||||||
|
regex = '(comp|openmp|intel-tbb|icc|ifort|psxe|icsxe-pset)'
|
||||||
|
base_components = \
|
||||||
|
filter_pick(all_components, re.compile(regex).search)
|
||||||
|
regex = '(icsxe|imb|mpi|itac|intel-tc|clck)'
|
||||||
|
mpi_components = \
|
||||||
|
filter_pick(all_components, re.compile(regex).search)
|
||||||
|
mkl_components = \
|
||||||
|
filter_pick(all_components, re.compile('(mkl)').search)
|
||||||
|
daal_components = \
|
||||||
|
filter_pick(all_components, re.compile('(daal)').search)
|
||||||
|
ipp_components = \
|
||||||
|
filter_pick(all_components, re.compile('(ipp)').search)
|
||||||
|
regex = '(gdb|vtune|inspector|advisor)'
|
||||||
|
tool_components = \
|
||||||
|
filter_pick(all_components, re.compile(regex).search)
|
||||||
|
|
||||||
|
components = base_components
|
||||||
|
if not spec.satisfies('+all'):
|
||||||
|
if spec.satisfies('+mpi') and 'cluster' in str(spec.version):
|
||||||
|
components += mpi_components
|
||||||
|
if spec.satisfies('+mkl'):
|
||||||
|
components += mkl_components
|
||||||
|
if spec.satisfies('+daal'):
|
||||||
|
components += daal_components
|
||||||
|
if spec.satisfies('+ipp'):
|
||||||
|
components += ipp_components
|
||||||
|
if spec.satisfies('+tools') and (spec.satisfies('@cluster') or
|
||||||
|
spec.satisfies('@professional')):
|
||||||
|
components += tool_components
|
||||||
|
|
||||||
|
self.intel_components = ';'.join(components)
|
||||||
|
IntelInstaller.install(self, spec, prefix)
|
||||||
|
|
||||||
|
absbindir = os.path.dirname(os.path.realpath(os.path.join(
|
||||||
|
self.prefix.bin, "icc")))
|
||||||
|
abslibdir = os.path.dirname(os.path.realpath(os.path.join
|
||||||
|
(self.prefix.lib, "intel64", "libimf.a")))
|
||||||
|
|
||||||
|
os.symlink(self.global_license_file, os.path.join(absbindir,
|
||||||
|
"license.lic"))
|
||||||
|
if spec.satisfies('+tools') and (spec.satisfies('@cluster') or
|
||||||
|
spec.satisfies('@professional')):
|
||||||
|
os.mkdir(os.path.join(self.prefix, "inspector_xe/licenses"))
|
||||||
|
os.symlink(self.global_license_file, os.path.join(
|
||||||
|
self.prefix, "inspector_xe/licenses", "license.lic"))
|
||||||
|
os.mkdir(os.path.join(self.prefix, "advisor_xe/licenses"))
|
||||||
|
os.symlink(self.global_license_file, os.path.join(
|
||||||
|
self.prefix, "advisor_xe/licenses", "license.lic"))
|
||||||
|
os.mkdir(os.path.join(self.prefix, "vtune_amplifier_xe/licenses"))
|
||||||
|
os.symlink(self.global_license_file, os.path.join(
|
||||||
|
self.prefix, "vtune_amplifier_xe/licenses", "license.lic"))
|
||||||
|
|
||||||
|
if (spec.satisfies('+all') or spec.satisfies('+mpi')) and \
|
||||||
|
spec.satisfies('@cluster'):
|
||||||
|
os.symlink(self.global_license_file, os.path.join(
|
||||||
|
self.prefix, "itac_latest", "license.lic"))
|
||||||
|
if spec.satisfies('~newdtags'):
|
||||||
|
wrappers = ["mpif77", "mpif77", "mpif90", "mpif90",
|
||||||
|
"mpigcc", "mpigcc", "mpigxx", "mpigxx",
|
||||||
|
"mpiicc", "mpiicc", "mpiicpc", "mpiicpc",
|
||||||
|
"mpiifort", "mpiifort"]
|
||||||
|
wrapper_paths = []
|
||||||
|
for root, dirs, files in os.walk(spec.prefix):
|
||||||
|
for name in files:
|
||||||
|
if name in wrappers:
|
||||||
|
wrapper_paths.append(os.path.join(spec.prefix,
|
||||||
|
root, name))
|
||||||
|
for wrapper in wrapper_paths:
|
||||||
|
filter_file(r'-Xlinker --enable-new-dtags', r' ',
|
||||||
|
wrapper)
|
||||||
|
|
||||||
|
if spec.satisfies('+rpath'):
|
||||||
|
for compiler_command in ["icc", "icpc", "ifort"]:
|
||||||
|
cfgfilename = os.path.join(absbindir, "%s.cfg" %
|
||||||
|
compiler_command)
|
||||||
|
with open(cfgfilename, "w") as f:
|
||||||
|
f.write('-Xlinker -rpath -Xlinker %s\n' % abslibdir)
|
||||||
|
|
||||||
|
os.symlink(os.path.join(self.prefix.man, "common", "man1"),
|
||||||
|
os.path.join(self.prefix.man, "man1"))
|
125
var/spack/repos/builtin/packages/intel/package.py
Normal file
125
var/spack/repos/builtin/packages/intel/package.py
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
from spack import *
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def filter_pick(input_list, regex_filter):
|
||||||
|
"""Returns the items in input_list that are found in the regex_filter"""
|
||||||
|
return [l for l in input_list for m in (regex_filter(l),) if m]
|
||||||
|
|
||||||
|
|
||||||
|
def unfilter_pick(input_list, regex_filter):
|
||||||
|
"""Returns the items in input_list that are not found in the
|
||||||
|
regex_filter"""
|
||||||
|
return [l for l in input_list for m in (regex_filter(l),) if not m]
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_components():
|
||||||
|
"""Returns a list of all the components associated with the downloaded
|
||||||
|
Intel package"""
|
||||||
|
all_components = []
|
||||||
|
with open("pset/mediaconfig.xml", "r") as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
for line in lines:
|
||||||
|
if line.find('<Abbr>') != -1:
|
||||||
|
component = line[line.find('<Abbr>') + 6:line.find('</Abbr>')]
|
||||||
|
all_components.append(component)
|
||||||
|
return all_components
|
||||||
|
|
||||||
|
|
||||||
|
class IntelInstaller(Package):
|
||||||
|
"""Base package containing common methods for installing Intel software"""
|
||||||
|
|
||||||
|
homepage = "https://software.intel.com/en-us"
|
||||||
|
intel_components = "ALL"
|
||||||
|
license_required = True
|
||||||
|
license_comment = '#'
|
||||||
|
license_files = ['Licenses/license.lic']
|
||||||
|
license_vars = ['INTEL_LICENSE_FILE']
|
||||||
|
license_url = \
|
||||||
|
'https://software.intel.com/en-us/articles/intel-license-manager-faq'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def global_license_file(self):
|
||||||
|
"""Returns the path where a global license file should be stored."""
|
||||||
|
if not self.license_files:
|
||||||
|
return
|
||||||
|
return join_path(self.global_license_dir, "intel",
|
||||||
|
os.path.basename(self.license_files[0]))
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
|
||||||
|
# Remove the installation DB, otherwise it will try to install into
|
||||||
|
# location of other Intel builds
|
||||||
|
if os.path.exists(os.path.join(os.environ["HOME"], "intel",
|
||||||
|
"intel_sdp_products.db")):
|
||||||
|
os.remove(os.path.join(os.environ["HOME"], "intel",
|
||||||
|
"intel_sdp_products.db"))
|
||||||
|
|
||||||
|
if not hasattr(self, "intel_prefix"):
|
||||||
|
self.intel_prefix = self.prefix
|
||||||
|
|
||||||
|
silent_config_filename = 'silent.cfg'
|
||||||
|
with open(silent_config_filename, 'w') as f:
|
||||||
|
f.write("""
|
||||||
|
ACCEPT_EULA=accept
|
||||||
|
PSET_MODE=install
|
||||||
|
CONTINUE_WITH_INSTALLDIR_OVERWRITE=yes
|
||||||
|
PSET_INSTALL_DIR=%s
|
||||||
|
ACTIVATION_LICENSE_FILE=%s
|
||||||
|
ACTIVATION_TYPE=license_file
|
||||||
|
PHONEHOME_SEND_USAGE_DATA=no
|
||||||
|
CONTINUE_WITH_OPTIONAL_ERROR=yes
|
||||||
|
COMPONENTS=%s
|
||||||
|
""" % (self.intel_prefix, self.global_license_file, self.intel_components))
|
||||||
|
|
||||||
|
install_script = which("install.sh")
|
||||||
|
install_script('--silent', silent_config_filename)
|
||||||
|
|
||||||
|
|
||||||
|
class Intel(IntelInstaller):
|
||||||
|
"""Intel Compilers.
|
||||||
|
|
||||||
|
Note: You will have to add the download file to a
|
||||||
|
mirror so that Spack can find it. For instructions on how to set up a
|
||||||
|
mirror, see http://software.llnl.gov/spack/mirrors.html"""
|
||||||
|
|
||||||
|
homepage = "https://software.intel.com/en-us/intel-parallel-studio-xe"
|
||||||
|
|
||||||
|
# TODO: can also try the online installer (will download files on demand)
|
||||||
|
version('16.0.2', '1133fb831312eb519f7da897fec223fa',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_composer_edition_update2.tgz" # NOQA: ignore=E501
|
||||||
|
% os.getcwd())
|
||||||
|
version('16.0.3', '3208eeabee951fc27579177b593cefe9',
|
||||||
|
url="file://%s/parallel_studio_xe_2016_composer_edition_update3.tgz" # NOQA: ignore=E501
|
||||||
|
% os.getcwd())
|
||||||
|
|
||||||
|
variant('rpath', default=True, description="Add rpath to .cfg files")
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
components = []
|
||||||
|
all_components = get_all_components()
|
||||||
|
regex = '(comp|openmp|intel-tbb|icc|ifort|psxe|icsxe-pset)'
|
||||||
|
components = filter_pick(all_components, re.compile(regex).search)
|
||||||
|
|
||||||
|
self.intel_components = ';'.join(components)
|
||||||
|
IntelInstaller.install(self, spec, prefix)
|
||||||
|
|
||||||
|
absbindir = os.path.split(os.path.realpath(os.path.join(
|
||||||
|
self.prefix.bin, "icc")))[0]
|
||||||
|
abslibdir = os.path.split(os.path.realpath(os.path.join(
|
||||||
|
self.prefix.lib, "intel64", "libimf.a")))[0]
|
||||||
|
|
||||||
|
# symlink or copy?
|
||||||
|
os.symlink(self.global_license_file, os.path.join(absbindir,
|
||||||
|
"license.lic"))
|
||||||
|
|
||||||
|
if spec.satisfies('+rpath'):
|
||||||
|
for compiler_command in ["icc", "icpc", "ifort"]:
|
||||||
|
cfgfilename = os.path.join(absbindir, "%s.cfg" %
|
||||||
|
compiler_command)
|
||||||
|
with open(cfgfilename, "w") as f:
|
||||||
|
f.write('-Xlinker -rpath -Xlinker %s\n' % abslibdir)
|
||||||
|
|
||||||
|
os.symlink(os.path.join(self.prefix.man, "common", "man1"),
|
||||||
|
os.path.join(self.prefix.man, "man1"))
|
26
var/spack/repos/builtin/packages/ipp/package.py
Normal file
26
var/spack/repos/builtin/packages/ipp/package.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
from spack import *
|
||||||
|
import os
|
||||||
|
|
||||||
|
from spack.pkg.builtin.intel import IntelInstaller
|
||||||
|
|
||||||
|
|
||||||
|
class Ipp(IntelInstaller):
|
||||||
|
"""Intel Integrated Performance Primitives.
|
||||||
|
|
||||||
|
Note: You will have to add the download file to a
|
||||||
|
mirror so that Spack can find it. For instructions on how to set up a
|
||||||
|
mirror, see http://software.llnl.gov/spack/mirrors.html"""
|
||||||
|
|
||||||
|
homepage = "https://software.intel.com/en-us/intel-ipp"
|
||||||
|
|
||||||
|
version('9.0.3.210', '0e1520dd3de7f811a6ef6ebc7aa429a3',
|
||||||
|
url="file://%s/l_ipp_9.0.3.210.tgz" % os.getcwd())
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
|
||||||
|
self.intel_prefix = os.path.join(prefix, "pkg")
|
||||||
|
IntelInstaller.install(self, spec, prefix)
|
||||||
|
|
||||||
|
ipp_dir = os.path.join(self.intel_prefix, "ipp")
|
||||||
|
for f in os.listdir(ipp_dir):
|
||||||
|
os.symlink(os.path.join(ipp_dir, f), os.path.join(self.prefix, f))
|
28
var/spack/repos/builtin/packages/mkl/package.py
Normal file
28
var/spack/repos/builtin/packages/mkl/package.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
from spack import *
|
||||||
|
import os
|
||||||
|
|
||||||
|
from spack.pkg.builtin.intel import IntelInstaller
|
||||||
|
|
||||||
|
|
||||||
|
class Mkl(IntelInstaller):
|
||||||
|
"""Intel Math Kernel Library.
|
||||||
|
|
||||||
|
Note: You will have to add the download file to a
|
||||||
|
mirror so that Spack can find it. For instructions on how to set up a
|
||||||
|
mirror, see http://software.llnl.gov/spack/mirrors.html"""
|
||||||
|
|
||||||
|
homepage = "https://software.intel.com/en-us/intel-mkl"
|
||||||
|
|
||||||
|
version('11.3.2.181', '536dbd82896d6facc16de8f961d17d65',
|
||||||
|
url="file://%s/l_mkl_11.3.2.181.tgz" % os.getcwd())
|
||||||
|
version('11.3.3.210', 'f72546df27f5ebb0941b5d21fd804e34',
|
||||||
|
url="file://%s/l_mkl_11.3.3.210.tgz" % os.getcwd())
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
|
||||||
|
self.intel_prefix = os.path.join(prefix, "pkg")
|
||||||
|
IntelInstaller.install(self, spec, prefix)
|
||||||
|
|
||||||
|
mkl_dir = os.path.join(self.intel_prefix, "mkl")
|
||||||
|
for f in os.listdir(mkl_dir):
|
||||||
|
os.symlink(os.path.join(mkl_dir, f), os.path.join(self.prefix, f))
|
@ -24,29 +24,38 @@
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
from spack import *
|
from spack import *
|
||||||
|
|
||||||
class PyAstropy(Package):
|
|
||||||
"""
|
|
||||||
The Astropy Project is a community effort to develop a single core
|
|
||||||
package for Astronomy in Python and foster interoperability between
|
|
||||||
Python astronomy packages.
|
|
||||||
"""
|
|
||||||
homepage = 'http://www.astropy.org/'
|
|
||||||
|
|
||||||
|
class PyAstropy(Package):
|
||||||
|
"""The Astropy Project is a community effort to develop a single core
|
||||||
|
package for Astronomy in Python and foster interoperability between
|
||||||
|
Python astronomy packages."""
|
||||||
|
|
||||||
|
homepage = 'http://www.astropy.org/'
|
||||||
|
url = 'https://pypi.python.org/packages/source/a/astropy/astropy-1.1.2.tar.gz'
|
||||||
|
|
||||||
|
version('1.1.2', 'cbe32023b5b1177d1e2498a0d00cda51')
|
||||||
version('1.1.post1', 'b52919f657a37d45cc45f5cb0f58c44d')
|
version('1.1.post1', 'b52919f657a37d45cc45f5cb0f58c44d')
|
||||||
|
|
||||||
def url_for_version(self, version):
|
# Required dependencies
|
||||||
return 'https://pypi.python.org/packages/source/a/astropy/astropy-{0}.tar.gz'.format(version)
|
|
||||||
|
|
||||||
extends('python')
|
extends('python')
|
||||||
|
depends_on('py-numpy')
|
||||||
|
|
||||||
|
# Optional dependencies
|
||||||
|
depends_on('py-h5py')
|
||||||
|
depends_on('py-beautifulsoup4')
|
||||||
|
depends_on('py-pyyaml')
|
||||||
|
depends_on('py-scipy')
|
||||||
|
depends_on('libxml2')
|
||||||
|
depends_on('py-matplotlib')
|
||||||
|
depends_on('py-pytz')
|
||||||
|
depends_on('py-scikit-image')
|
||||||
|
depends_on('py-pandas')
|
||||||
|
|
||||||
|
# System dependencies
|
||||||
depends_on('cfitsio')
|
depends_on('cfitsio')
|
||||||
depends_on('expat')
|
depends_on('expat')
|
||||||
depends_on('py-h5py')
|
|
||||||
depends_on('py-numpy')
|
|
||||||
depends_on('py-scipy')
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
python('setup.py', 'build', '--use-system-cfitsio',
|
python('setup.py', 'build', '--use-system-cfitsio',
|
||||||
'--use-system-expat')
|
'--use-system-expat')
|
||||||
python('setup.py', 'install', '--prefix=' + prefix)
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
||||||
|
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
|
||||||
|
|
||||||
|
class PyBeautifulsoup4(Package):
|
||||||
|
"""Beautiful Soup is a Python library for pulling data out of HTML and
|
||||||
|
XML files. It works with your favorite parser to provide idiomatic ways
|
||||||
|
of navigating, searching, and modifying the parse tree."""
|
||||||
|
|
||||||
|
homepage = "https://www.crummy.com/software/BeautifulSoup"
|
||||||
|
url = "https://pypi.python.org/packages/source/b/beautifulsoup4/beautifulsoup4-4.4.1.tar.gz"
|
||||||
|
|
||||||
|
version('4.4.1', '8fbd9a7cac0704645fa20d1419036815')
|
||||||
|
|
||||||
|
extends('python')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
41
var/spack/repos/builtin/packages/py-emcee/package.py
Normal file
41
var/spack/repos/builtin/packages/py-emcee/package.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
|
||||||
|
|
||||||
|
class PyEmcee(Package):
|
||||||
|
"""emcee is an MIT licensed pure-Python implementation of Goodman & Weare's
|
||||||
|
Affine Invariant Markov chain Monte Carlo (MCMC) Ensemble sampler."""
|
||||||
|
|
||||||
|
homepage = "http://dan.iel.fm/emcee/current/"
|
||||||
|
url = "https://pypi.python.org/packages/source/e/emcee/emcee-2.1.0.tar.gz"
|
||||||
|
|
||||||
|
version('2.1.0', 'c6b6fad05c824d40671d4a4fc58dfff7')
|
||||||
|
|
||||||
|
extends('python')
|
||||||
|
depends_on('py-numpy')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
@ -23,23 +23,42 @@
|
|||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
from spack import *
|
from spack import *
|
||||||
import re
|
|
||||||
|
|
||||||
class PyH5py(Package):
|
class PyH5py(Package):
|
||||||
"""The h5py package provides both a high- and low-level interface to the HDF5 library from Python."""
|
"""The h5py package provides both a high- and low-level interface to the
|
||||||
|
HDF5 library from Python."""
|
||||||
|
|
||||||
homepage = "https://pypi.python.org/pypi/h5py"
|
homepage = "https://pypi.python.org/pypi/h5py"
|
||||||
url = "https://pypi.python.org/packages/source/h/h5py/h5py-2.4.0.tar.gz"
|
url = "https://pypi.python.org/packages/source/h/h5py/h5py-2.4.0.tar.gz"
|
||||||
|
|
||||||
version('2.4.0', '80c9a94ae31f84885cc2ebe1323d6758')
|
version('2.6.0', 'ec476211bd1de3f5ac150544189b0bf4')
|
||||||
version('2.5.0', '6e4301b5ad5da0d51b0a1e5ac19e3b74')
|
version('2.5.0', '6e4301b5ad5da0d51b0a1e5ac19e3b74')
|
||||||
|
version('2.4.0', '80c9a94ae31f84885cc2ebe1323d6758')
|
||||||
|
|
||||||
extends('python', ignore=lambda f: re.match(r'bin/cy*', f))
|
variant('mpi', default=False, description='Build with MPI support')
|
||||||
depends_on('hdf5')
|
|
||||||
depends_on('py-numpy')
|
extends('python')
|
||||||
depends_on('py-cython')
|
|
||||||
|
# Build dependencies
|
||||||
|
depends_on('py-cython@0.19:')
|
||||||
|
depends_on('pkg-config')
|
||||||
|
depends_on('hdf5@1.8.4:+mpi', when='+mpi')
|
||||||
|
depends_on('hdf5@1.8.4:~mpi', when='~mpi')
|
||||||
|
depends_on('mpi', when='+mpi')
|
||||||
|
|
||||||
|
# Build and runtime dependencies
|
||||||
|
depends_on('py-numpy@1.6.1:')
|
||||||
|
|
||||||
|
# Runtime dependencies
|
||||||
depends_on('py-six')
|
depends_on('py-six')
|
||||||
depends_on('py-pkgconfig')
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
python('setup.py', 'configure', '--hdf5=%s' % spec['hdf5'].prefix)
|
python('setup.py', 'configure',
|
||||||
python('setup.py', 'install', '--prefix=%s' % prefix)
|
'--hdf5={0}'.format(spec['hdf5'].prefix))
|
||||||
|
|
||||||
|
if '+mpi' in spec:
|
||||||
|
env['CC'] = spec['mpi'].mpicc
|
||||||
|
python('setup.py', 'configure', '--mpi')
|
||||||
|
|
||||||
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
||||||
|
46
var/spack/repos/builtin/packages/py-iminuit/package.py
Normal file
46
var/spack/repos/builtin/packages/py-iminuit/package.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
|
||||||
|
|
||||||
|
class PyIminuit(Package):
|
||||||
|
"""Interactive IPython-Friendly Minimizer based on SEAL Minuit2."""
|
||||||
|
|
||||||
|
homepage = "https://pypi.python.org/pypi/iminuit"
|
||||||
|
url = "https://pypi.python.org/packages/source/i/iminuit/iminuit-1.2.tar.gz"
|
||||||
|
|
||||||
|
version('1.2', '4701ec472cae42015e26251703e6e984')
|
||||||
|
|
||||||
|
# Required dependencies
|
||||||
|
extends('python')
|
||||||
|
depends_on('py-setuptools')
|
||||||
|
|
||||||
|
# Optional dependencies
|
||||||
|
depends_on('py-numpy')
|
||||||
|
depends_on('py-matplotlib')
|
||||||
|
depends_on('py-cython')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
44
var/spack/repos/builtin/packages/py-nestle/package.py
Normal file
44
var/spack/repos/builtin/packages/py-nestle/package.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
|
||||||
|
|
||||||
|
class PyNestle(Package):
|
||||||
|
"""Nested sampling algorithms for evaluating Bayesian evidence."""
|
||||||
|
|
||||||
|
homepage = "http://kbarbary.github.io/nestle/"
|
||||||
|
url = "https://pypi.python.org/packages/source/n/nestle/nestle-0.1.1.tar.gz"
|
||||||
|
|
||||||
|
version('0.1.1', '4875c0f9a0a8e263c1d7f5fa6ce604c5')
|
||||||
|
|
||||||
|
# Required dependencies
|
||||||
|
extends('python')
|
||||||
|
depends_on('py-numpy')
|
||||||
|
|
||||||
|
# Optional dependencies
|
||||||
|
depends_on('py-scipy')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
51
var/spack/repos/builtin/packages/py-sncosmo/package.py
Normal file
51
var/spack/repos/builtin/packages/py-sncosmo/package.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
|
||||||
|
|
||||||
|
class PySncosmo(Package):
|
||||||
|
"""SNCosmo is a Python library for high-level supernova cosmology
|
||||||
|
analysis."""
|
||||||
|
|
||||||
|
homepage = "http://sncosmo.readthedocs.io/"
|
||||||
|
url = "https://pypi.python.org/packages/source/s/sncosmo/sncosmo-1.2.0.tar.gz"
|
||||||
|
|
||||||
|
version('1.2.0', '028e6d1dc84ab1c17d2f3b6378b2cb1e')
|
||||||
|
|
||||||
|
# Required dependencies
|
||||||
|
# py-sncosmo binaries are duplicates of those from py-astropy
|
||||||
|
extends('python', ignore=r'bin/.*')
|
||||||
|
depends_on('py-numpy')
|
||||||
|
depends_on('py-scipy')
|
||||||
|
depends_on('py-astropy')
|
||||||
|
|
||||||
|
# Recommended dependencies
|
||||||
|
depends_on('py-matplotlib')
|
||||||
|
depends_on('py-iminuit')
|
||||||
|
depends_on('py-emcee')
|
||||||
|
depends_on('py-nestle')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
43
var/spack/repos/builtin/packages/py-wcsaxes/package.py
Normal file
43
var/spack/repos/builtin/packages/py-wcsaxes/package.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created 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 Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, 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 Lesser 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 *
|
||||||
|
|
||||||
|
|
||||||
|
class PyWcsaxes(Package):
|
||||||
|
"""WCSAxes is a framework for making plots of Astronomical data
|
||||||
|
in Matplotlib."""
|
||||||
|
|
||||||
|
homepage = "http://wcsaxes.readthedocs.io/en/latest/index.html"
|
||||||
|
url = "https://github.com/astrofrog/wcsaxes/archive/v0.8.tar.gz"
|
||||||
|
|
||||||
|
version('0.8', 'de1c60fdae4c330bf5ddb9f1ab5ab920')
|
||||||
|
|
||||||
|
extends('python', ignore=r'bin/pbr')
|
||||||
|
depends_on('py-numpy')
|
||||||
|
depends_on('py-matplotlib')
|
||||||
|
depends_on('py-astropy')
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))
|
@ -22,9 +22,6 @@
|
|||||||
# License along with this program; if not, write to the Free Software
|
# License along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
import functools
|
|
||||||
import glob
|
|
||||||
import inspect
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from contextlib import closing
|
from contextlib import closing
|
||||||
@ -37,11 +34,10 @@
|
|||||||
|
|
||||||
class Python(Package):
|
class Python(Package):
|
||||||
"""The Python programming language."""
|
"""The Python programming language."""
|
||||||
|
|
||||||
homepage = "http://www.python.org"
|
homepage = "http://www.python.org"
|
||||||
url = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz"
|
url = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz"
|
||||||
|
|
||||||
extendable = True
|
|
||||||
|
|
||||||
version('3.5.1', 'be78e48cdfc1a7ad90efff146dce6cfe')
|
version('3.5.1', 'be78e48cdfc1a7ad90efff146dce6cfe')
|
||||||
version('3.5.0', 'a56c0c0b45d75a0ec9c6dee933c41c36')
|
version('3.5.0', 'a56c0c0b45d75a0ec9c6dee933c41c36')
|
||||||
version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b', preferred=True)
|
version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b', preferred=True)
|
||||||
@ -49,6 +45,8 @@ class Python(Package):
|
|||||||
version('2.7.9', '5eebcaa0030dc4061156d3429657fb83')
|
version('2.7.9', '5eebcaa0030dc4061156d3429657fb83')
|
||||||
version('2.7.8', 'd4bca0159acb0b44a781292b5231936f')
|
version('2.7.8', 'd4bca0159acb0b44a781292b5231936f')
|
||||||
|
|
||||||
|
extendable = True
|
||||||
|
|
||||||
depends_on("openssl")
|
depends_on("openssl")
|
||||||
depends_on("bzip2")
|
depends_on("bzip2")
|
||||||
depends_on("readline")
|
depends_on("readline")
|
||||||
@ -64,39 +62,63 @@ def install(self, spec, prefix):
|
|||||||
# Rest of install is pretty standard except setup.py needs to
|
# Rest of install is pretty standard except setup.py needs to
|
||||||
# be able to read the CPPFLAGS and LDFLAGS as it scans for the
|
# be able to read the CPPFLAGS and LDFLAGS as it scans for the
|
||||||
# library and headers to build
|
# library and headers to build
|
||||||
configure_args= [
|
cppflags = ' -I'.join([
|
||||||
"--prefix=%s" % prefix,
|
spec['openssl'].prefix.include, spec['bzip2'].prefix.include,
|
||||||
"--with-threads",
|
spec['readline'].prefix.include, spec['ncurses'].prefix.include,
|
||||||
"--enable-shared",
|
spec['sqlite'].prefix.include, spec['zlib'].prefix.include
|
||||||
"CPPFLAGS=-I%s/include -I%s/include -I%s/include -I%s/include -I%s/include -I%s/include" % (
|
])
|
||||||
spec['openssl'].prefix, spec['bzip2'].prefix,
|
|
||||||
spec['readline'].prefix, spec['ncurses'].prefix,
|
ldflags = ' -L'.join([
|
||||||
spec['sqlite'].prefix, spec['zlib'].prefix),
|
spec['openssl'].prefix.lib, spec['bzip2'].prefix.lib,
|
||||||
"LDFLAGS=-L%s/lib -L%s/lib -L%s/lib -L%s/lib -L%s/lib -L%s/lib" % (
|
spec['readline'].prefix.lib, spec['ncurses'].prefix.lib,
|
||||||
spec['openssl'].prefix, spec['bzip2'].prefix,
|
spec['sqlite'].prefix.lib, spec['zlib'].prefix.lib
|
||||||
spec['readline'].prefix, spec['ncurses'].prefix,
|
])
|
||||||
spec['sqlite'].prefix, spec['zlib'].prefix)
|
|
||||||
]
|
config_args = [
|
||||||
|
"--prefix={0}".format(prefix),
|
||||||
|
"--with-threads",
|
||||||
|
"--enable-shared",
|
||||||
|
"CPPFLAGS=-I{0}".format(cppflags),
|
||||||
|
"LDFLAGS=-L{0}".format(ldflags)
|
||||||
|
]
|
||||||
|
|
||||||
if spec.satisfies('@3:'):
|
if spec.satisfies('@3:'):
|
||||||
configure_args.append('--without-ensurepip')
|
config_args.append('--without-ensurepip')
|
||||||
configure(*configure_args)
|
|
||||||
|
configure(*config_args)
|
||||||
|
|
||||||
make()
|
make()
|
||||||
make("install")
|
make("install")
|
||||||
|
|
||||||
# Modify compiler paths in configuration files. This is necessary for
|
self.filter_compilers(spec, prefix)
|
||||||
# building site packages outside of spack
|
|
||||||
filter_file(r'([/s]=?)([\S=]*)/lib/spack/env(/[^\s/]*)?/(\S*)(\s)',
|
|
||||||
(r'\4\5'),
|
|
||||||
join_path(prefix.lib, 'python%d.%d' % self.version[:2], '_sysconfigdata.py'))
|
|
||||||
|
|
||||||
python3_version = ''
|
def filter_compilers(self, spec, prefix):
|
||||||
|
"""Run after install to tell the configuration files and Makefiles
|
||||||
|
to use the compilers that Spack built the package with.
|
||||||
|
|
||||||
|
If this isn't done, they'll have CC and CXX set to Spack's generic
|
||||||
|
cc and c++. We want them to be bound to whatever compiler
|
||||||
|
they were built with."""
|
||||||
|
|
||||||
|
kwargs = {'ignore_absent': True, 'backup': False, 'string': True}
|
||||||
|
|
||||||
|
dirname = join_path(prefix.lib,
|
||||||
|
'python{0}'.format(self.version.up_to(2)))
|
||||||
|
|
||||||
|
config = 'config'
|
||||||
if spec.satisfies('@3:'):
|
if spec.satisfies('@3:'):
|
||||||
python3_version = '-%d.%dm' % self.version[:2]
|
config = 'config-{0}m'.format(self.version.up_to(2))
|
||||||
makefile_filepath = join_path(prefix.lib, 'python%d.%d' % self.version[:2], 'config%s' % python3_version, 'Makefile')
|
|
||||||
filter_file(r'([/s]=?)([\S=]*)/lib/spack/env(/[^\s/]*)?/(\S*)(\s)',
|
|
||||||
(r'\4\5'),
|
|
||||||
makefile_filepath)
|
|
||||||
|
|
||||||
|
files = [
|
||||||
|
'_sysconfigdata.py',
|
||||||
|
join_path(config, 'Makefile')
|
||||||
|
]
|
||||||
|
|
||||||
|
for filename in files:
|
||||||
|
filter_file(env['CC'], self.compiler.cc,
|
||||||
|
join_path(dirname, filename), **kwargs)
|
||||||
|
filter_file(env['CXX'], self.compiler.cxx,
|
||||||
|
join_path(dirname, filename), **kwargs)
|
||||||
|
|
||||||
# ========================================================================
|
# ========================================================================
|
||||||
# Set up environment to make install easy for python extensions.
|
# Set up environment to make install easy for python extensions.
|
||||||
@ -104,57 +126,59 @@ def install(self, spec, prefix):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def python_lib_dir(self):
|
def python_lib_dir(self):
|
||||||
return os.path.join('lib', 'python%d.%d' % self.version[:2])
|
return join_path('lib', 'python{0}'.format(self.version.up_to(2)))
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def python_include_dir(self):
|
def python_include_dir(self):
|
||||||
return os.path.join('include', 'python%d.%d' % self.version[:2])
|
return join_path('include', 'python{0}'.format(self.version.up_to(2)))
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def site_packages_dir(self):
|
def site_packages_dir(self):
|
||||||
return os.path.join(self.python_lib_dir, 'site-packages')
|
return join_path(self.python_lib_dir, 'site-packages')
|
||||||
|
|
||||||
|
|
||||||
def setup_dependent_environment(self, spack_env, run_env, extension_spec):
|
def setup_dependent_environment(self, spack_env, run_env, extension_spec):
|
||||||
# TODO: do this only for actual extensions.
|
"""Set PYTHONPATH to include site-packages dir for the
|
||||||
|
extension and any other python extensions it depends on."""
|
||||||
|
|
||||||
# Set PYTHONPATH to include site-packages dir for the
|
|
||||||
# extension and any other python extensions it depends on.
|
|
||||||
python_paths = []
|
python_paths = []
|
||||||
for d in extension_spec.traverse():
|
for d in extension_spec.traverse():
|
||||||
if d.package.extends(self.spec):
|
if d.package.extends(self.spec):
|
||||||
python_paths.append(os.path.join(d.prefix, self.site_packages_dir))
|
python_paths.append(join_path(d.prefix,
|
||||||
|
self.site_packages_dir))
|
||||||
|
|
||||||
pythonpath = ':'.join(python_paths)
|
pythonpath = ':'.join(python_paths)
|
||||||
spack_env.set('PYTHONPATH', pythonpath)
|
spack_env.set('PYTHONPATH', pythonpath)
|
||||||
|
|
||||||
# For run time environment set only the path for extension_spec and prepend it to PYTHONPATH
|
# For run time environment set only the path for
|
||||||
|
# extension_spec and prepend it to PYTHONPATH
|
||||||
if extension_spec.package.extends(self.spec):
|
if extension_spec.package.extends(self.spec):
|
||||||
run_env.prepend_path('PYTHONPATH', os.path.join(extension_spec.prefix, self.site_packages_dir))
|
run_env.prepend_path('PYTHONPATH', join_path(
|
||||||
|
extension_spec.prefix, self.site_packages_dir))
|
||||||
|
|
||||||
def setup_dependent_package(self, module, ext_spec):
|
def setup_dependent_package(self, module, ext_spec):
|
||||||
"""
|
"""Called before python modules' install() methods.
|
||||||
Called before python modules' install() methods.
|
|
||||||
|
|
||||||
In most cases, extensions will only need to have one line::
|
In most cases, extensions will only need to have one line::
|
||||||
|
|
||||||
python('setup.py', 'install', '--prefix=%s' % prefix)
|
python('setup.py', 'install', '--prefix={0}'.format(prefix))"""
|
||||||
"""
|
|
||||||
# Python extension builds can have a global python executable function
|
# Python extension builds can have a global python executable function
|
||||||
if self.version >= Version("3.0.0") and self.version < Version("4.0.0"):
|
if Version("3.0.0") <= self.version < Version("4.0.0"):
|
||||||
module.python = Executable(join_path(self.spec.prefix.bin, 'python3'))
|
module.python = Executable(join_path(self.spec.prefix.bin,
|
||||||
|
'python3'))
|
||||||
else:
|
else:
|
||||||
module.python = Executable(join_path(self.spec.prefix.bin, 'python'))
|
module.python = Executable(join_path(self.spec.prefix.bin,
|
||||||
|
'python'))
|
||||||
|
|
||||||
# Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs.
|
# Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs.
|
||||||
module.python_lib_dir = os.path.join(ext_spec.prefix, self.python_lib_dir)
|
module.python_lib_dir = join_path(ext_spec.prefix,
|
||||||
module.python_include_dir = os.path.join(ext_spec.prefix, self.python_include_dir)
|
self.python_lib_dir)
|
||||||
module.site_packages_dir = os.path.join(ext_spec.prefix, self.site_packages_dir)
|
module.python_include_dir = join_path(ext_spec.prefix,
|
||||||
|
self.python_include_dir)
|
||||||
|
module.site_packages_dir = join_path(ext_spec.prefix,
|
||||||
|
self.site_packages_dir)
|
||||||
|
|
||||||
# Make the site packages directory for extensions, if it does not exist already.
|
# Make the site packages directory for extensions
|
||||||
if ext_spec.package.is_extension:
|
if ext_spec.package.is_extension:
|
||||||
mkdirp(module.site_packages_dir)
|
mkdirp(module.site_packages_dir)
|
||||||
|
|
||||||
@ -167,25 +191,28 @@ def python_ignore(self, ext_pkg, args):
|
|||||||
ignore_arg = args.get('ignore', lambda f: False)
|
ignore_arg = args.get('ignore', lambda f: False)
|
||||||
|
|
||||||
# Always ignore easy-install.pth, as it needs to be merged.
|
# Always ignore easy-install.pth, as it needs to be merged.
|
||||||
patterns = [r'easy-install\.pth$']
|
patterns = [r'site-packages/easy-install\.pth$']
|
||||||
|
|
||||||
# Ignore pieces of setuptools installed by other packages.
|
# Ignore pieces of setuptools installed by other packages.
|
||||||
|
# Must include directory name or it will remove all site*.py files.
|
||||||
if ext_pkg.name != 'py-setuptools':
|
if ext_pkg.name != 'py-setuptools':
|
||||||
patterns.append(r'/site[^/]*\.pyc?$')
|
patterns.extend([
|
||||||
patterns.append(r'setuptools\.pth')
|
r'bin/easy_install[^/]*$',
|
||||||
patterns.append(r'bin/easy_install[^/]*$')
|
r'site-packages/setuptools[^/]*\.egg$',
|
||||||
patterns.append(r'setuptools.*egg$')
|
r'site-packages/setuptools\.pth$',
|
||||||
|
r'site-packages/site[^/]*\.pyc?$',
|
||||||
|
r'site-packages/__pycache__/site[^/]*\.pyc?$'
|
||||||
|
])
|
||||||
if ext_pkg.name != 'py-numpy':
|
if ext_pkg.name != 'py-numpy':
|
||||||
patterns.append(r'bin/f2py$')
|
patterns.append(r'bin/f2py$')
|
||||||
|
|
||||||
return match_predicate(ignore_arg, patterns)
|
return match_predicate(ignore_arg, patterns)
|
||||||
|
|
||||||
|
|
||||||
def write_easy_install_pth(self, exts):
|
def write_easy_install_pth(self, exts):
|
||||||
paths = []
|
paths = []
|
||||||
for ext in sorted(exts.values()):
|
for ext in sorted(exts.values()):
|
||||||
ext_site_packages = os.path.join(ext.prefix, self.site_packages_dir)
|
ext_site_packages = join_path(ext.prefix, self.site_packages_dir)
|
||||||
easy_pth = "%s/easy-install.pth" % ext_site_packages
|
easy_pth = join_path(ext_site_packages, "easy-install.pth")
|
||||||
|
|
||||||
if not os.path.isfile(easy_pth):
|
if not os.path.isfile(easy_pth):
|
||||||
continue
|
continue
|
||||||
@ -195,15 +222,18 @@ def write_easy_install_pth(self, exts):
|
|||||||
line = line.rstrip()
|
line = line.rstrip()
|
||||||
|
|
||||||
# Skip lines matching these criteria
|
# Skip lines matching these criteria
|
||||||
if not line: continue
|
if not line:
|
||||||
if re.search(r'^(import|#)', line): continue
|
continue
|
||||||
if (ext.name != 'py-setuptools' and
|
if re.search(r'^(import|#)', line):
|
||||||
re.search(r'setuptools.*egg$', line)): continue
|
continue
|
||||||
|
if ((ext.name != 'py-setuptools' and
|
||||||
|
re.search(r'setuptools.*egg$', line))):
|
||||||
|
continue
|
||||||
|
|
||||||
paths.append(line)
|
paths.append(line)
|
||||||
|
|
||||||
site_packages = os.path.join(self.prefix, self.site_packages_dir)
|
site_packages = join_path(self.prefix, self.site_packages_dir)
|
||||||
main_pth = "%s/easy-install.pth" % site_packages
|
main_pth = join_path(site_packages, "easy-install.pth")
|
||||||
|
|
||||||
if not paths:
|
if not paths:
|
||||||
if os.path.isfile(main_pth):
|
if os.path.isfile(main_pth):
|
||||||
@ -211,15 +241,22 @@ def write_easy_install_pth(self, exts):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
with closing(open(main_pth, 'w')) as f:
|
with closing(open(main_pth, 'w')) as f:
|
||||||
f.write("import sys; sys.__plen = len(sys.path)\n")
|
f.write("""
|
||||||
|
import sys
|
||||||
|
sys.__plen = len(sys.path)
|
||||||
|
""")
|
||||||
for path in paths:
|
for path in paths:
|
||||||
f.write("%s\n" % path)
|
f.write("{0}\n".format(path))
|
||||||
f.write("import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; "
|
f.write("""
|
||||||
"p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)\n")
|
new = sys.path[sys.__plen:]
|
||||||
|
del sys.path[sys.__plen:]
|
||||||
|
p = getattr(sys, '__egginsert', 0)
|
||||||
|
sys.path[p:p] = new
|
||||||
|
sys.__egginsert = p + len(new)
|
||||||
|
""")
|
||||||
|
|
||||||
def activate(self, ext_pkg, **args):
|
def activate(self, ext_pkg, **args):
|
||||||
ignore=self.python_ignore(ext_pkg, args)
|
ignore = self.python_ignore(ext_pkg, args)
|
||||||
args.update(ignore=ignore)
|
args.update(ignore=ignore)
|
||||||
|
|
||||||
super(Python, self).activate(ext_pkg, **args)
|
super(Python, self).activate(ext_pkg, **args)
|
||||||
@ -228,12 +265,12 @@ def activate(self, ext_pkg, **args):
|
|||||||
exts[ext_pkg.name] = ext_pkg.spec
|
exts[ext_pkg.name] = ext_pkg.spec
|
||||||
self.write_easy_install_pth(exts)
|
self.write_easy_install_pth(exts)
|
||||||
|
|
||||||
|
|
||||||
def deactivate(self, ext_pkg, **args):
|
def deactivate(self, ext_pkg, **args):
|
||||||
args.update(ignore=self.python_ignore(ext_pkg, args))
|
args.update(ignore=self.python_ignore(ext_pkg, args))
|
||||||
super(Python, self).deactivate(ext_pkg, **args)
|
super(Python, self).deactivate(ext_pkg, **args)
|
||||||
|
|
||||||
exts = spack.install_layout.extension_map(self.spec)
|
exts = spack.install_layout.extension_map(self.spec)
|
||||||
if ext_pkg.name in exts: # Make deactivate idempotent.
|
# Make deactivate idempotent
|
||||||
|
if ext_pkg.name in exts:
|
||||||
del exts[ext_pkg.name]
|
del exts[ext_pkg.name]
|
||||||
self.write_easy_install_pth(exts)
|
self.write_easy_install_pth(exts)
|
||||||
|
Loading…
Reference in New Issue
Block a user