summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/neuron/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'var/spack/repos/builtin/packages/neuron/package.py')
-rw-r--r--var/spack/repos/builtin/packages/neuron/package.py281
1 files changed, 115 insertions, 166 deletions
diff --git a/var/spack/repos/builtin/packages/neuron/package.py b/var/spack/repos/builtin/packages/neuron/package.py
index a3c6cbec05..27e6967da3 100644
--- a/var/spack/repos/builtin/packages/neuron/package.py
+++ b/var/spack/repos/builtin/packages/neuron/package.py
@@ -1,187 +1,136 @@
-# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
+# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
-import os
from spack import *
-class Neuron(Package):
+class Neuron(CMakePackage):
"""NEURON is a simulation environment for single and networks of neurons.
NEURON is a simulation environment for modeling individual and networks of
neurons. NEURON models individual neurons via the use of sections that are
automatically subdivided into individual compartments, instead of
- requiring the user to manually create compartments. The primary scripting
- language is hoc but a Python interface is also available.
+ requiring the user to manually create compartments.
"""
homepage = "https://www.neuron.yale.edu/"
- url = "http://www.neuron.yale.edu/ftp/neuron/versions/v7.5/nrn-7.5.tar.gz"
- git = "https://github.com/nrnhines/nrn.git"
-
- version('develop', branch='master')
- version('7.5', sha256='67642216a969fdc844da1bd56643edeed5e9f9ab8c2a3049dcbcbcccba29c336')
- version('7.4', sha256='1403ba16b2b329d2376f4bf007d96e6bf2992fa850f137f1068ad5b22b432de6')
- version('7.3', sha256='71cff5962966c5cd5d685d90569598a17b4b579d342126b31e2d431128cc8832')
- version('7.2', sha256='c777d73a58ff17a073e8ea25f140cb603b8b5f0df3c361388af7175e44d85b0e')
-
- variant('mpi', default=True, description='Enable MPI parallelism')
- variant('python', default=True, description='Enable python')
- variant('shared', default=False, description='Build shared libraries')
- variant('cross-compile', default=False, description='Build for cross-compile environment')
- variant('multisend', default=True, description="Enable multi-send spike exchange")
- variant('rx3d', default=False, description="Enable cython translated 3-d rxd")
-
- depends_on('flex', type='build')
- depends_on('bison', type='build')
- depends_on('automake', type='build')
- depends_on('automake', type='build')
- depends_on('autoconf', type='build')
- depends_on('libtool', type='build')
- depends_on('pkgconfig', type='build')
-
- depends_on('mpi', when='+mpi')
- depends_on('python@2.6:', when='+python')
- depends_on('ncurses', when='~cross-compile')
-
- conflicts('~shared', when='+python')
-
- filter_compiler_wrappers('*/bin/nrniv_makefile')
-
- def get_neuron_archdir(self):
- """Determine the architecture-specific neuron base directory.
-
- Instead of recreating the logic of the neuron's configure
- we dynamically find the architecture-specific directory by
- looking for a specific binary.
- """
- file_list = find(self.prefix, '*/bin/nrniv_makefile')
- # check needed as when initially evaluated the prefix is empty
- if file_list:
- neuron_archdir = os.path.dirname(os.path.dirname(file_list[0]))
+ url = "https://neuron.yale.edu/ftp/neuron/versions/v7.7/nrn-7.7.tar.gz"
+ git = "https://github.com/neuronsimulator/nrn"
+ maintainers = ['pramodk', 'nrnhines', 'iomaganaris', 'alexsavulescu']
+
+ version('develop', branch='master', submodules='True')
+ version("7.8.2", tag="7.8.2", submodules='True')
+ version("7.8.1", tag="7.8.1", submodules='True')
+
+ variant("coreneuron", default=False, description="Enable CoreNEURON as submodule")
+ variant("cross-compile", default=False, description="Build for cross-compile environment")
+ variant("interviews", default=False, description="Enable GUI with INTERVIEWS")
+ variant("legacy-unit", default=False, description="Enable legacy units")
+ variant("mpi", default=True, description="Enable MPI parallelism")
+ variant("python", default=True, description="Enable python")
+ variant("rx3d", default=False, description="Enable cython translated 3-d rxd")
+ variant("tests", default=False, description="Enable unit tests")
+ variant("caliper", default=False, description="Add LLNL/Caliper support")
+
+ depends_on("bison", type="build")
+ depends_on("flex", type="build")
+ depends_on("py-cython", when="+rx3d", type="build")
+
+ depends_on("gettext")
+ depends_on("mpi", when="+mpi")
+ depends_on("ncurses")
+ depends_on("python@2.7:", when="+python")
+ depends_on("py-pytest", when="+python+tests")
+ depends_on("readline")
+ depends_on("caliper", when="+caliper")
+ depends_on("py-numpy", type='run')
+
+ conflicts("+rx3d", when="~python")
+
+ patch("patch-v782-git-cmake-avx512.patch", when="@7.8.2")
+
+ def cmake_args(self):
+ spec = self.spec
+
+ def cmake_options(spec_options):
+ value = "TRUE" if spec_options in spec else "FALSE"
+ cmake_name = spec_options[1:].upper().replace("-", "_")
+ return "-DNRN_ENABLE_" + cmake_name + ":BOOL=" + value
+
+ args = [cmake_options(variant) for variant in ["+coreneuron",
+ "+interviews",
+ "+mpi",
+ "+python",
+ "+rx3d",
+ "+coreneuron",
+ "+tests"]]
+ args.append("-DNRN_ENABLE_BINARY_SPECIAL=ON")
+
+ if "~mpi" in spec and '+coreneuron' in spec:
+ args.append("-DCORENRN_ENABLE_MPI=OFF")
+
+ if "+python" in spec:
+ args.append("-DPYTHON_EXECUTABLE:FILEPATH="
+ + spec["python"].command.path)
+
+ if spec.variants['build_type'].value == 'Debug':
+ args.append("-DCMAKE_C_FLAGS=-g -O0")
+ args.append("-DCMAKE_CXX_FLAGS=-g -O0")
+ args.append("-DCMAKE_BUILD_TYPE=Custom")
+
+ if "+legacy-unit" in spec:
+ args.append('-DNRN_DYNAMIC_UNITS_USE_LEGACY=ON')
+
+ if "+caliper" in spec:
+ args.append('-DCORENRN_CALIPER_PROFILING=ON')
+
+ return args
+
+ @run_after("install")
+ def filter_compilers(self):
+ """run after install to avoid spack compiler wrappers
+ getting embded into nrnivmodl script"""
+
+ spec = self.spec
+
+ if "cray" in spec.architecture:
+ cc_compiler = "cc"
+ cxx_compiler = "CC"
+ elif spec.satisfies("+mpi"):
+ cc_compiler = spec["mpi"].mpicc
+ cxx_compiler = spec["mpi"].mpicxx
else:
- neuron_archdir = self.prefix
+ cc_compiler = self.compiler.cc
+ cxx_compiler = self.compiler.cxx
- return neuron_archdir
-
- def patch(self):
- # aclocal need complete include path (especially on os x)
- pkgconf_inc = '-I %s/share/aclocal/' % (self.spec['pkgconfig'].prefix)
- libtool_inc = '-I %s/share/aclocal/' % (self.spec['libtool'].prefix)
- newpath = 'aclocal -I m4 %s %s' % (pkgconf_inc, libtool_inc)
- filter_file(r'aclocal -I m4', r'%s' % newpath, "build.sh")
-
- def get_arch_options(self, spec):
- options = []
-
- if spec.satisfies('+cross-compile'):
- options.extend(['cross_compiling=yes',
- '--without-memacs',
- '--without-nmodl'])
-
- # on os-x disable building carbon 'click' utility
- if 'darwin' in self.spec.architecture:
- options.append('macdarwin=no')
-
- return options
-
- def get_python_options(self, spec):
- options = []
-
- if spec.satisfies('+python'):
- python_exec = spec['python'].command.path
- py_inc = spec['python'].headers.directories[0]
- py_lib = spec['python'].prefix.lib
-
- if not os.path.isdir(py_lib):
- py_lib = spec['python'].prefix.lib64
-
- options.extend(['--with-nrnpython=%s' % python_exec,
- '--disable-pysetup',
- 'PYINCDIR=%s' % py_inc,
- 'PYLIBDIR=%s' % py_lib])
-
- if spec.satisfies('~cross-compile'):
- options.append('PYTHON_BLD=%s' % python_exec)
+ kwargs = {"backup": False, "string": True}
+ nrnmech_makefile = join_path(self.prefix,
+ "./bin/nrnmech_makefile")
+ # assign_operator is changed to fix wheel support
+ if self.spec.satisfies("@:7.99"):
+ assign_operator = "?="
else:
- options.append('--without-nrnpython')
-
- return options
-
- def get_compiler_options(self, spec):
- flags = '-O2 -g'
-
- if self.spec.satisfies('%pgi'):
- flags += ' ' + self.compiler.cc_pic_flag
-
- return ['CFLAGS=%s' % flags,
- 'CXXFLAGS=%s' % flags]
-
- def build_nmodl(self, spec, prefix):
- # build components for front-end arch in cross compiling environment
- options = ['--prefix=%s' % prefix,
- '--with-nmodl-only',
- '--without-x']
-
- if 'cray' in self.spec.architecture:
- flags = '-target-cpu=x86_64 -target-network=none'
- options.extend(['CFLAGS=%s' % flags,
- 'CXXFLAGS=%s' % flags])
-
- configure = Executable(join_path(self.stage.source_path, 'configure'))
- configure(*options)
- make()
- make('install')
-
- def install(self, spec, prefix):
-
- options = ['--prefix=%s' % prefix,
- '--without-iv',
- '--without-x',
- '--without-readline']
-
- if spec.satisfies('+multisend'):
- options.append('--with-multisend')
-
- if spec.satisfies('~rx3d'):
- options.append('--disable-rx3d')
-
- if spec.satisfies('+mpi'):
- options.extend(['MPICC=%s' % spec['mpi'].mpicc,
- 'MPICXX=%s' % spec['mpi'].mpicxx,
- '--with-paranrn'])
- else:
- options.append('--without-paranrn')
-
- if spec.satisfies('~shared'):
- options.extend(['--disable-shared',
- 'linux_nrnmech=no'])
-
- options.extend(self.get_arch_options(spec))
- options.extend(self.get_python_options(spec))
- options.extend(self.get_compiler_options(spec))
-
- build = Executable('./build.sh')
- build()
-
- with working_dir('build', create=True):
- if spec.satisfies('+cross-compile'):
- self.build_nmodl(spec, prefix)
- srcpath = self.stage.source_path
- configure = Executable(join_path(srcpath, 'configure'))
- configure(*options)
- make('VERBOSE=1')
- make('install')
+ assign_operator = "="
+
+ filter_file("CC {0} {1}".format(assign_operator, env["CC"]),
+ "CC = {0}".format(cc_compiler),
+ nrnmech_makefile,
+ **kwargs)
+ filter_file("CXX {0} {1}".format(assign_operator, env["CXX"]),
+ "CXX = {0}".format(cxx_compiler),
+ nrnmech_makefile,
+ **kwargs)
+
+ if spec.satisfies("+coreneuron"):
+ corenrn_makefile = join_path(self.prefix,
+ "share/coreneuron/nrnivmodl_core_makefile")
+ filter_file(env["CXX"], cxx_compiler, corenrn_makefile, **kwargs)
def setup_run_environment(self, env):
- neuron_archdir = self.get_neuron_archdir()
- env.prepend_path('PATH', join_path(neuron_archdir, 'bin'))
- env.prepend_path('LD_LIBRARY_PATH', join_path(neuron_archdir, 'lib'))
-
- def setup_dependent_build_environment(self, env, dependent_spec):
- neuron_archdir = self.get_neuron_archdir()
- env.prepend_path('PATH', join_path(neuron_archdir, 'bin'))
- env.prepend_path('LD_LIBRARY_PATH', join_path(neuron_archdir, 'lib'))
+ env.prepend_path("PATH", join_path(self.prefix, "bin"))
+ env.prepend_path("LD_LIBRARY_PATH", join_path(self.prefix, "lib"))
+ if self.spec.satisfies("+python"):
+ env.prepend_path("PYTHONPATH", self.spec.prefix.lib.python)