https://github.com/arguelles/nuSQuIDS
Tip revision: 640e1c38dd2a3f67cb017199ad729114b7fc04eb authored by Carlos on 12 March 2024, 10:13:20 UTC
fix constness in implementation of quickwrite
fix constness in implementation of quickwrite
Tip revision: 640e1c3
configure
#!/bin/bash
check_os_arch(){
if [ -x /usr/bin/lsb_release ]; then
OS_DISTRIB=$(lsb_release -si|tr '[:upper:]' '[:lower:]')
OS_VERSION=`lsb_release -sr`
elif [ -e /etc/os-release ]; then
OS_DISTRIB=$(cat /etc/os-release|grep '^ID='|cut -d '=' -f 2|sed s/\"//g|tr '[:upper:]' '[:lower:]')
OS_VERSION=$(cat /etc/os-release|grep '^VERSION='|cut -d '=' -f 2|cut -d ' ' -f 1|sed s/\"//g)
elif [ -e /etc/redhat-release ]; then
OS_DISTRIB="centos"
OS_VERSION=$(cat /etc/redhat-release|sed s/\ /\\\\n/g|grep '\.')
else
OS_DISTRIB=$(uname -s|tr '[:upper:]' '[:lower:]')
OS_VERSION=$(uname -r)
fi
ARCH=$(uname -m)
OS_NAME=$(uname -s)
case $OS_DISTRIB in
"redhatenterpriseclient" | "redhatenterpriseserver" | "rhel" | "scientificsl" | "scientific" | "centos" | "scientificfermi" | "scientificcernslc")
OS_DISTRIB="RHEL"
OS_VERSION=$(echo "${VERSION}" | cut -d '.' -f 1)
;;
"ubuntu")
OS_DISTRIB="Ubuntu"
;;
"debian")
OS_DISTRIB="Ubuntu"
;;
"linuxmint")
OS_DISTRIB="Ubuntu"
;;
"freebsd")
OS_DISTRIB="FreeBSD"
OS_VERSION=$(uname -r | cut -d '.' -f 1)
ARCH=$(uname -p)
;;
"darwin")
OS_DISTRIB="OSX"
OS_VERSION=$(uname -r | cut -d '.' -f 1)
;;
"linux")
if echo $OS_VERSION | grep -q '\.el7\.\?'; then
OS_DISTRIB="RHEL"
OS_VERSION=7
elif echo $OS_VERSION | grep -q '\.el6\.\?'; then
OS_DISTRIB="RHEL"
OS_VERSION=6
elif echo $OS_VERSION | grep -q '\.el5\.\?'; then
OS_DISTRIB="RHEL"
OS_VERSION=5
fi
esac
OS_ARCH=${OS_DISTRIB}_${OS_VERSION}_${ARCH}
}
check_pkgconfig(){
if [ "$CHECKED_PKGCONFIG" ]; then return; fi
echo "Looking for pkg-config..."
PKG_CONFIG_BIN=$(which pkg-config 2>&1)
if [ "$?" -ne 0 ]; then
echo "Error: pkg-config not found; you will need to specify library locations manually" 1>&2
exit 1
fi
echo " Found $PKG_CONFIG_BIN"
CHECKED_PKGCONFIG=1
}
find_package(){
PKG=$1
VAR_PREFIX=`echo $PKG | tr [:lower:] [:upper:]`
TMP_FOUND=`eval echo "$"${VAR_PREFIX}_FOUND`
if [ "$TMP_FOUND" ]; then return; fi
check_pkgconfig
echo "Looking for $PKG..."
pkg-config --exists $PKG
if [ "$?" -ne 0 ]; then
echo " $PKG not found with pkg-config"
return
fi
if [ $# -ge 2 ]; then
MIN_VERSION=$2
pkg-config --atleast-version $MIN_VERSION $PKG
if [ "$?" -ne 0 ]; then
echo "Error: installed $PKG version ("`pkg-config --modversion $PKG`") is too old; version >=$MIN_VERSION is required" 1>&2
exit 1
fi
fi
echo " Found $PKG version `pkg-config --modversion $PKG`"
eval ${VAR_PREFIX}_FOUND=1
eval ${VAR_PREFIX}_VERSION=\"`pkg-config --modversion $PKG`\"
eval ${VAR_PREFIX}_CFLAGS=\"`pkg-config --cflags $PKG`\"
eval ${VAR_PREFIX}_LDFLAGS=\"`pkg-config --libs $PKG`\"
eval ${VAR_PREFIX}_INCDIR=\"`pkg-config --variable=includedir $PKG`\"
eval ${VAR_PREFIX}_LIBDIR=\"`pkg-config --variable=libdir $PKG`\"
}
find_hdf5(){
PKG=hdf5
echo "Looking for $PKG..."
VAR_PREFIX=`echo $PKG | tr [:lower:] [:upper:]`
TMP_FOUND=`eval echo "$"${VAR_PREFIX}_FOUND`
if [ "$TMP_FOUND" ]; then return; fi
which h5cc 2>&1 > /dev/null
if [ "$?" -ne 0 ]; then return; fi
which h5ls 2>&1 > /dev/null
if [ "$?" -eq 0 ]; then
HDF5_VERSION=`h5ls --version | sed 's/.* \([0-9.]*\)/\1/'`
echo " Found $PKG version $HDF5_VERSION via executables in \$PATH"
if [ $# -ge 1 ]; then
MIN_VERSION=$1
#TODO: actually check version
fi
else
echo " h5ls not found; cannot check $PKG version"
echo " Proceeding with unknown version and hoping for the best"
fi
HDF5_COMPILE_COMMAND=`h5cc -show`
for item in $HDF5_COMPILE_COMMAND; do
item=`echo "$item" | sed 's| |\n|g' | sed -n 's/.*-L\([^ ]*\).*/\1/p'`
if [ -n "$item" ]; then
POSSIBLE_HDF5_LIBDIRS="$POSSIBLE_HDF5_LIBDIRS
$item"
fi
done
for HDF5_LIBDIR in $POSSIBLE_HDF5_LIBDIRS; do
if [ -d $HDF5_LIBDIR -a \( -e $HDF5_LIBDIR/libhdf5.a -o -e $HDF5_LIBDIR/libhdf5.so \) ]; then
break
fi
done
if [ ! -d $HDF5_LIBDIR -o ! \( -e $HDF5_LIBDIR/libhdf5.a -o -e $HDF5_LIBDIR/libhdf5.so \) ]; then
echo " Unable to guess $PKG library directory"
return
fi
POSSIBLE_HDF5_INCDIRS=`echo "$HDF5_COMPILE_COMMAND" | sed 's| |\n|g' | sed -n 's/.*-I\([^ ]*\).*/\1/p'`
POSSIBLE_HDF5_INCDIRS="$POSSIBLE_HDF5_INCDIRS ${HDF5_LIBDIR}/../include"
for HDF5_INCDIR in $POSSIBLE_HDF5_INCDIRS; do
if [ -d $HDF5_INCDIR -a -e $HDF5_INCDIR/H5version.h ]; then
break
fi
done
if [ ! -d $HDF5_INCDIR -o ! $HDF5_INCDIR/H5version.h ]; then
echo " Unable to guess $PKG include directory"
return
fi
HDF5_CFLAGS="-I${HDF5_INCDIR}"
HDF5_LDFLAGS=`echo "$HDF5_COMPILE_COMMAND" | \
sed 's/ /\\
/g' | \
sed -n -E \
-e '/^[[:space:]]*-l/p' \
-e '/^[[:space:]]*-L/p' \
-e '/^[[:space:]]*-Wl,/p' \
-e 's/^[[:space:]]*.*lib([^.]*)\.a/-l\1/p' \
-e 's/^[[:space:]]*.*lib([^.]*)\.so/-l\1/p' \
-e 's/^[[:space:]]*.*lib([^.]*)\.dylib/-l\1/p' `
HDF5_LDFLAGS=`echo $HDF5_LDFLAGS` # collapse to single line
HDF5_FOUND=1
}
# less searching for python than verfying that the given executable works and extracting relevant paths
try_find_python(){
echo "Looking for python"
if which ${PYTHON_EXE} > /dev/null 2>&1; then
PYTHON_EXE=$(which ${PYTHON_EXE} 2>/dev/null)
echo " Using python executable ${PYTHON_EXE}"
else
echo " ${PYTHON_EXE} is not a valid python executable"
return
fi
PYTHON_VERSION=`${PYTHON_EXE} -c 'import sys; print(str(sys.version_info.major)+"."+str(sys.version_info.minor))'`
if [ "$?" -ne 0 ]; then
echo "Unable to use python executable ${PYTHON_EXE} (version check failed)"
return
fi
PYTHONVERSIONSIMPLE=`${PYTHON_EXE} -c 'import sys; print(str(sys.version_info.major)+str(sys.version_info.minor))'`
PYTHON_INCDIR=`${PYTHON_EXE} -c 'from distutils import sysconfig; print(sysconfig.get_python_inc())'`
if [ -d "$PYTHON_INCDIR" ]; then
echo " Found python include dir $PYTHON_INCDIR"
else
echo " Unable to locate the python include dir"
return
fi
# This is the directory to which libraries should be installed for python to find them
PYTHON_MODULEDIR=`${PYTHON_EXE} -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib(plat_specific=True, standard_lib=False))'`
if [ "$PYTHON_MODULEDIR" ]; then
echo " Python module install dir is $PYTHON_MODULEDIR"
else
echo " Unable to locate the python module dir"
return
fi
# This is the directory that python claims contains its standard library,
# which may or may not include the actual libpython
PYTHON_STDLIBDIR=`${PYTHON_EXE} -c 'from distutils import sysconfig; print(sysconfig.get_python_lib(plat_specific=True,standard_lib=True))'`
# This may contain a suffix which appears after the version like in 'libpython3.6m'
# See https://www.python.org/dev/peps/pep-3149/#proposal
PYTHONLIBSUFFIX=`${PYTHON_EXE} -c 'from distutils import sysconfig; print(sysconfig.build_flags)' 2>/dev/null`
# Here we just try to guess every location anyone has ever seen a libpython in the wild
POSSIBLE_PYTHON_LIBDIRS="/lib /lib64 /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${PYTHON_STDLIBDIR} ${PYTHON_STDLIBDIR}/lib"
# sometimes Apple puts a symlink in ${PYTHONSTDLIBDIR}/lib, sometimes it doesn't
TMP=`echo "$PYTHON_STDLIBDIR" | sed -n s'|\(.*/lib\)/python'"${PYTHON_VERSION}"'|\1|p'`
if [ "$TMP" ]; then POSSIBLE_PYTHON_LIBDIRS="${POSSIBLE_PYTHON_LIBDIRS} ${TMP}"; fi
# Ubuntu is special, of course
if [ $OS_DISTRIB = "Ubuntu" ]; then
POSSIBLE_PYTHON_LIBDIRS="${POSSIBLE_PYTHON_LIBDIRS} /usr/lib/$(uname -i)-linux-gnu"
fi
for PYTHON_LIBDIR in $POSSIBLE_PYTHON_LIBDIRS; do
for PV in $PYTHON_VERSION $PYTHONVERSIONSIMPLE; do
#echo " Looking for ${PYTHON_LIBDIR}/libpython${PV}${PYTHONLIBSUFFIX}.(a|so|dylib)"
if [ -d $PYTHON_LIBDIR ]; then
if [ -e ${PYTHON_LIBDIR}/libpython${PV}${PYTHONLIBSUFFIX}.a ]; then
PYTHON_LIBRARY=${PYTHON_LIBDIR}/libpython${PV}${PYTHONLIBSUFFIX}.a
break
elif [ -e ${PYTHON_LIBDIR}/libpython${PV}${PYTHONLIBSUFFIX}.so ];then
PYTHON_LIBRARY=${PYTHON_LIBDIR}/libpython${PV}${PYTHONLIBSUFFIX}.so
break
elif [ -e ${PYTHON_LIBDIR}/libpython${PV}${PYTHONLIBSUFFIX}.dylib ]; then
PYTHON_LIBRARY=${PYTHON_LIBDIR}/libpython${PV}${PYTHONLIBSUFFIX}.dylib
break
fi
fi
done
done
if [ -e "$PYTHON_LIBRARY" ]; then
echo " Found python library $PYTHON_LIBRARY"
else
echo " Unable to locate the python library"
return
fi
PYTHON_CFLAGS="-I${PYTHON_INCDIR}"
PYTHON_LDFLAGS="-L${PYTHON_LIBDIR} -l$(echo "$PYTHON_LIBRARY" | sed 's|.*lib\(python.*\)\.[a-z]*|\1|')"
PYTHON_FOUND=1
}
try_find_boost(){
PKG=boost
VAR_PREFIX=`echo $PKG | tr [:lower:] [:upper:]`
TMP_FOUND=`eval echo "$"${VAR_PREFIX}_FOUND`
if [ "$TMP_FOUND" ]; then return; fi
if [ "$PYTHON_FOUND" ]; then
PYV=`${PYTHON_EXE} -c 'import sys; print(str(sys.version_info.major)+str(sys.version_info.minor))'`
PYVM=`${PYTHON_EXE} -c 'import sys; print(sys.version_info.major)'`
echo "Looking for $PKG built for python ${PYV} in $GUESS_DIR..."
else
echo "Looking for $PKG in $GUESS_DIR..."
fi
if [ "$#" -eq 1 ]; then
GUESS_DIR=$1
POSSIBLE_BOOST_LIBDIRS="${GUESS_DIR}/lib ${GUESS_DIR}/lib64 ${GUESS_DIR}/lib/${ARCH}-linux-gnu"
POSSIBLE_BOOST_INCDIRS="${GUESS_DIR}/include"
elif [ "$#" -eq 2 ]; then
GUESS_DIR="$1 and $2"
POSSIBLE_BOOST_LIBDIRS="$2"
POSSIBLE_BOOST_INCDIRS="$1"
else
echo "Wrong number of arguments to try_find_boost"
return
fi
if [ "$PYTHON_FOUND" ]; then
for PYV_SUFFIX in $PYV $PYVM $PYV-mt $PVM-mt ''; do
for BOOST_LIBDIR in $POSSIBLE_BOOST_LIBDIRS; do
if [ -d $BOOST_LIBDIR -a \( -e $BOOST_LIBDIR/libboost_python${PYV_SUFFIX}.a -o -e $BOOST_LIBDIR/libboost_python${PYV_SUFFIX}.so -o -e $BOOST_LIBDIR/libboost_python${PYV_SUFFIX}.dylib \) ]; then
if [ ! "$PYV_SUFFIX" ]; then
echo " Found boost_python with no python version tag; hoping it is compatible"
fi
BOOST_PYTHON_FOUND=1
BOOST_PYTHON_LDFLAGS="-lboost_python${PYV_SUFFIX}"
break
fi
done
if [ "$BOOST_PYTHON_FOUND" ]; then break; fi
done
if [ ! "$BOOST_PYTHON_FOUND" ]; then
echo " Unable to locate the boost_python library in $GUESS_DIR"
fi
fi
for BOOST_INCDIR in $POSSIBLE_BOOST_INCDIRS; do
if [ -d $BOOST_INCDIR -a -e $BOOST_INCDIR/boost/version.hpp ]; then
break
fi
done
if [ ! -d "$BOOST_INCDIR" -o ! -e "$BOOST_INCDIR/boost/version.hpp" ]; then
echo " Unable to locate boost/version.hpp in $GUESS_DIR"
return
fi
BOOST_CFLAGS="-I${BOOST_INCDIR}"
BOOST_LDFLAGS="-Wl,-rpath -Wl,${BOOST_LIBDIR} -L${BOOST_LIBDIR}"
BOOST_FOUND=1
echo " Found boost in $GUESS_DIR"
echo " Boost include directory is ${BOOST_INCDIR}"
if [ "$BOOST_LIBDIR" ]; then
echo " Boost library directory is ${BOOST_LIBDIR}"
fi
}
find_numpy(){
echo "Looking for numpy..."
NUMPY_INCDIR=$(${PYTHON_EXE} -c 'import numpy; print(numpy.get_include())')
if [ "$?" -ne 0 ]; then
echo "Unable to import numpy using ${PYTHON_EXE}"
return
fi
NUMPY_CFLAGS="-I${NUMPY_INCDIR}"
NUMPY_FOUND=1
echo " Found numpy"
echo " Numpy include directory is ${NUMPY_INCDIR}"
}
ensure_found(){
PKG=$1
VAR_PREFIX=`echo $PKG | tr [:lower:] [:upper:]`
TMP_FOUND=`eval echo "$"${VAR_PREFIX}_FOUND`
if [ "$TMP_FOUND" ]; then return; fi
#not found
lowername=`echo $PKG | tr [A-Z] [a-z]`
TMP_INCDIR=`eval echo "$"${VAR_PREFIX}_INCDIR`
TMP_LIBDIR=`eval echo "$"${VAR_PREFIX}_LIBDIR`
if [ "$TMP_INCDIR" -a "$TMP_LIBDIR" ]; then
echo "Error: $PKG not found in $TMP_INCDIR and $TMP_LIBDIR or with pkg-config" 1>&2
echo "Please verify that the path given to --with-${lowername} is correct" 1>&2
else
echo "Error: $PKG not installed or not registered with pkg-config" 1>&2
echo "Please specify location using the --with-${lowername} flag" 1>&2
fi
unset TMP_INCDIR
unset TMP_LIBDIR
exit 1
}
PREFIX=/usr/local
INSTALL_LIBDIR=lib
VERSION_NUM=101100
VERSION=`echo $VERSION_NUM | awk '{
major = int($1/100000);
minor = int($1/100)%1000;
patch = $1%100;
print major"."minor"."patch;
}'`
check_os_arch
GUESS_CC=gcc
GUESS_CXX=g++
GUESS_AR=ar
GUESS_LD=ld
if [ "$OS_NAME" = Linux ]; then
DYN_SUFFIX=.so
DYN_OPT='-shared -Wl,-soname,$(shell basename $(DYN_PRODUCT))'
DYN_OPT_PY='-shared -Wl,-soname,$(shell basename $(PYTHON_LIB))'
fi
if [ "$OS_NAME" = Darwin ]; then
GUESS_CC=clang
GUESS_CXX=clang++
GUESS_LD=clang++
DYN_SUFFIX=.dylib
DYN_OPT='-dynamiclib -compatibility_version $(VERSION) -current_version $(VERSION)'
DYN_OPT_PY='-dynamiclib -compatibility_version $(VERSION) -current_version $(VERSION)'
fi
CC=${CC-$GUESS_CC}
CXX=${CXX-$GUESS_CXX}
AR=${AR-$GUESS_AR}
LD=${LD-$GUESS_LD}
PYTHON_EXE="python"
if which "$PYTHON_EXE" > /dev/null 2>&1; then
: # good, keep our initial guess
elif which "python3" > /dev/null 2>&1; then
PYTHON_EXE="python3"
fi
HELP="Usage: ./configure [OPTION]...
Installation directories:
--prefix=PREFIX install files in PREFIX
[$PREFIX]
By default, \`make install' will install all the files in
\`$PREFIX/bin', \`$PREFIX/lib' etc. You can specify
an installation prefix other than \`$PREFIX' using \`--prefix',
for instance \`--prefix=\$HOME'.
Fine tuning of the installation directories:
--libdir=DIR object code libraries [lib]
The following options can be used to maunally specify the
locations of dependencies:
--with-gsl=DIR use the copy of GSL in DIR
assuming headers are in DIR/include
and libraries in DIR/lib
--with-gsl-incdir=DIR use the copy of GSL in DIR
--with-gsl-libdir=DIR use the copy of GSL in DIR
--with-hdf5=DIR use the copy of HDF5 in DIR
assuming headers are in DIR/include
and libraries in DIR/lib
--with-hdf5-incdir=DIR use the copy of HDF5 in DIR
--with-hdf5-libdir=DIR use the copy of HDF5 in DIR
--with-squids=DIR use the copy of SQuIDS in DIR
assuming headers are in DIR/include
and libraries in DIR/lib
--with-squids-incdir=DIR use the copy of SQuIDS in DIR
--with-squids-libdir=DIR use the copy of SQuIDS in DIR
For the python bindings the following flags are used:
--with-python-bindings enable python binding compilation
--with-boost-incdir=DIR use the copy of Boost in DIR
--with-boost-libdir=DIR use the copy of Boost in DIR
--with-boost=DIR use the copy of Boost in DIR
assuming headers are in DIR/include
and libraries in DIR/lib
--python-bin=PYTHON_EXECUTABLE use this python executable
(default is 'python')
--python-module-dir=DIR install python module to this directory, rather
than the default system location. The special
value site.USER_SITE will be automatically
expanded using the python interpreter
Some influential environment variables:
CC C compiler command
CXX C++ compiler command
AR Static linker command
LD Dynamic linker command
" #`
for var in "$@"
do
if [ "$var" = "--help" -o "$var" = "-h" ]; then
echo "$HELP"
exit 0
fi
TMP=`echo "$var" | sed -n 's/^--prefix=\(.*\)$/\1/p'`
if [ "$TMP" ]; then PREFIX="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--libdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then INSTALL_LIBDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-gsl=\(.*\)$/\1/p'`
if [ "$TMP" ]; then
GSL_INCDIR="${TMP}/include";
GSL_LIBDIR="${TMP}/lib";
continue; fi
TMP=`echo "$var" | sed -n 's/^--with-gsl-incdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then GSL_INCDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-gsl-libdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then GSL_LIBDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-hdf5=\(.*\)$/\1/p'`
if [ "$TMP" ]; then
HDF5_INCDIR="${TMP}/include";
HDF5_LIBDIR="${TMP}/lib";
continue; fi
TMP=`echo "$var" | sed -n 's/^--with-hdf5-incdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then HDF5_INCDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-hdf5-libdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then HDF5_LIBDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-squids=\(.*\)$/\1/p'`
if [ "$TMP" ]; then
SQUIDS_INCDIR="${TMP}/include";
SQUIDS_LIBDIR="${TMP}/lib";
continue; fi
TMP=`echo "$var" | sed -n 's/^--with-squids-incdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then SQUIDS_INCDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-squids-libdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then SQUIDS_LIBDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-python-bindings/true/p'`
if [ "$TMP" ]; then PYTHON_BINDINGS=true; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-boost=\(.*\)$/\1/p'`
if [ "$TMP" ]; then
BOOST_INCDIR="${TMP}/include";
BOOST_LIBDIR="${TMP}/lib";
continue; fi
TMP=`echo "$var" | sed -n 's/^--with-boost-libdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then BOOST_LIBDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--with-boost-incdir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then BOOST_INCDIR="$TMP"; continue; fi
TMP=`echo "$var" | sed -n 's/^--python-bin=\(.*\)$/\1/p'`
if [ "$TMP" ]; then PYTHON_EXE=$TMP; continue; fi
TMP=`echo "$var" | sed -n 's/^--python-module-dir=\(.*\)$/\1/p'`
if [ "$TMP" ]; then USER_PYTHON_MODULE_DIR="${TMP}"; continue; fi
echo "config.sh: Unknown or malformed option '$var'" 1>&2
exit 1
done
if [ "$GSL_INCDIR" -a "$GSL_LIBDIR" ]; then
echo "Checking manually specified GSL..."
if [ -d "$GSL_INCDIR/gsl" \
-a -e "$GSL_INCDIR/gsl/gsl_version.h" \
-a -d "$GSL_LIBDIR" \
-a -e "$GSL_LIBDIR/libgsl.a" ]; then
GSL_FOUND=1
GSL_CFLAGS="-I$GSL_INCDIR"
GSL_LDFLAGS="-L$GSL_LIBDIR -lgsl -lgslcblas -lm"
else
echo "Warning: manually specifed GSL not found; will attempt auto detection"
fi
fi
find_package gsl 1.15
if [ "$HDF5_INCDIR" -a "$HDF5_LIBDIR" ]; then
echo "Checking manually specified HDF5..."
if [ -d "$HDF5_INCDIR" \
-a -e "$HDF5_INCDIR/H5version.h" \
-a -d "$HDF5_LIBDIR" \
-a -e "$HDF5_LIBDIR/libhdf5.a" \
-a -e "$HDF5_LIBDIR/libhdf5_hl.a" ]; then
HDF5_FOUND=1
HDF5_CFLAGS="-I$HDF5_INCDIR"
HDF5_LDFLAGS="-L$HDF5_LIBDIR -lhdf5 -lhdf5_hl"
else
echo "Warning: manually specifed HDF5 not found; will attempt auto detection"
fi
fi
#Do not use this due to broken Ubuntu package
#find_package hdf5 1.8
find_hdf5
if [ "$SQUIDS_INCDIR" -a "$SQUIDS_LIBDIR" ]; then
echo "Checking manually specified SQUIDS..."
if [ -d "$SQUIDS_INCDIR" \
-a -d "$SQUIDS_LIBDIR" \
-a -e "$SQUIDS_LIBDIR/libSQuIDS.a" ]; then
SQUIDS_FOUND=1
SQUIDS_CFLAGS="-I$SQUIDS_INCDIR"
SQUIDS_LDFLAGS="-L$SQUIDS_LIBDIR -lSQuIDS"
if $CXX --version | grep -q "Free Software Foundation"; then
SQUIDS_CFLAGS="$SQUIDS_CFLAGS -Wno-abi"
fi
else
echo "Warning: manually specifed SQUIDS not found; will attempt auto detection"
fi
fi
find_package squids 1.2
if [ $PYTHON_BINDINGS ]; then
try_find_python
if [ "$PYTHON_FOUND" != 1 ]; then
echo "*** Failed to find python; python bindings will not be built ***"
unset PYTHON_BINDINGS
else
if [ "$USER_PYTHON_MODULE_DIR" ]; then
if [ "$USER_PYTHON_MODULE_DIR" == "site.USER_SITE" ]; then
PYTHON_MODULEDIR=`${PYTHON_EXE} -c 'import site; print(site.USER_SITE)'`
else
PYTHON_MODULEDIR="$USER_PYTHON_MODULE_DIR"
fi
fi
fi
if [ "$BOOST_INCDIR" -a "$BOOST_LIBDIR" ]; then
echo "Checking manually specified boost..."
try_find_boost "$BOOST_INCDIR" "$BOOST_LIBDIR"
if [ ! "$BOOST_FOUND" ]; then
echo "Warning: manually specifed boost not found; will attempt auto detection"
fi
fi
try_find_boost /usr
try_find_boost /usr/local
if [ "$BOOST_PYTHON_FOUND" != 1 ]; then
echo "*** Failed to find boost python; python bindings will not be built ***"
unset PYTHON_BINDINGS
fi
find_numpy
if [ "$NUMPY_FOUND" != 1 ]; then
echo "*** Failed to find numpy; python bindings will not be built ***"
unset PYTHON_BINDINGS
fi
fi
ensure_found gsl
ensure_found hdf5
ensure_found squids
# Resolve PREFIX absolutely
OLDPWD=`pwd`
cd "$PREFIX"
PREFIX=`pwd`
cd "$OLDPWD"
SOURCE_PATH=`pwd`
if [ ! -d ./build/ ]; then
mkdir build;
fi
if [ ! -d ./lib/ ]; then
mkdir lib;
fi
echo "Generating config file..."
# Somewhat evil: HDF5 does not register with pkg-config, which causes the latter
# to error out because it cannot find nuSQuIDS dependencies.
# Solution: Since we found HDF5 (hopefully correctly), register it ourselves.
echo "# WARNING: This configuration file was heutristically generated by nuSQuIDS
# and may not be complete or correct
libdir=${HDF5_LIBDIR}
includedir=${HDF5_INCDIR}" > lib/hdf5.pc
echo '
Name: HDF5
Description: "A data model, library, and file format for storing and managing data."
URL: https://www.hdfgroup.org/HDF5/' >> lib/hdf5.pc
echo "Version: ${HDF5_VERSION}" >> lib/hdf5.pc
echo "Cflags: ${HDF5_CFLAGS}
Libs: ${HDF5_LDFLAGS}
" >> lib/hdf5.pc
echo "prefix=$PREFIX" > lib/nusquids.pc
echo '
libdir=${prefix}/'"$INSTALL_LIBDIR"'
includedir=${prefix}/include
Name: nuSQuIDS
Description: Toolbox for neutrino oscillation experiments
URL: https://github.com/arguelles/nuSQuIDS' >> lib/nusquids.pc
echo "Version: $VERSION" >> lib/nusquids.pc
echo 'Requires: gsl >= 1.15 hdf5 >= 1.8 squids >= 1.2.0
Libs: -L${libdir} -lnuSQuIDS
Cflags: -I${includedir}
' >> lib/nusquids.pc
echo "Generating version header..."
sed -e "s|__NUSQUIDS_VERSION__|$VERSION_NUM|g" \
-e "s|__NUSQUIDS_VERSION_STR__|$VERSION|g" \
< resources/version.h.in > include/nuSQuIDS/version.h
INSTALL_FLAG_PREFIX="NUSQUIDS_DATA_PATH_INSTALL_FLAG_PREFIX_"
INSTALL_FLAG_SUFFIX="_NUSQUIDS_DATA_PATH_INSTALL_FLAG_SUFFIX"
INSTALL_FLAG_OFF="A"
INSTALL_FLAG_ON="B"
REPLACE_INSTALL_FLAG="s|${INSTALL_FLAG_PREFIX}${INSTALL_FLAG_OFF}${INSTALL_FLAG_SUFFIX}|${INSTALL_FLAG_PREFIX}${INSTALL_FLAG_ON}${INSTALL_FLAG_SUFFIX}|g"
echo "Generating data path header..."
echo "#include <cstring>
#define SOURCE_DATA_PATH \"${SOURCE_PATH}/data/\"
#define INSTALL_DATA_PATH \"${PREFIX}/share/nuSQuIDS/\"
namespace{
const char dataPathBitOffValue='$INSTALL_FLAG_OFF';
//This needs to be volatile so that the compiler can't optimize away reads from it,
//which is important since we plan to change the value of the constant between compile-time
//and run-time
const volatile char dataPathBitContainer[] = \"${INSTALL_FLAG_PREFIX}${INSTALL_FLAG_OFF}${INSTALL_FLAG_SUFFIX}\";
bool getInstallBit(){
static const std::size_t prefixLen = strlen(\"${INSTALL_FLAG_PREFIX}\");
return dataPathBitContainer[prefixLen]!='${INSTALL_FLAG_OFF}';
}
}
" > build/resource_paths.h
echo "Generating makefile..."
echo "# Compiler
CC=$CC
CXX=$CXX
AR=$AR
LD=$LD
DYN_SUFFIX=$DYN_SUFFIX
DYN_OPT=$DYN_OPT
DYN_OPT_PY=$DYN_OPT_PY
VERSION=$VERSION
PREFIX=$PREFIX
INSTALL_LIBDIR:=$INSTALL_LIBDIR
" > ./Makefile
echo '
PATH_nuSQUIDS=$(shell pwd)
PATH_SQUIDS=$(SQUIDS_DIR)
SOURCES = $(wildcard src/*.cpp)
OBJECTS = $(patsubst src/%.cpp,build/%.o,$(SOURCES))
EXAMPLES := examples/Single_energy/single_energy \
examples/Multiple_energy/multiple_energy \
examples/Atm_default/atm_default \
examples/Bodies/bodies \
examples/Xsections/xsections \
examples/NSI/nsi \
examples/LV/lv \
examples/Atm_BSM/atm_bsm\
examples/HDF5_Write_Read/write \
examples/HDF5_Write_Read/read \
examples/Constant_density_layers/const_dens_layers \
examples/Astrophysical_neutrino_flavor_ratio/astro_flv_ratio
CXXFLAGS= -std=c++11
# Directories
' >> ./Makefile
echo "GSL_CFLAGS=$GSL_CFLAGS" >> ./Makefile
echo "GSL_LDFLAGS=$GSL_LDFLAGS" >> ./Makefile
echo "HDF5_CFLAGS=$HDF5_CFLAGS" >> ./Makefile
echo "HDF5_LDFLAGS=$HDF5_LDFLAGS" >> ./Makefile
echo "SQUIDS_CFLAGS=$SQUIDS_CFLAGS" >> ./Makefile
echo "SQUIDS_LDFLAGS=$SQUIDS_LDFLAGS" >> ./Makefile
if [ "$PYTHON_BINDINGS" ]; then
echo "PYTHON_CFLAGS=$PYTHON_CFLAGS" >> ./Makefile
echo "PYTHON_LDFLAGS=$PYTHON_LDFLAGS" >> ./Makefile
echo "BOOST_CFLAGS=$BOOST_CFLAGS" >> ./Makefile
echo "BOOST_PYTHON_LDFLAGS=$BOOST_LDFLAGS $BOOST_PYTHON_LDFLAGS" >> ./Makefile
echo "PYTHON_MODULEDIR=$PYTHON_MODULEDIR" >> ./Makefile
echo "NUMPY_CFLAGS=$NUMPY_CFLAGS" >> ./Makefile
fi
echo '
INCnuSQUIDS=$(PATH_nuSQUIDS)/include
LIBnuSQUIDS=$(PATH_nuSQUIDS)/lib
# FLAGS
CFLAGS= -O3 -fPIC -Ibuild -I$(INCnuSQUIDS) $(SQUIDS_CFLAGS) $(GSL_CFLAGS) $(HDF5_CFLAGS)
LDFLAGS= -Wl,-rpath -Wl,$(LIBnuSQUIDS) -L$(LIBnuSQUIDS)
LDFLAGS+= $(SQUIDS_LDFLAGS) $(GSL_LDFLAGS) $(HDF5_LDFLAGS) -lpthread
EXAMPLES_FLAGS=-I$(INCnuSQUIDS) $(CXXFLAGS) $(CFLAGS)
# Project files
NAME=nuSQuIDS
STAT_PRODUCT=lib/lib$(NAME).a
DYN_PRODUCT=lib/lib$(NAME)$(DYN_SUFFIX)
PYTHON_LIB:=lib/$(NAME).so
# Compilation rules
all: $(STAT_PRODUCT) $(DYN_PRODUCT)
examples : $(EXAMPLES)
$(DYN_PRODUCT) : $(OBJECTS)
@echo Linking $(DYN_PRODUCT)
@$(CXX) $(DYN_OPT) $(OBJECTS) $(LDFLAGS) -o $(DYN_PRODUCT)
$(STAT_PRODUCT) : $(OBJECTS)
@echo Linking $(STAT_PRODUCT)
@$(AR) -rcs $(STAT_PRODUCT) $(OBJECTS)
build/%.o : src/%.cpp
@echo Compiling $< to $@
@$(CXX) $(CXXFLAGS) -c $(CFLAGS) $< -o $@
examples/Single_energy/single_energy : $(DYN_PRODUCT) examples/Single_energy/main.cpp
@echo Compiling single energy example
@$(CXX) $(EXAMPLES_FLAGS) examples/Single_energy/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/Astrophysical_neutrino_flavor_ratio/astro_flv_ratio : $(DYN_PRODUCT) examples/Astrophysical_neutrino_flavor_ratio/main.cpp
@echo Compiling astrophysical neutrino flavor ratio example
@$(CXX) $(EXAMPLES_FLAGS) examples/Astrophysical_neutrino_flavor_ratio/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/Multiple_energy/multiple_energy : $(DYN_PRODUCT) examples/Multiple_energy/main.cpp
@echo Compiling multiple energy example
@$(CXX) $(EXAMPLES_FLAGS) examples/Multiple_energy/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/HDF5_Write_Read/write : $(DYN_PRODUCT) examples/HDF5_Write_Read/write.cpp
@echo Compiling HDF5 write
@$(CXX) $(EXAMPLES_FLAGS) examples/HDF5_Write_Read/write.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/HDF5_Write_Read/read : $(DYN_PRODUCT) examples/HDF5_Write_Read/read.cpp
@echo Compiling HDF5 read
@$(CXX) $(EXAMPLES_FLAGS) examples/HDF5_Write_Read/read.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/Atm_default/atm_default : $(DYN_PRODUCT) examples/Atm_default/main.cpp
@echo Compiling atmospheric example
@$(CXX) $(EXAMPLES_FLAGS) examples/Atm_default/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
build/exBody.o : examples/Bodies/exBody.h examples/Bodies/exBody.cpp
@$(CXX) $(EXAMPLES_FLAGS) -c examples/Bodies/exBody.cpp -o $@
build/ex_bodies_main.o : examples/Bodies/exBody.h examples/Bodies/main.cpp
@$(CXX) $(EXAMPLES_FLAGS) -c examples/Bodies/main.cpp -o $@
examples/Bodies/bodies : $(DYN_PRODUCT) build/ex_bodies_main.o build/exBody.o
@echo Compiling bodies example
@$(CXX) $(EXAMPLES_FLAGS) build/ex_bodies_main.o build/exBody.o -lnuSQuIDS $(LDFLAGS) -o $@
build/exCross.o : examples/Xsections/exCross.h examples/Xsections/exCross.cpp
@$(CXX) $(EXAMPLES_FLAGS) -c examples/Xsections/exCross.cpp -o $@
examples/Xsections/xsections : $(DYN_PRODUCT) examples/Xsections/main.cpp build/exCross.o
@echo Compiling cross section example
@$(CXX) $(EXAMPLES_FLAGS) examples/Xsections/main.cpp build/exCross.o -lnuSQuIDS $(LDFLAGS) -o $@
examples/NSI/nsi : $(DYN_PRODUCT) examples/NSI/main.cpp
@echo Compiling non-standard interaction example
@$(CXX) $(EXAMPLES_FLAGS) examples/NSI/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/LV/lv : $(DYN_PRODUCT) examples/LV/main.cpp
@echo Compiling Lorentz Violation example
@$(CXX) $(EXAMPLES_FLAGS) examples/LV/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/Atm_BSM/atm_bsm: $(DYN_PRODUCT) examples/Atm_BSM/main.cpp
@echo Compiling atmospheric with beyond standard model physics example
@$(CXX) $(EXAMPLES_FLAGS) examples/Atm_BSM/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
examples/Constant_density_layers/const_dens_layers : $(DYN_PRODUCT) examples/Constant_density_layers/main.cpp
@echo Compiling constant density layer example
@$(CXX) $(EXAMPLES_FLAGS) examples/Constant_density_layers/main.cpp -lnuSQuIDS $(LDFLAGS) -o $@
.PHONY: install uninstall clean test docs
clean:
@echo Erasing generated files
@rm -f $(PATH_nuSQUIDS)/build/*.o
@rm -f $(PATH_nuSQUIDS)/$(STAT_PRODUCT) $(PATH_nuSQUIDS)/$(DYN_PRODUCT) $(PATH_nuSQUIDS)/$(PYTHON_LIB)
doxygen:
@mkdir -p ./docs
@doxygen src/doxyfile
docs:
@mkdir -p ./docs
@doxygen src/doxyfile
test: $(DYN_PRODUCT) $(STAT_PRODUCT)
@cd ./test ; ./run_tests
install: $(DYN_PRODUCT) $(STAT_PRODUCT)
@echo Installing headers in $(PREFIX)/include/nuSQuIDS
@mkdir -p "$(PREFIX)/include/nuSQuIDS"
@cp "$(INCnuSQUIDS)"/nuSQuIDS/*.h "$(PREFIX)/include/nuSQuIDS"
@echo Installing libraries in $(PREFIX)/$(INSTALL_LIBDIR)
@mkdir -p "$(PREFIX)/$(INSTALL_LIBDIR)"
@LC_ALL=C sed "'${REPLACE_INSTALL_FLAG}'" < $(DYN_PRODUCT) > "$(PREFIX)/$(INSTALL_LIBDIR)/lib$(NAME)$(DYN_SUFFIX)"
@LC_ALL=C sed "'${REPLACE_INSTALL_FLAG}'" < $(STAT_PRODUCT) > "$(PREFIX)/$(INSTALL_LIBDIR)/lib$(NAME).a"
@chmod 755 "$(PREFIX)/$(INSTALL_LIBDIR)/lib$(NAME)$(DYN_SUFFIX)" "$(PREFIX)/$(INSTALL_LIBDIR)/lib$(NAME).a"
@echo Installing config information in $(PREFIX)/$(INSTALL_LIBDIR)/pkgconfig
@mkdir -p "$(PREFIX)/$(INSTALL_LIBDIR)/pkgconfig"
@cp lib/nusquids.pc "$(PREFIX)/$(INSTALL_LIBDIR)/pkgconfig"
@echo Installing physics data in $(PREFIX)/share/nuSQuIDS
@mkdir -p "$(PREFIX)/share/nuSQuIDS"
@cp -r data/* "$(PREFIX)/share/nuSQuIDS/"
' >> ./Makefile
if `pkg-config hdf5`; then
:
else
echo ' @cp lib/hdf5.pc "$(PREFIX)/$(INSTALL_LIBDIR)/pkgconfig"' >> ./Makefile
fi
echo '
uninstall:
@echo Removing headers from $(PREFIX)/include/nuSQuIDS
@rm -rf "$(PREFIX)/include/nuSQuIDS"
@echo Removing libraries from $(PREFIX)/$(INSTALL_LIBDIR)
@rm -f "$(PREFIX)/$(INSTALL_LIBDIR)/lib$(NAME)$(DYN_SUFFIX)"
@rm -f "$(PREFIX)/$(INSTALL_LIBDIR)/lib$(NAME).a"
@echo Removing config information from $(PREFIX)/$(INSTALL_LIBDIR)/pkgconfig
@rm -f "$(PREFIX)/$(INSTALL_LIBDIR)/pkgconfig/nusquids.pc"
' >> ./Makefile
if [ "$PYTHON_BINDINGS" ]; then
echo '
python : $(PYTHON_LIB)
$(PYTHON_LIB) : build/nuSQUIDSpy.o $(STAT_PRODUCT)
@echo Linking python bindings
@$(CXX) $(DYN_OPT_PY) build/nuSQUIDSpy.o -Llib -l$(NAME) $(LDFLAGS) $(BOOST_PYTHON_LDFLAGS) $(PYTHON_LDFLAGS) -o $(PYTHON_LIB)
build/nuSQUIDSpy.o : resources/python/src/nuSQUIDSpy.cpp
@echo Compiling python bindings
@$(CXX) $(CXXFLAGS) -c -Iresources/python/inc $(PYTHON_CFLAGS) $(BOOST_CFLAGS) $(NUMPY_CFLAGS) $(CFLAGS) $< -o $@
python-install : $(PYTHON_LIB)
@echo Installing python module in $(PYTHON_MODULEDIR)
@mkdir -p $(PYTHON_MODULEDIR)
@cp $(PYTHON_LIB) $(PYTHON_MODULEDIR)
python-uninstall : $(PYTHON_LIB)
@echo Removing python module from $(PYTHON_MODULEDIR)
@rm $(PYTHON_MODULEDIR)/$(NAME).so
' >> ./Makefile
fi
echo "
export CXX=\"${CXX}\"
export CFLAGS=\"${CFLAGS} -I${SOURCE_PATH}/inlude ${SQUIDS_CFLAGS} ${GSL_CFLAGS} ${HDF5_CFLAGS}\"
export CXXFLAGS=\"${CXXFLAGS} -std=c++11\"
export LDFLAGS=\"${LDFLAGS} -L${SOURCE_PATH}/lib -Wl,-rpath -Wl,${SOURCE_PATH}/lib -lnuSQuIDS -lpthread ${SQUIDS_LDFLAGS} ${GSL_LDFLAGS} ${HDF5_LDFLAGS}\"
" > test/env_vars.sh
if uname | grep -q 'Darwin' ; then
printf "export DYLD_LIBRARY_PATH=\"" >> test/env_vars.sh
printf "${SOURCE_PATH}/lib:${SQUIDS_LIBDIR}:${GSL_LIBDIR}:${HDF5_LIBDIR}" >> test/env_vars.sh
if [ "$DYLD_LIBRARY_PATH" ]; then
printf ":${DYLD_LIBRARY_PATH}" >> test/env_vars.sh
fi
else
printf "export LD_LIBRARY_PATH=\"" >> test/env_vars.sh
printf "${SOURCE_PATH}/lib:${SQUIDS_LIBDIR}:${GSL_LIBDIR}:${HDF5_LIBDIR}" >> test/env_vars.sh
if [ "$LD_LIBRARY_PATH" ]; then
printf ":${LD_LIBRARY_PATH}" >> test/env_vars.sh
fi
fi
echo '"' >> test/env_vars.sh
echo "Done."
echo
echo "To build the library, run the following: make
After, to build examples: make examples"
if [ "$PYTHON_BINDINGS" ]; then
echo "To build the python bindings run: make python"
echo "To install the python bindings run: make python-install"
fi