Skip to content
Snippets Groups Projects
package.py 8.25 KiB
Newer Older
Dennis Terhorst's avatar
Dennis Terhorst committed
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
Athanasios Karmas's avatar
Athanasios Karmas committed
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

from spack import *


class Nest(CMakePackage):
    """NEST is a simulator for spiking neural network models
Athanasios Karmas's avatar
Athanasios Karmas committed
    It focuses on the dynamics, size and structure of neural systems rather
    than on the exact morphology of individual neurons."""

    homepage = "http://www.nest-simulator.org"
Dennis Terhorst's avatar
Dennis Terhorst committed
    urls     = [
        #
        # note: for early nest releases the refs/tags/xxx.tar.gz is different
        # from download/v2.x.y/...tar.gz! The download one already had the
        # `make dist` boot-strapping done.
        #
        #'https://github.com/nest/nest-simulator/releases/download/v2.12.0/nest-2.12.0.tar.gz',
        'https://github.com/nest/nest-simulator/archive/refs/tags/v2.12.0.tar.gz',

        'https://github.com/nest/nest-simulator/archive/refs/tags/v3.0.tar.gz'
Athanasios Karmas's avatar
Athanasios Karmas committed
    git      = "https://github.com/nest/nest-simulator.git"

    version('master', branch='master')
Dennis Terhorst's avatar
Dennis Terhorst committed
    version('3.3',    sha256='179462b966cc61f5785d2fee770bc36f86745598ace9cd97dd620622b62043ed')
    version('3.2',    sha256='583d5725882ad5e8fd4fc7ffab425da97cbbb91fadbc327e940c184e8892b958')
    patch('nest-simulator-3.2-p1-VersionNumber.patch', when='@3.2')
    version('3.1',    sha256='5c11dd6b451c4c6bf93037bf29d5231c6c75a0e1a8863344f6fb9bb225f279ca')
Dennis Terhorst's avatar
Dennis Terhorst committed
    version('3.0',    sha256='d481ea67f3251fe3aadf5252ab0a999172f0cd5536c5985366d271d772e686e6')
    patch('2021-07-17_fix-pyexecdir.patch', when='@3.0')
    version('2.20.2', sha256='7c36daf673b379b8ef82d2293a4cdf2f4dbb5d25bf570cf52f41f6293c89a28d')
Dennis Terhorst's avatar
Dennis Terhorst committed
    version('2.20.1', sha256='df3d32b5899d5d444f708037b290f889ac6ff8eae6b7be9e9faee2c0d660d8e5')
    version('2.20.0', sha256='40e33187c22d6e843d80095b221fa7fd5ebe4dbc0116765a91fc5c425dd0eca4', deprecated=True)
    version('2.18.0', sha256='7295c936fbdd5486395b06f54f0d4d35d9a1b6ee50b7b844186ec2c92de641d1', deprecated=True)
    version('2.16.0', sha256='abfeb61719dec54da9477be035bef1d9d764f4e7663f63f6a6d9211f967e0490', deprecated=True)
    version('2.14.1', sha256='23aeadd0b8eda83a31797751f96855b0208979d70472e0f6752a7ce7ea80ad7a')
Athanasios Karmas's avatar
Athanasios Karmas committed
    version('2.14.0', sha256='d6316d6c9153100a3220488abfa738958c4b65bf2622bd15540e4aa81e79f17f')
    version('2.12.0', sha256='bac578f38bb0621618ee9d5f2f1febfee60cddc000ff32e51a5f5470bb3df40d')
    version('2.10.0', sha256='2b6fc562cd6362e812d94bb742562a5a685fb1c7e08403765dbe123d59b0996c')
    version('2.8.0',  sha256='d47325b27a5599b6ea58a3c4ef06656e7c5a4941c4e94dec6a5c2fa956209915')
    version('2.6.0',  sha256='5fe4924bc57d0c7dd820aa371de935eedf7e813832c0eee2c976b33c9a8db4cf')
    version('2.4.2',  sha256='8f86e58c1a12b733ffabd8b0400326e5a3494a458149ea8ebe9f19674d05b91b')

Dennis Terhorst's avatar
Dennis Terhorst committed
    variant('python', default=True,
            description='Build the PyNEST interface')
Dennis Terhorst's avatar
Dennis Terhorst committed
    variant('mpi', default=True,
Athanasios Karmas's avatar
Athanasios Karmas committed
            description='Build with MPI bindings')
    variant('openmp', default=True,
            description='"Enable OpenMP support"')
    variant('optimize', default=True,
            description='Build with MPI bindings')
    variant('modules', default=False,
            description='Enables external module support')
    variant('gsl',     default=True,
            description="Enable GNU Scientific Library")
    variant('shared',   default=True,
            description="Build shared libraries")
    variant('boost',    default=True,
            description="Enable optimizations provided via Boost library algorithms and containers")
Athanasios Karmas's avatar
Athanasios Karmas committed
    # TODO add variants for neurosim and music when these are in spack

    conflicts('~gsl', when='@:2.10.99',
              msg='Option only introduced for non-ancient versions.')
    conflicts('~shared', when='@:2.10.99',
              msg='Option only introduced for non-ancient versions.')
    conflicts('~openmp', when='@:2.10.99',
              msg='Option only introduced for non-ancient versions.')

Dennis Terhorst's avatar
Dennis Terhorst committed
    #depends_on('python@2.6:2.99',       when='@:2.14+python', type=('build', 'run'))
    depends_on('python@2.6:2.99',   when='@:2.15.99+python', type=('build', 'run'))
    depends_on('python@2.6:',       when='@2.16:+python', type=('build', 'run'))
    depends_on('python@3.8:',       when='@3:', type=('build', 'run'))
    depends_on('py-numpy@:1.16.99', when='@:2.14.99+python', type=('build', 'run'))
Athanasios Karmas's avatar
Athanasios Karmas committed
    depends_on('py-numpy',          when='+python', type=('build', 'run'))
    depends_on('py-cython@0.19.2:', when='+python', type='build')
    depends_on('py-nose',           when='+python', type='test')
    depends_on('py-setuptools',     when='+python', type='build')
    depends_on('boost',             when="@2.16:+boost", type='build')
Dennis Terhorst's avatar
Dennis Terhorst committed
    depends_on('py-setuptools@:44.99.99',     when='@:2.15.99+python', type='build')
Athanasios Karmas's avatar
Athanasios Karmas committed

    depends_on('mpi', when='+mpi')
    depends_on('doxygen', type='build')
    depends_on('gsl', when='+gsl')
    depends_on('readline')
Athanasios Karmas's avatar
Athanasios Karmas committed
    depends_on('libtool')
    depends_on('pkgconfig', type='build')

    extends('python', when='+python')

    # Before 2.12.0 it was an autotools package
    @when('@:2.10.99')
    def cmake(self, spec, prefix):
        pass

    @when('@:2.10.99')
    def build(self, spec, prefix):
        pass

    @when('@:2.10.99')
    def install(self, spec, prefix):
Dennis Terhorst's avatar
Dennis Terhorst committed
        # calculate the "./configure" flags (not cmake!)
Athanasios Karmas's avatar
Athanasios Karmas committed
        configure_args = ["CXXFLAGS=-std=c++03",
                          "--prefix=" + prefix,
                          "--with-openmp"]
        if '+python' in spec:
            configure_args.append("--with-python")
        else:
            configure_args.append("--without-python")
        if '+mpi' in spec:
            configure_args.append("--with-mpi")
        else:
            configure_args.append("--without-mpi")
        if '+optimize' in spec:
            configure_args.append("--with-optimize")
        else:
            configure_args.append("--without-optimize")

Dennis Terhorst's avatar
Dennis Terhorst committed
        if 'mpi' in spec:
            env['CC'] = spec['mpi'].mpicc
            env['CXX'] = spec['mpi'].mpicxx
            env['F77'] = spec['mpi'].mpif77
            env['FC'] = spec['mpi'].mpifc
Athanasios Karmas's avatar
Athanasios Karmas committed

Athanasios Karmas's avatar
Athanasios Karmas committed
        make()
        make("install")

    def cmake_args(self):
Athanasios Karmas's avatar
Athanasios Karmas committed

        for flag in "boost mpi openmp optimize".split():
            if '+' + flag in self.spec:
                args.append('-Dwith-'+flag+'=ON')
            else:
                args.append('-Dwith-'+flag+'=OFF')
Athanasios Karmas's avatar
Athanasios Karmas committed

Dennis Terhorst's avatar
Dennis Terhorst committed
        if '+gsl' in self.spec:
            args.append('-Dwith-gsl=' + self.spec['gsl'].prefix)
Athanasios Karmas's avatar
Athanasios Karmas committed
        else:
Dennis Terhorst's avatar
Dennis Terhorst committed
            args.append('-Dwith-gsl=OFF')

        if self.spec.satisfies('@:2.999'):
            if '+python':
                version = self.spec['python'].version[0]
                args.append('-Dwith-python={0}'.format(version))
                args.append('-Dcythonize-pynest=' + self.spec['py-cython'].prefix)
            else:
                args.append('-Dwith-python=OFF')
                args.append('-Dcythonize-pynest=OFF')
Athanasios Karmas's avatar
Athanasios Karmas committed

        if '+shared' in self.spec:
            args.append('-Dstatic-libraries=OFF')
        else:
            args.append('-Dstatic-libraries=ON')

        return args

    @when('@:2.14.0+modules')
    @run_after('install')
    def install_headers(self):
        # copy source files to installation folder for older versions
        # (these are needed for modules to build against)
        # see https://github.com/nest/nest-simulator/pull/844
        path_headers = join_path(prefix, "include", "nest")

        mkdirp(path_headers)

        for suffix in ["h", "hpp"]:
            for f in find_headers('*.{0}'.format(suffix),
                                  self.stage.source_path, recursive=True):
                install(f, path_headers)

Dennis Terhorst's avatar
Dennis Terhorst committed
    @run_after('install')
    @on_package_attributes(run_tests=True)
    def installcheck(self):
        make("installcheck")

    # quick-fix to add lib64/python3.8/site-packages to the PYTHONPATH;
    # this should happen automatically for packages extending Python...
    def setup_run_environment(self, env):
        env.prepend_path('PYTHONPATH', self.prefix.lib64.join('python3.8/site-packages'))

    def install_test(self):
        # test inspired by py-numpy spack package
        with working_dir('spack-test', create=True):
            python('-c', 'from pprint import pprint; import nest; pprint(nest.get())')