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.py202
1 files changed, 202 insertions, 0 deletions
diff --git a/var/spack/repos/builtin/packages/neuron/package.py b/var/spack/repos/builtin/packages/neuron/package.py
new file mode 100644
index 0000000000..ade0552c60
--- /dev/null
+++ b/var/spack/repos/builtin/packages/neuron/package.py
@@ -0,0 +1,202 @@
+# Copyright 2013-2018 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):
+ """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.
+ """
+
+ 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', 'fb72c841374dfacbb6c2168ff57bfae9')
+ version('7.4', '2c0bbee8a9e55d60fa26336f4ab7acbf')
+ version('7.3', '993e539cb8bf102ca52e9fefd644ab61')
+ version('7.2', '5486709b6366add932e3a6d141c4f7ad')
+
+ 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]))
+ else:
+ neuron_archdir = self.prefix
+
+ 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'])
+
+ # need to enable bg-q arch
+ if 'bgq' in self.spec.architecture:
+ options.extend(['--enable-bluegeneQ',
+ '--host=powerpc64'])
+
+ # 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)
+
+ else:
+ options.append('--without-nrnpython')
+
+ return options
+
+ def get_compiler_options(self, spec):
+ flags = '-O2 -g'
+
+ if 'bgq' in self.spec.architecture:
+ flags = '-O3 -qtune=qp -qarch=qp -q64 -qstrict -qnohot -g'
+
+ if self.spec.satisfies('%pgi'):
+ flags += ' ' + self.compiler.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 'bgq' in self.spec.architecture:
+ flags = '-qarch=ppc64'
+ options.extend(['CFLAGS=%s' % flags,
+ 'CXXFLAGS=%s' % flags])
+
+ 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')
+
+ def setup_environment(self, spack_env, run_env):
+ neuron_archdir = self.get_neuron_archdir()
+ run_env.prepend_path('PATH', join_path(neuron_archdir, 'bin'))
+ run_env.prepend_path(
+ 'LD_LIBRARY_PATH', join_path(neuron_archdir, 'lib'))
+
+ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
+ neuron_archdir = self.get_neuron_archdir()
+ spack_env.prepend_path('PATH', join_path(neuron_archdir, 'bin'))
+ spack_env.prepend_path(
+ 'LD_LIBRARY_PATH', join_path(neuron_archdir, 'lib'))