diff options
Diffstat (limited to 'var/spack/repos/builtin/packages/neuron/package.py')
-rw-r--r-- | var/spack/repos/builtin/packages/neuron/package.py | 281 |
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) |