Blob Blame History Raw
# This is a serial build of NEURON
%global _description %{expand:
NEURON is a simulation environment for modeling individual neurons and networks
of neurons. It provides tools for conveniently building, managing, and using
models in a way that is numerically sound and computationally efficient. It is
particularly well-suited to problems that are closely linked to experimental
data, especially those that involve cells with complex anatomical and
biophysical properties.

Please install the %{name}-devel package to compile nmodl files, and please
install the MPI specific sub-packages for MPICH and OpenMPI builds.
}

%global tarname nrn

# fails somehow, disabled by default
%bcond_with metis

# Music support
%bcond_with music

%bcond_without mpich
%bcond_without openmpi

Name:       neuron
Version:    8.0.2
Release:    %autorelease
Summary:    A flexible and powerful simulator of neurons and networks

License:    GPLv3+
URL:        http://www.neuron.yale.edu/neuron/
Source0:    https://github.com/neuronsimulator/%{tarname}/archive/%{version}/%{name}-%{version}.tar.gz

# they bundle HPC coding conventions as a git submodule
%global conv_git_commit  c45cd96e8aa5d033f201347c11fb8889548d93cf
%global conv_short_commit %(c=%{conv_git_commit}; echo ${c:0:7})
Source1:    https://github.com/BlueBrain/hpc-coding-conventions/archive/%{conv_git_commit}/hpc-coding-conventions-%{conv_short_commit}.tar.gz

%global rxd_tests_commit 3a6aca90a57554d46e3eb310ff5ad618c57dce49
%global rxd_short_commit %(c=%{rxd_tests_commit}; echo ${c:0:7})
Source2:    https://github.com/neuronsimulator/rxdtestdata/archive/%{rxd_tests_commit}/rxdtestdata-%{rxd_short_commit}.tar.gz


Patch0:     0001-Unbundle-Random123.patch
# libstdc++ bundled is from 1988: seems heavily modified. Headers from there
# are not present in the current version
# https://github.com/neuronsimulator/nrn/issues/145

# Use system copy of Catch
Patch1:     0002-Unbundle-catch.patch
# We install the python bits ourselves
Patch2:     0003-Disable-python-build-and-install.patch
# Set soversions for all shared objects
Patch3:     0004-Set-soversions-for-libs.patch
# Set the right path for libdir
# Upstreamable
Patch4:     0005-Correct-librxdmath-path-for-64bit.patch
# stop build scripts from generating version during build
Patch5:     0006-Do-not-generate-version-info-at-buildtime.patch
# Remove rpaths
Patch6:     0007-Remove-rpaths.patch
# do not download data git submodule
Patch7:     0008-Dont-download-testdata-submodule.patch
# place help file in correct location
Patch8:     0009-Add-help-file-as-package-data.patch

# Random123 does not build on these, so neither can NEURON
# https://github.com/neuronsimulator/nrn/issues/114
ExcludeArch:    mips64r2 mips32r2

BuildRequires:  make
BuildRequires:  autoconf
BuildRequires:  automake
BuildRequires:  bison
BuildRequires:  bison-devel
BuildRequires:  cmake
BuildRequires:  catch-devel
# Needs to be packaged separately
# BuildRequires:  coreneuron-devel
BuildRequires:  flex
BuildRequires:  (flex-devel or libfl-devel)
BuildRequires:  gcc
BuildRequires:  gcc-c++
BuildRequires:  git-core
# the cmake build requires iv with cmake too
BuildRequires:  iv-devel >= 0.1
BuildRequires:  libX11-devel
BuildRequires:  libXext-devel
BuildRequires:  libtool
%if %{with metis}
BuildRequires:  metis-devel
%endif
BuildRequires:  ncurses-devel
BuildRequires:  readline-devel
BuildRequires:  Random123-devel

# Bundles sundials. WIP
# https://github.com/neuronsimulator/nrn/issues/113
# BuildRequires:  sundials-devel
Provides: bundled(sundials) = 2.0.1

%description %_description

%package devel
Summary:    Development files for %{name}
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires:  ncurses-devel
Requires:  readline-devel
Requires:  gcc-c++
Requires:  libtool
Requires:  libX11-devel
Requires:  libXext-devel

%description devel
Headers and development shared libraries for the %{name} package

%package doc
Summary:    Documentation for %{name}
BuildArch:  noarch

%description doc
Documentation for %{name}

%package -n python3-%{name}
Summary:   Python3 interface to %{name}
Requires:  %{name}%{?_isa} = %{version}-%{release}
BuildRequires:  python3-devel
BuildRequires:  python3-setuptools
BuildRequires:  python3-Cython
BuildRequires:  python3-pytest

