431 lines
14 KiB
Bash
Executable File
431 lines
14 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# This scripts installs the prerequisites for the InSAR
|
|
# Scientific Computing Environment (ISCE)
|
|
#
|
|
# Author : Kosal Khun, Marco Lavalle
|
|
# Date : 2012-06-28
|
|
# Version : 1.1
|
|
# Update : 2014-04-02 updated to support python3 (ML)
|
|
|
|
BASENAME=$0 #command line with relative path to this file
|
|
ARGS=$@
|
|
BASEDIR=$(pwd) #get base folder where command has been issued
|
|
cd $(dirname $BASENAME) #go to setup folder
|
|
SETUPDIR=$(pwd) #get absolute path of setup folder
|
|
|
|
i_folder="INSTALL_FOLDER"
|
|
c_file="CONFIG_FILE"
|
|
dep_list="GMP,MPFR,MPC,GCC,SCONS,FFTW,SZIP,HDF5,NUMPY,H5PY"
|
|
SETUPLOG="$HOME/.isce/setup.log"
|
|
|
|
printhelp () {
|
|
echo $1
|
|
echo "Use the option -h to get more information."
|
|
exit 1
|
|
}
|
|
|
|
print2log () {
|
|
cmd=0
|
|
if [[ -n $2 ]]; then
|
|
if [[ $2 == "d" ]]; then
|
|
now=$(date +"%c")
|
|
msg="$now >> $1"
|
|
elif [[ $2 == "c" ]]; then
|
|
cmd=1
|
|
msg="running command: $1"
|
|
else
|
|
msg=$1
|
|
fi
|
|
else
|
|
msg=$1
|
|
fi
|
|
echo -e $msg >> $SETUPLOG
|
|
echo -e $1
|
|
if [[ $cmd == 1 ]]; then
|
|
$1
|
|
fi
|
|
}
|
|
|
|
|
|
usage () {
|
|
echo -e "Usage: $BASENAME -p $i_folder [OPTION]... | -c $c_file"
|
|
echo "Install the software ISCE and its dependencies."
|
|
echo "List of dependencies: $dep_list"
|
|
echo
|
|
echo -e " -p $i_folder"
|
|
echo -e "\tInstall everything to the directory $i_folder."
|
|
echo -e "\t- Packages will be downloaded and unpacked into $i_folder/src"
|
|
echo -e "\t- Binaries, libraries and includes will be put into"
|
|
echo -e "\t$i_folder/bin, $i_folder/lib, $i_folder/include"
|
|
echo -e "\t- Environment variables and ISCEConfig file will be setup"
|
|
echo -e "\tto install ISCE at $i_folder/isce"
|
|
echo -e "\tUse only this option for fast installation."
|
|
echo
|
|
echo -e " -c $c_file"
|
|
echo -e "\tThe script will skip the installation of the dependencies"
|
|
echo -e "\tand will use the given $c_file to install ISCE."
|
|
echo -e "\tUse only if all required dependencies are already installed"
|
|
echo -e "\tor if the configuration file has been changed manually."
|
|
echo -e "\tYou need to pass the -p argument"
|
|
echo -e "\tif you have used this script to install python"
|
|
echo -e "\tand some packages like numpy, h5py."
|
|
echo
|
|
echo "Additional options:"
|
|
echo -e " -v\tVerbose"
|
|
echo -e " -b PYTHON_PATH\n\tTell the script where python is located."
|
|
echo -e "\tPYTHON_PATH must be the full path to the python file."
|
|
echo
|
|
echo "Use the following options to customize your installation:"
|
|
echo -e " -d NONE | ALL | dep1,dep2..."
|
|
echo -e "\tDownload the given dependencies (see list)."
|
|
echo -e "\tDefault: NONE"
|
|
echo -e "\tThe names must be separated by a comma, with no space."
|
|
echo -e "\tThe packages not in the list must be present"
|
|
echo -e "\tin $i_folder/src"
|
|
echo -e " -u NONE | ALL | dep1,dep2..."
|
|
echo -e "\tUntar the given dependencies (see list)"
|
|
echo -e "\tin addition to those given with -d"
|
|
echo -e "\tDefault: NONE (the script will use list given with -d)"
|
|
echo -e "\tThe packages not in the list must be already"
|
|
echo -e "\tunpacked in $i_folder/src"
|
|
echo -e " -i NONE | ALL | dep1,dep2..."
|
|
echo -e "\tInstall the given dependencies (see list)"
|
|
echo -e "\tin addition to those given with -d and -u"
|
|
echo -e "\tDefault: NONE (the script will use list given with -d and -u)"
|
|
echo -e "\tThe packages not in the list should be already"
|
|
echo -e "\tinstalled in $i_folder"
|
|
echo
|
|
echo -e " ***warning***"
|
|
echo -e "\tPython 3.x does not support Scons, therefore the install script"
|
|
echo -e "\trequires python 2.x to run Scons and python >= 3.2.0 to run ISCE."
|
|
echo -e "\tThe script assumes that python 2.x is available in the path as python,"
|
|
echo -e "\tand downloads and installs python3 if not found."
|
|
echo
|
|
|
|
}
|
|
|
|
|
|
startlog () {
|
|
LOGDIR=$(dirname $SETUPLOG)
|
|
mkdir $LOGDIR
|
|
print2log ""
|
|
print2log "=========================================="
|
|
print2log "Starting install.sh script:" d
|
|
print2log "\t$BASENAME $ARGS"
|
|
print2log "------------------------------------------"
|
|
print2log "current directory: $BASEDIR"
|
|
}
|
|
|
|
|
|
changedir () {
|
|
if [[ -n $1 && -d $1 ]]; then
|
|
print2log "cd $1" c
|
|
print2log "current directory: $(pwd)"
|
|
else
|
|
print2log "error in changedir: no directory given"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
VERBOSE=
|
|
while getopts 'p:b:c:vd:u:i:h' opt; do
|
|
case $opt in
|
|
h)
|
|
usage
|
|
exit 0
|
|
;;
|
|
b)
|
|
PYTHONBIN=$OPTARG
|
|
;;
|
|
p)
|
|
PREFIX=$OPTARG
|
|
;;
|
|
c)
|
|
CONFIG=$OPTARG
|
|
;;
|
|
v)
|
|
VERBOSE=--verbose
|
|
;;
|
|
d)
|
|
DO_DOWNLOAD=$OPTARG
|
|
;;
|
|
u)
|
|
DO_UNPACK=$OPTARG
|
|
;;
|
|
i)
|
|
DO_INSTALL=$OPTARG
|
|
;;
|
|
\?)
|
|
printhelp "error in arguments"
|
|
;;
|
|
*)
|
|
usage;;
|
|
esac
|
|
done
|
|
|
|
|
|
if [[ -z "$PREFIX" && -z "$CONFIG" ]]; then #neither prefix nor config are given
|
|
printhelp "missing arguments -p or -c" #exit
|
|
fi
|
|
|
|
if [[ -n "$PYTHONBIN" ]]; then #python path given
|
|
if [[ ! -e "$PYTHONBIN" ]]; then #could not find python
|
|
printhelp "could not find $PYTHONBIN: please, give the full path to python" #exit
|
|
fi
|
|
else
|
|
PYTHONBIN=$(which python)
|
|
fi
|
|
|
|
|
|
startlog
|
|
UNAME=$(uname) #OS or kernel name
|
|
print2log "checking uname... $UNAME"
|
|
|
|
##### IF CONFIG IS GIVEN ####
|
|
if [[ -n "$CONFIG" ]]; then #skip installation of dependencies
|
|
cd $BASEDIR #come back to initial folder
|
|
if [[ ! -f $CONFIG ]]; then
|
|
print2log "config file $CONFIG could not be found: please check the folder or create the file first"
|
|
printhelp #exit
|
|
else
|
|
cd $(dirname $CONFIG)
|
|
CONFIG=$(pwd)/$(basename $CONFIG) #get absolute path of config file
|
|
fi
|
|
if [[ -n "$PREFIX" ]]; then #if prefix given
|
|
cd $BASEDIR #come back to initial folder
|
|
if [[ ! -d $PREFIX ]]; then #if folder doesn't exist
|
|
print2log "directory $PREFIX doesn't exist"
|
|
printhelp #exit
|
|
else
|
|
cd $PREFIX
|
|
PREFIX=$(pwd) #get absolute path of prefix
|
|
fi
|
|
fi
|
|
|
|
print2log "cd $SETUPDIR" c #go to setup folder
|
|
$PYTHONBIN setup.py --ping=pong --uname=${UNAME} --config=${CONFIG} --prefix=${PREFIX} $VERBOSE
|
|
exit 1
|
|
fi
|
|
|
|
#### WITH PREFIX - NO CONFIG ####
|
|
#checking prerequisites: gcc g++ make m4
|
|
check="gcc g++ make m4"
|
|
arrCheck=(${check// / })
|
|
missing=
|
|
for ((c=0; c < ${#arrCheck[@]}; c++))
|
|
do
|
|
x=${arrCheck[c]}
|
|
print2log "checking for $x"
|
|
which[c]=$(command -v $x)
|
|
if [[ -n "${which[c]}" ]]; then #path of app returned
|
|
print2log "result: $($x --version | head -1)"
|
|
if [[ "$x" == "gcc" ]]; then
|
|
GCC=${which[c]}
|
|
elif [[ "$x" == "g++" ]]; then
|
|
GPP=${which[c]}
|
|
fi
|
|
else #app not found
|
|
print2log "result: no"
|
|
missing="$missing $x"
|
|
fi
|
|
done
|
|
if [[ -z "$missing" ]]; then #prerequisites already installed
|
|
print2log "$check already installed"
|
|
else #missing packages
|
|
print2log "missing package(s):$missing"
|
|
print2log "check your PATH or install them manually"
|
|
exit 1
|
|
fi
|
|
|
|
#checking destination folder
|
|
cd $BASEDIR
|
|
if [[ ! -d $PREFIX ]]; then
|
|
print2log "directory $PREFIX does not exists"
|
|
print2log "mkdir -p $PREFIX" c
|
|
if [ $? ]; then
|
|
print2log "...done"
|
|
cd $PREFIX
|
|
PREFIX=$(pwd) #get absolute path of prefix
|
|
else
|
|
print2log "could not create ${PREFIX}"
|
|
print2log "$i_folder must be a local directory where you have write permissions"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
changedir $PREFIX
|
|
INSTALL_DIR=$(pwd) #absolute path of installation folder
|
|
DOWNLOAD_DIR=$INSTALL_DIR/src #download folder
|
|
BUILD_DIR=$INSTALL_DIR/build #build folder
|
|
SOURCE_DIR=$INSTALL_DIR/src #source folder (where downloaded package is untarred)
|
|
|
|
export PATH=${INSTALL_DIR}/bin:${PATH} #make sure that python is searched in INSTALL_DIR first
|
|
if [[ -n $LD_LIBRARY_PATH ]]; then
|
|
export LD_LIBRARY_PATH=${INSTALL_DIR}/lib:${LD_LIBRARY_PATH}
|
|
else
|
|
export LD_LIBRARY_PATH=${INSTALL_DIR}/lib
|
|
fi
|
|
print2log "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
|
|
|
|
print2log "checking for Python"
|
|
REQUIRED=3.2.0 #the minimum version of python needed - ML updated on 2014-04-03 from 2.6.6
|
|
APPVER=3.4.0 #the version that will be installed - ML updated on 2014-04-03 from 2.7.3
|
|
#Check if Python is installed and the version is correct
|
|
PYTHONBIN3=$(which python3) # ML added PYTHONBIN3 on 2014-04-02
|
|
PYTHON=$(command -v $PYTHONBIN3) #ML PYTHONBIN3 in place of PYTHONBIN
|
|
if [[ -n "${PYTHON}" ]]; then #python is installed
|
|
#VERSION=$(${PYTHON} -V 2>&1 | awk -F" " '{print $2}')
|
|
VERSION=$(${PYTHON} -c "import sys; print('.'.join(map(str, sys.version_info[:3])))")
|
|
print2log "result: Python $VERSION"
|
|
if [[ "$VERSION" < "2.9.9" ]]; then #not supported yet - ML updated from > "2.9.9" on 2014-04-02
|
|
answer_ok=0
|
|
print2log "Python $VERSION is no longer supported."
|
|
until [[ $answer_ok == 1 ]]; do
|
|
echo -n "Python $VERSION is no longer supported. Would you like the script to install python $APPVER? (Y/n) "
|
|
read -n 1 answer
|
|
if [[ -z "$answer" ]]; then
|
|
answer=y
|
|
else
|
|
echo
|
|
fi
|
|
if [[ "$answer" == "n" || "$answer" == "N" ]]; then
|
|
print2log "ISCE needs at least python $REQUIRED" # ML updated to Python 3.x
|
|
print2log "Python installation skipped by user: exiting script"
|
|
exit 1
|
|
fi
|
|
if [[ "$answer" == "y" || "$answer" == "Y" ]]; then
|
|
answer_ok=1
|
|
fi
|
|
done
|
|
|
|
elif [[ "$VERSION" < "$REQUIRED" ]]; then #not correct version!
|
|
print2log "you must have python >= $REQUIRED"
|
|
else #correct version, now check if it's python-devel
|
|
#first, check if python has distutils
|
|
print2log "checking for module distutils"
|
|
distutils_result=$(${PYTHON} -c "import distutils" 2>&1)
|
|
if [[ -z "$distutils_result" ]]; then #distutils ok
|
|
print2log "result: yes"
|
|
#check for Python include path
|
|
print2log "checking for Python include path"
|
|
python_path=$(${PYTHON} -c "import distutils.sysconfig; print (distutils.sysconfig.get_python_inc ());")
|
|
if [[ -n "${python_path}" ]]; then #include path found
|
|
print2log "result: ${python_path}"
|
|
#check for Python.h
|
|
print2log "checking for Python.h"
|
|
pythonH="${python_path}/Python.h"
|
|
if [[ -f ${pythonH} ]]; then #Python.h found
|
|
print2log "result: ${pythonH}"
|
|
python_ok="Yoohoo!"
|
|
else
|
|
print2log "result: Python.h not found in ${python_path}"
|
|
fi
|
|
else
|
|
print2log "result: Python include path not found"
|
|
fi
|
|
else
|
|
print2log "result: Python module distutils not found"
|
|
fi
|
|
fi
|
|
else #python is NOT installed
|
|
print2log "result: Python not found"
|
|
fi
|
|
|
|
|
|
if [[ -n "$python_ok" ]]; then #correct version of python is already installed
|
|
print2log "your python3 version is correct."
|
|
bindir=$INSTALL_DIR/bin
|
|
if [[ $(dirname $PYTHONBIN3) != "$bindir" ]]; then # ML PYTHONBIN3 in place of PYTHONBIN
|
|
if [[ ! -d $bindir ]]; then
|
|
print2log "mkdir -p $bindir" c
|
|
elif [[ -e $bindir/python ]]; then
|
|
print2log "rm $bindir/python" c
|
|
fi
|
|
print2log "ln -s $PYTHONBIN3 $bindir/python3" c
|
|
fi
|
|
|
|
else #python has to be installed
|
|
print2log "you don't have the correct version of Python"
|
|
print2log "the script will download and install Python $APPVER"
|
|
|
|
changedir $INSTALL_DIR
|
|
if [ ! -d $DOWNLOAD_DIR ]; then
|
|
print2log "mkdir $DOWNLOAD_DIR" c
|
|
fi
|
|
if [ ! -d $SOURCE_DIR ]; then
|
|
print2log "mkdir $SOURCE_DIR" c
|
|
fi
|
|
if [ ! -d $BUILD_DIR ]; then
|
|
print2log "mkdir $BUILD_DIR" c
|
|
fi
|
|
|
|
APPFILE="Python-${APPVER}.tgz" #ML updated from tar.bz2 to tgz on 2014-04-02
|
|
APP_DIR="Python-${APPVER}"
|
|
URL="https://www.python.org/ftp/python/${APPVER}/${APPFILE}"
|
|
print2log "downloading Python archive file..."
|
|
changedir $DOWNLOAD_DIR
|
|
if which curl >/dev/null; then
|
|
print2log "curl -O --insecure $URL" c
|
|
else
|
|
print2log "wget $URL --no-check-certificate" c #ML added --no-check-certificate on 2014-04-02
|
|
fi
|
|
if [[ ! -e $APPFILE ]]; then #file not downloaded!
|
|
print2log "error while trying to download file from $URL"
|
|
print2log "please check your internet connection and the URL"
|
|
exit 1
|
|
fi
|
|
print2log "...done"
|
|
|
|
print2log "unpacking source files..."
|
|
changedir $SOURCE_DIR
|
|
print2log "rm -Rf $APP_DIR" c
|
|
print2log "tar -xf ${DOWNLOAD_DIR}/${APPFILE}" c
|
|
print2log "...done"
|
|
|
|
print2log "building files..."
|
|
changedir $BUILD_DIR
|
|
print2log "rm -Rf $APP_DIR" c
|
|
print2log "mkdir $APP_DIR" c
|
|
changedir $APP_DIR
|
|
|
|
if [[ -n $VERBOSE ]]; then
|
|
redirect="2>&1 | tee -a"
|
|
redirect2=
|
|
else
|
|
redirect=">>"
|
|
redirect2="2>&1"
|
|
fi
|
|
if [[ $UNAME == 'Darwin' ]]; then #Mac OS
|
|
print2log "${SOURCE_DIR}/${APP_DIR}/configure \
|
|
--with-dyld \
|
|
--prefix=${PREFIX}" c
|
|
# --enable-unicode=ucs4 \
|
|
# --program-suffix=.exe $redirect ${BUILD_DIR}/${APP_DIR}/PYTHON_configure.log $redirect2" c
|
|
else
|
|
print2log "${SOURCE_DIR}/${APP_DIR}/configure \
|
|
--prefix=${PREFIX} \
|
|
--enable-shared" c
|
|
# $redirect ${BUILD_DIR}/${APP_DIR}/PYTHON_configure.log $redirect2" c
|
|
# --enable-unicode=ucs4 \
|
|
# --program-suffix=.exe \
|
|
fi
|
|
|
|
print2log "make" c # $redirect ${BUILD_DIR}/${APP_DIR}/PYTHON_build.log $redirect2" c
|
|
print2log "make install" c # $redirect ${BUILD_DIR}/${APP_DIR}/PYTHON_install.log $redirect2" c
|
|
|
|
PYTHONBIN3=${INSTALL_DIR}/bin/python3 # ML changed to python3 on 2014-04-02
|
|
if command -v $PYTHONBIN3; then #python has been installed
|
|
print2log "...done"
|
|
else
|
|
print2log "python could not be installed"
|
|
print2log "please install python >= ${REQUIRED} manually"
|
|
print2log "if you already have it installed, make sure that\nyour PATH has been changed accordingly"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
print2log "\ninstalling the other dependencies..."
|
|
changedir $SETUPDIR
|
|
$PYTHONBIN setup.py --ping=pong --uname=${UNAME} --gcc=${GCC} --gpp=${GPP} --prefix=${INSTALL_DIR} --download=${DO_DOWNLOAD} --unpack=${DO_UNPACK} --install=${DO_INSTALL} $VERBOSE
|