From 099ea93b26b65e0e19ee54c844eba6843b16e006 Mon Sep 17 00:00:00 2001 From: Huub Van Dam Date: Thu, 2 Apr 2015 01:22:38 +0000 Subject: [PATCH] HvD: Adding the spec file I used to generate the RPM for Imperial College London. I have included some notes on what I learned about how this RPM stuff works. Hopefully that will save us some hours work if need to generate one of these things again some time in the future. --- contrib/rpm_spec_file/nwchem-6-5.spec | 200 ++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 contrib/rpm_spec_file/nwchem-6-5.spec diff --git a/contrib/rpm_spec_file/nwchem-6-5.spec b/contrib/rpm_spec_file/nwchem-6-5.spec new file mode 100644 index 0000000000..85c3dd6791 --- /dev/null +++ b/contrib/rpm_spec_file/nwchem-6-5.spec @@ -0,0 +1,200 @@ +# NWChem SPEC file +# ================ +# +# This spec file was created for a tutorial at Imperial College London. On +# the training machines at the site no compilers nor MPI commands were available +# requiring the generation of an RPM that installs mpirun (from OpenMPI) and +# nwchem (the patches NWChem 6.5 release). Advice was obtained from David Brown +# of EMSL operations team, in addition information was found online at: +# +# http://www.rpm.org/max-rpm/ch-rpm-build.html +# http://www.ibm.com/developerworks/library/l-rpm1/ +# +# The process starts by creating the following directory structure: +# +# ~/rpmbuild -- the top-level directory for the rpmbuild tool +# ~/rpmbuild/BUILD -- the directory where stuff is compiled +# ~/rpmbuild/BUILDROOT -- the RPM contents stage area +# ~/rpmbuild/RPMS -- the directory for the binary .rpm files +# ~/rpmbuild/SOURCES -- the directory for source code .tar.gz files +# ~/rpmbuild/SPECS -- the RPM specifications directory +# ~/rpmbuild/SRPMS -- the directory for the sources .rpm files +# +# The SPECS directory is where this file and other files like it live. +# A .spec file contains a number of sections most of which are labeled +# % where indicates a particular function/purpose. The first +# section is the preamble which does not have a particular name. The preamble +# sets a number of variables that say something about the RPM, things like +# the name of the code, the version number, the names of the source code tar +# files, etc. +# +# The labeled sections start of with %description which provides a few lines +# of information about the code. +# +# %prep lists the commands that are needed to put the source code in the right +# place. The %setup macro can automate most of this. The first %setup is applied +# to Source0 from the preamble, the next %setup to Source1, etc. +# +# %build contains a shell script (using Bash) that compiles the code. The +# script launches in the directory containing the source code from Source0. In +# this particular case we needed to compile OpenMPI (with a specific --prefix) +#first so we could build NWChem with MPI, then we build NWChem, and then we +# build OpenMPI again but this time to generate an mpirun executable that will +# be installed on the target machine (i.e. with the default --prefix). +# +# %install is the tricky part as this script installs the RPM on the target +# machine, but is also used to collect all the files that will be rolled up +# into the RPM. When the RPM is generated this script is launched in the +# directory containing Source0, on the target machine it is launched in the +# unpacked RPM directory. The way I got this to work was to have the %build +# script create a structure of files within the nwchem-6.5 build directory +# that matches the installation directory structure on the target machine. +# Note that $RPM_BUILD_ROOT/usr/local are replaced by the rpmbuild and rpm +# commands with locations that are particular to the RPM generation and RPM +# installation process. Potentially these replacements are different at the +# installation time depending on user specified flags on the rpm command line. +# Unfortunately the publically available documentation is extremely sketchy +# on what the expectations for file names are during RPM generation and RPM +# installation (most documentation simply states "make install" as the +# install script which is as good as useless). Hence most of what I did here is +# based on guess work. +# +# %files must contain a list of all files (or directories) that will be included +# in the RPM. If a file is not listed it will not be included. +# +# To generate the RPM run: +# +# cd ~/rpmbuild +# rpmbuild -ba SPECS/nwchem-6-5.spec +# +# If something did not work then running this command again will start over +# from scratch. Using the --short-circuit flag allows you to skip prior steps +# and skip directly to the -b build step. E.g. rpmbuild --short-circuit +# -bi skips directly to the %install step. The rpmbuild command creates the +# .rpm file in the RPMS directory. +# +# On the target machine use: +# +# rpm -i nwchem-6.5-1.el6.x86_64.rpm +# +# to install the code. +# +# Hopefully these brief notes provide a leg up the next time we need to roll +# an RPM. +# +# Huub van Dam, April 01, 2015 +# +# +# === Start === +# +# This is a spec file for compiling an RPM for NWChem-6.5 including dependencies +# like OpenMPI and Global Arrays. Of course the various components have their +# own legacy build systems. So we just want to run a bunch of commands and +# tar-up some resulting executables. The fewer assumptions are made what is +# where the better. +# +Name: nwchem +Version: 6.5 +Release: 1%{?dist} +Summary: Parallel Ab-Initio Quantum Chemistry Code + +Group: Applications/Scientific +License: Various: NWChem: ECL2.0; Global Arrays: OpenSource; OpenMPI: New BSD +URL: http://www.nwchem-sw.org +Source0: nwchem-6.5.tar.gz +Source1: openmpi-1.8.4.tar.gz +BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) + +BuildRequires: gcc == 4.4.7 + +%description +NWChem parallel ab-initio quantum chemistry code targetting computer systems. \ +For more details see: http://www.nwchem-sw.org + + +%prep +%setup +%setup -T -D -b 1 + + +%build +cd .. +export BUILD_DIR=`pwd` +export MRCC_METHODS=y +export EACCSD=y +export IPCCSD=y +export BLASOPT=" " +export NWCHEM_MODULES="all python" +export ARMCI_NETWORK=MPI-TS +# Someone added a -pthread flag to gcc in mpicc which loads libpthread through +# a non-standard back door. So we now need to explicitly say what we need +# including libpthread as we cannot infer the right information from +# "mpicc -show" as we cannot know about these non-standard compiler flags. +export LIBMPI="-L/people/d3y133/rpmbuild/BUILD/lib -lmpi_usempi -lmpi_mpifh -lmpi -lopen-rte -lopen-pal -lm -lnuma -ldl -lrt -lutil -lpthread" +export SLURMOPT=" " +env | sort +echo "Building in " `pwd` +echo "Directory structure" +ls -l +# Build OpenMPI so we can use it to compile NWChem +cd openmpi-1.8.4 +./configure --without-verbs --disable-mpi-profile --disable-shared --enable-static --disable-java --disable-mca-dso --disable-vt --disable-libompitrace --without-slurm --without-loadleveler --prefix=$BUILD_DIR +make all +make install +cd .. +export PATH=$BUILD_DIR/bin:$PATH +# Build NWChem using OpenMPI mpif90, mpicc, etc. +cd nwchem-6.5 +./contrib/distro-tools/build_nwchem +echo "=== done building nwchem ===" +cp -a bin/LINUX64/nwchem bin +mkdir -p lib/basis +cp -a src/basis/libraries lib/basis +cp -a src/nwpw/libraryps lib/basis +cp -a src/data lib/ff +cd .. +# Rebuild OpenMPI for the target machine as we need mpirun to run NWChem +echo "current directory" `pwd` +ls -l +cd openmpi-1.8.4 +make clean +./configure --disable-mpi-profile --disable-shared --enable-static --disable-java --disable-mca-dso --disable-vt --disable-libompitrace --without-slurm --without-loadleveler --without-verbs +make all +cd .. +cp -a openmpi-1.8.4/orte/tools/orterun/orterun nwchem-6.5/bin/mpirun +mkdir -p nwchem-6.5/share/openmpi +cp -a openmpi-1.8.4/orte/tools/orterun/help-orterun.txt nwchem-6.5/share/openmpi +cp -a openmpi-1.8.4/opal/runtime/help-opal-runtime.txt nwchem-6.5/share/openmpi + +%install + +echo "Build root = " %{buildroot} +echo "RPM_BUILD_ROOT = " $RPM_BUILD_ROOT +pwd; env +mkdir -p $RPM_BUILD_ROOT/usr/local/bin +cp bin/nwchem $RPM_BUILD_ROOT/usr/local/bin +cp bin/mpirun $RPM_BUILD_ROOT/usr/local/bin +mkdir -p $RPM_BUILD_ROOT/usr/local/lib +cp -a lib/basis $RPM_BUILD_ROOT/usr/local/lib +cp -a lib/ff $RPM_BUILD_ROOT/usr/local/lib +mkdir -p $RPM_BUILD_ROOT/usr/local/share/openmpi +cp -a share/openmpi/help-orterun.txt $RPM_BUILD_ROOT/usr/local/share/openmpi +cp -a share/openmpi/help-opal-runtime.txt $RPM_BUILD_ROOT/usr/local/share/openmpi +mkdir -p $RPM_BUILD_ROOT/etc +cp -a etc/nwchemrc $RPM_BUILD_ROOT/etc/nwchemrc + +%clean +rm -rf %{buildroot} + + +%files +%defattr(-,root,root,-) +/usr/local/bin/mpirun +/usr/local/bin/nwchem +/usr/local/lib/basis +/usr/local/lib/ff +/usr/local/share/openmpi +%config /etc/nwchemrc + +%changelog +