%description -n python3-%{name} %_description

%if %{with mpich}
%package mpich
Summary:   %{name} built with MPICH support
BuildRequires:  mpich-devel
BuildRequires:  rpm-mpi-hooks
BuildRequires:  python3-mpi4py-mpich

Requires:       mpich
Requires:       python3-mpi4py-mpich


%description mpich %_description

%package mpich-devel
Summary:    Development files for %{name}
Requires: %{name}-mpich%{?_isa} = %{version}-%{release}

%description mpich-devel
Headers and development shared libraries for the %{name} package

%package -n python3-%{name}-mpich
Summary:    Python3 interface to %{name}-mpich
Requires:  %{name}-mpich%{?_isa} = %{version}-%{release}

%description -n python3-%{name}-mpich %_description
%endif

%if %{with openmpi}
%package openmpi
Summary:   %{name} built with OpenMPI support
BuildRequires:  openmpi-devel
BuildRequires:  rpm-mpi-hooks
BuildRequires:  python3-mpi4py-openmpi

Requires:       openmpi
Requires:       python3-mpi4py-openmpi


%description openmpi %_description

%package openmpi-devel
Summary:    Development files for %{name}
Requires: %{name}-openmpi%{?_isa} = %{version}-%{release}

%description openmpi-devel
Headers and development shared libraries for the %{name} package

%package -n python3-%{name}-openmpi
Summary:    Python3 interface to %{name}-openmpi
Requires:  %{name}-openmpi%{?_isa} = %{version}-%{release}

%description -n python3-%{name}-openmpi %_description
%endif

%prep
%autosetup -n %{tarname}-%{version} -S git

# Remove executable perms from source files
find src -type f -executable ! -name '*.sh' -exec chmod -x {} +

# remove shebangs: check again each release
pushd share/lib/auditscripts/
for f in *
do
sed -i -e "/^#!\/bin\/sh.*/ d" $f
done
popd

# Remove bundled Random123
rm -rf src/Random123
rm -rf src/readline

# extract coding convention tar
# can probably use setup macro etc.
pushd external/coding-conventions
cp %SOURCE1 .
tar -xvf hpc-coding-conventions*.tar.gz --strip-components=1
rm -f hpc-coding-conventions*.tar.gz
popd

# extract rxdtestdata tar
pushd test/rxd/testdata
cp %SOURCE2 .
tar -xvf rxdtestdata*.tar.gz --strip-components=1
rm -f rxdtestdata*.tar.gz
popd

# Create version file ourselves
# To create this, we run the git2version.sh script in a checked out copy of neuron
export TIMESTAMP=$(date +%Y-%m-%d)
cat > src/nrnoc/nrnversion.h << EOF
#define GIT_DATE "$TIMESTAMP"
#define GIT_BRANCH "master"
#define GIT_CHANGESET "f0ca745418e942ad4763bdc47459c409f0b11512"
#define GIT_DESCRIBE "8.0.2 (Fedora %{fedora})"
EOF

