From d24782c86d84d51ac3ef7404c9e4a4eb6b9eab7e Mon Sep 17 00:00:00 2001 From: Pramod S Kumbhar Date: Thu, 4 Jan 2018 16:55:30 +0100 Subject: Adding NEURON simulator package (#5097) * Adding NEURON package widely used in computational neuroscience community * flake8 fixes * Add rx3d variant * Addressed review comments from Adam * Addressed 2nd review comments * Added check for +mpi on bg-q * Filter spack compiler wrappers in NEURON scripts Add gcc march=native flag to make front-end build robust * Make develop as preferred version due to bug in long filename handlings in <= v7.4 * Avoid use of gcc in cross compiling environment Use arch specific options on cray and bg-q arch * Simplify cross compiling build: - v7.5 added and no longer need develop as preferred version - legacy cray related options removed - cross compiling args reduced - python arguments reduced as neuron finds proper libraries * Simplify bg-q configurations * Cleanup and unify arch options * Make sure to add commonly available packages as dependency * Arch path added to dependent_environment as nrniv needed at runtime * Support for Power 8 architecture * Fix python3 on OS X * flake8 fix * remove unnecessary conflcist directives --- var/spack/repos/builtin/packages/neuron/package.py | 224 +++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 var/spack/repos/builtin/packages/neuron/package.py (limited to 'var') 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..245d2d2902 --- /dev/null +++ b/var/spack/repos/builtin/packages/neuron/package.py @@ -0,0 +1,224 @@ +############################################################################## +# 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 NOTICE and LICENSE files 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 +############################################################################## +import os +from spack import * + + +class Neuron(Package): + + """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" + github = "https://github.com/nrnhines/nrn" + + version('7.5', '1641ae7a7cd02728e5ae4c8aa93b3749') + version('7.4', '2c0bbee8a9e55d60fa26336f4ab7acbf') + version('7.3', '993e539cb8bf102ca52e9fefd644ab61') + version('7.2', '5486709b6366add932e3a6d141c4f7ad') + version('develop', git=github) + + 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('pkg-config', type='build') + + depends_on('mpi', when='+mpi') + depends_on('python@2.6:', when='+python') + depends_on('ncurses', when='~cross-compile') + + def patch(self): + # aclocal need complete include path (especially on os x) + pkgconf_inc = '-I %s/share/aclocal/' % (self.spec['pkg-config'].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_arch_dir(self): + if 'bgq' in self.spec.architecture: + arch = 'powerpc64' + elif 'cray' in self.spec.architecture: + arch = 'x86_64' + elif 'ppc64le' in self.spec.architecture: + arch = 'powerpc64le' + else: + arch = self.spec.architecture.target + + return arch + + 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') + + @run_after('install') + def filter_compilers(self): + """run after install to avoid spack compiler wrappers + getting embded into nrnivmodl script""" + + arch = self.get_arch_dir() + nrnmakefile = join_path(self.prefix, arch, 'bin/nrniv_makefile') + + kwargs = { + 'backup': False, + 'string': True + } + + filter_file(env['CC'], self.compiler.cc, nrnmakefile, **kwargs) + filter_file(env['CXX'], self.compiler.cxx, nrnmakefile, **kwargs) + + def setup_environment(self, spack_env, run_env): + arch = self.get_arch_dir() + run_env.prepend_path('PATH', join_path(self.prefix, arch, 'bin')) + + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): + arch = self.get_arch_dir() + spack_env.prepend_path('PATH', join_path(self.prefix, arch, 'bin')) -- cgit v1.2.3-60-g2f50