# Use system libtool instead of a local copy that neuron tries to install
for f in bin/*_makefile.in; do
    sed -r -i 's|(LIBTOOL.*=.*)\$\(pkgdatadir\)(.*)|\1$(bindir)\2|' $f
done

# Stop system from using hard coded flags
sed -i '/CompilerFlagsHelpers/ d' cmake/ReleaseDebugAutoFlags.cmake

%build
# Not yet to be used
# export SUNDIALS_SYSTEM_INSTALL="yes"
%global do_build %{expand:
echo
echo "*** BUILDING %{name}-%{version}$MPI_COMPILE_TYPE ***"
echo
%set_build_flags
    cmake \\\
        -DCMAKE_C_FLAGS_RELEASE:STRING="-DNDEBUG" \\\
        -DCMAKE_CXX_FLAGS_RELEASE:STRING="-DNDEBUG" \\\
        -DCMAKE_Fortran_FLAGS_RELEASE:STRING="-DNDEBUG" \\\
        -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \\\
        -DCMAKE_INSTALL_INCLUDEDIR:PATH=$MPI_INCLUDE \\\
        -DCMAKE_INSTALL_LIBDIR:PATH=$MPI_LIB \\\
        -DSYSCONF_INSTALL_DIR:PATH=%{_sysconfdir} \\\
        -DSHARE_INSTALL_PREFIX:PATH=%{_datadir} \\\
        -DCMAKE_SKIP_RPATH:BOOL=ON \\\
        -DCMAKE_INSTALL_PREFIX:PATH=$MPI_HOME \\\
        -DBUILD_SHARED_LIBS:BOOL=ON \\\
        -DNRN_ENABLE_SHARED=ON \\\
        -DNRN_ENABLE_INTERVIEWS=ON \\\
        -DNRN_ENABLE_PYTHON=ON \\\
        -DNRN_ENABLE_PYTHON_DYNAMIC=OFF \\\
        -DNRN_ENABLE_THREADS=ON \\\
        -DNRN_ENABLE_MEMACS=ON \\\
        -DNRN_ENABLE_RX3D=ON \\\
        -DNRN_ENABLE_CORENEURON=OFF \\\
        -DNRN_ENABLE_TESTS=OFF \\\
        -DNRN_ENABLE_REL_RPATH=OFF \\\
        -DNRN_ENABLE_MODULE_INSTALL=ON \\\
        -DNRN_ENABLE_INTERNAL_READLINE=OFF \\\
        -DNRN_ENABLE_MPI=$MPI_YES \\\
        -DNEURON_CMAKE_FORMAT:BOOL=OFF \\\
        -DMPI_INCLUDE_PATH=$MPI_INCLUDE \\\
        -DMPI_LIBRARY=$MPI_LIBFILE \\\
%if "%{_lib}" == "lib64" \
        -DLIB_SUFFIX=64 -B $MY_CMAKE_BUILDDIR && \
%else                      \
        -DLIB_SUFFIX="" -B $MY_CMAKE_BUILDDIR && \
%endif
%__cmake --build $MY_CMAKE_BUILDDIR %{_smp_mflags} \

%if %{with music}
pushd $MY_CMAKE_BUILDDIR/src/neuronmusic
%__cmake --build %{_smp_mflags}
%{py3_build}
popd
%endif
}


# Serial version
export MPI_COMPILER=serial
export MPI_SUFFIX=""
export MPI_HOME=%{_prefix}
export MPI_BIN=%{_bindir}
export MPI_INCLUDE=%{_includedir}
export MPI_LIB="%{_libdir}"
export MPI_LIBFILE=""
export MPI_YES=OFF
# Python 3
export MPI_COMPILE_TYPE=""
export MPI_SITEARCH="%{python3_sitearch}"
export MY_CMAKE_BUILDDIR="%_vpath_builddir"
%{do_build}

# MPICH
%if %{with mpich}
%{_mpich_load}
export CC=mpicc
export CXX=mpicxx
export FC=mpif90
export F77=mpif77
export MPI_YES=ON
# Python 3
export MPI_COMPILE_TYPE="-mpich"
export MY_CMAKE_BUILDDIR="%_vpath_builddir""-mpich"
export MPI_LIBFILE="$MPI_LIB/libmpi.so"
%{do_build}
%{_mpich_unload}
%endif

# OpenMPI
%if %{with openmpi}
%{_openmpi_load}
export CC=mpicc
export CXX=mpicxx
export FC=mpif90
export F77=mpif77
export MPI_YES=ON
# Python 3
export MPI_COMPILE_TYPE="-openmpi"
export MY_CMAKE_BUILDDIR="%_vpath_builddir""-openmpi"
export MPI_LIBFILE="$MPI_LIB/libmpi.so"
%{do_build}
%{_openmpi_unload}
%endif

%install
# Install everything

%global do_install %{expand:
echo
echo "*** INSTALLING %{name}-%{version}$MPI_COMPILE_TYPE ***"
echo
DESTDIR=%{buildroot} %__cmake --install $MY_CMAKE_BUILDDIR

%if %{with music}
pushd $MY_CMAKE_BUILDDIR/src/neuronmusic
%{py3_install}
popd
%endif

# Python bits from the post install hook
# It requires the libraries before to be installed, not just built, so it must
# be done here. The only alternative is a different package that requires this,
# but this is simpler
RPM_LD_FLAGS="%{?__global_ldflags} -L$RPM_BUILD_ROOT/$MPI_LIB"
pushd $MY_CMAKE_BUILDDIR/src/nrnpython/
%{py3_build}
%{py3_install "--install-lib" "$MPI_PYTHON3_SITEARCH"}
popd

# set up second symlink for shared objects
pushd $RPM_BUILD_ROOT/$MPI_LIB/
    ln -sv ./libnrniv.so.0.0.0 libnrniv.so.0
    ln -sv ./librxdmath.so.0.0.0 librxdmath.so.0
popd
}

%global do_post_install_tweaks %{expand:
# Remove installed libfiles
rm -rfv $RPM_BUILD_ROOT/$MPI_HOME/lib/python/neuron/
# Post install clean up: remove stray object files
# Must be done at end, otherwise it deletes object files required for other builds
find . $RPM_BUILD_ROOT/$MPI_LIB/ -name "*.o" -exec rm -f '{}' \\;
# Remove libtool archives
find . $RPM_BUILD_ROOT/$MPI_LIB/ -name "*.la" -exec rm -f '{}' \\;
# Remove installed copy of libtool
# Remove iv header provided by iv package
rm -rf $RPM_BUILD_ROOT/$MPI_HOME/include/ivstream.h
# Delete installed libtool
rm -fv $RPM_BUILD_ROOT/$MPI_HOME/share/%{tarname}/libtool

# remove package note flag from nrnmech_makefile
pushd $RPM_BUILD_ROOT/$MPI_BIN/
    sed -i "s|-Wl,-dT,.*\.ld||" nrnmech_makefile
popd
# Only needed for MPI builds
if [ x"$MPI_SUFFIX" != "x" ]
then
# Do not install demo files for MPI packages
rm -rf $RPM_BUILD_ROOT/$MPI_HOME/share/%{tarname}/demo
# Renaming MPI bits
pushd $RPM_BUILD_ROOT/$MPI_BIN/
# Rename file references to use MPI_SUFFIX before renaming them
sed -i "s/nrniv\"/nrniv$MPI_SUFFIX\"/g" nrngui
sed -i -e "s/nrniv\"/nrniv$MPI_SUFFIX\"/g" -e "s/nrnmech_makefile/nrnmech_makefile$MPI_SUFFIX/g" -e "s/nocmodl/nocmodl$MPI_SUFFIX/g" nrnivmodl
sed -i -e "s/nocmodl/nocmodl$MPI_SUFFIX/g" nrnmech_makefile
sed -i -e "s/nocmodl/nocmodl$MPI_SUFFIX/g" mkthreadsafe

# Rename files to include $MPI_SUFFIX
for f in modlunit neurondemo nrngui nrniv sortspike mkthreadsafe nocmodl nrnivmodl nrnmech_makefile
do
    mv -v "$f"{,$MPI_SUFFIX}
done
mv -v nrnpyenv{,$MPI_SUFFIX}.sh
mv -v set_nrnpyenv{,$MPI_SUFFIX}.sh
popd
fi
}

# Serial
export MPI_LIB="%{_libdir}"
export MPI_COMPILE_TYPE=""
export MPI_PYTHON3_SITEARCH=%{python3_sitearch}
export MY_CMAKE_BUILDDIR="%_vpath_builddir"
export MPI_HOME="%{_prefix}"
export MPI_BIN="%{_bindir}"
export MPI_SUFFIX=""
%do_install
%do_post_install_tweaks
# Remove duplicate files. These are installed in the correct python locations already
# rm -rf $RPM_BUILD_ROOT/%%{_datadir}/%%{tarname}/lib/python/%%{name}



# mpich
%if %{with mpich}
%{_mpich_load}
export MPI_COMPILE_TYPE="-mpich"
export MY_CMAKE_BUILDDIR="%_vpath_builddir""-mpich"
%do_install
%do_post_install_tweaks
%{_mpich_unload}
%endif

# OpenMPI
%if %{with openmpi}
%{_openmpi_load}
export MPI_COMPILE_TYPE="-openmpi"
export MY_CMAKE_BUILDDIR="%_vpath_builddir""-openmpi"
%do_install
%do_post_install_tweaks
%{_openmpi_unload}
%endif

# The makefiles do not have shebangs
%files
%license Copyright
%{_bindir}/modlunit
%{_bindir}/neurondemo
%{_bindir}/nrngui
%{_bindir}/nrniv
%{_bindir}/sortspike
# Not needed but I'll include them for completeness anyway
%{_bindir}/nrnpyenv.sh
%{_bindir}/set_nrnpyenv.sh
# Libs
%{_libdir}/libnrniv.so.0.0.0
%{_libdir}/libnrniv.so.0
%{_libdir}/librxdmath.so.0.0.0
%{_libdir}/librxdmath.so.0
# other hoc files and data
%dir %{_datadir}/%{tarname}
%{_datadir}/%{tarname}/lib

# Python bits
%files -n python3-%{name}
# The libraries are here
%{python3_sitearch}/%{name}
# Egg info
%{python3_sitearch}/NEURON-*-py%{python3_version}.egg-info

%files devel
%license Copyright
%doc README.md
%{_bindir}/mkthreadsafe
%{_bindir}/nocmodl
%{_bindir}/nrnivmodl
%{_bindir}/nrnmech_makefile
# Headers
%{_includedir}/*.h
%{_includedir}/nrncvode/
# Shared objects
%{_libdir}/libnrniv.so
%{_libdir}/librxdmath.so
# required by neuron
# https://github.com/neuronsimulator/nrn/issues/719#issuecomment-677501890
%{_datadir}/%{tarname}/nrnmain.cpp

%files doc
%license Copyright
%{_datadir}/%{tarname}/demo

%if %{with mpich}
%files mpich
%license Copyright
%{_libdir}/mpich/bin/modlunit_mpich
%{_libdir}/mpich/bin/neurondemo_mpich
%{_libdir}/mpich/bin/nrngui_mpich
%{_libdir}/mpich/bin/nrniv_mpich
%{_libdir}/mpich/bin/sortspike_mpich
# Not needed but I'll include them for completeness anyway
%{_libdir}/mpich/bin/nrnpyenv_mpich.sh
%{_libdir}/mpich/bin/set_nrnpyenv_mpich.sh
# Libs
%{_libdir}/mpich/lib/libnrniv.so.0.0.0
%{_libdir}/mpich/lib/libnrniv.so.0
%{_libdir}/mpich/lib/librxdmath.so.0.0.0
%{_libdir}/mpich/lib/librxdmath.so.0
#
%dir %{_libdir}/mpich/share/%{tarname}
%{_libdir}/mpich/share/%{tarname}/lib

# Python bits
%files -n python3-%{name}-mpich
# The libraries are here
%{python3_sitearch}/mpich/%{name}
# Egg info
%{python3_sitearch}/mpich/NEURON-*-py%{python3_version}.egg-info

%files mpich-devel
%license Copyright
%doc README.md
%{_libdir}/mpich/bin/mkthreadsafe_mpich
%{_libdir}/mpich/bin/nocmodl_mpich
%{_libdir}/mpich/bin/nrnivmodl_mpich
%{_libdir}/mpich/bin/nrnmech_makefile_mpich
# Headers
%{_libdir}/mpich/include/*.h
%{_libdir}/mpich/include/nrncvode/
# Shared objects
%{_libdir}/mpich/lib/libnrniv.so
%{_libdir}/mpich/lib/librxdmath.so
# required by neuron
# https://github.com/neuronsimulator/nrn/issues/719#issuecomment-677501890
%{_libdir}/mpich/share/%{tarname}/nrnmain.cpp
%endif

%if %{with openmpi}
%files openmpi
%license Copyright
%{_libdir}/openmpi/bin/modlunit_openmpi
%{_libdir}/openmpi/bin/neurondemo_openmpi
%{_libdir}/openmpi/bin/nrngui_openmpi
%{_libdir}/openmpi/bin/nrniv_openmpi
%{_libdir}/openmpi/bin/sortspike_openmpi
# Not needed but I'll include them for completeness anyway
%{_libdir}/openmpi/bin/nrnpyenv_openmpi.sh
%{_libdir}/openmpi/bin/set_nrnpyenv_openmpi.sh
# Libs
%{_libdir}/openmpi/lib/libnrniv.so.0.0.0
%{_libdir}/openmpi/lib/libnrniv.so.0
%{_libdir}/openmpi/lib/librxdmath.so.0.0.0
%{_libdir}/openmpi/lib/librxdmath.so.0
#
%dir %{_libdir}/openmpi/share/%{tarname}
%{_libdir}/openmpi/share/%{tarname}/lib

# Python bits
%files -n python3-%{name}-openmpi
# The libraries are here
%{python3_sitearch}/openmpi/%{name}
# Egg info
%{python3_sitearch}/openmpi/NEURON-*-py%{python3_version}.egg-info

%files openmpi-devel
%license Copyright
%doc README.md
%{_libdir}/openmpi/bin/mkthreadsafe_openmpi
%{_libdir}/openmpi/bin/nocmodl_openmpi
%{_libdir}/openmpi/bin/nrnivmodl_openmpi
%{_libdir}/openmpi/bin/nrnmech_makefile_openmpi
# Headers
%{_libdir}/openmpi/include/*.h
%{_libdir}/openmpi/include/nrncvode/
# Shared objects
%{_libdir}/openmpi/lib/libnrniv.so
%{_libdir}/openmpi/lib/librxdmath.so
# required by neuron
# https://github.com/neuronsimulator/nrn/issues/719#issuecomment-677501890
%{_libdir}/openmpi/share/%{tarname}/nrnmain.cpp
%endif

%changelog
%autochangelog