#! /bin/sh
#
# ${R_HOME}/bin/INSTALL for installing add-on packages

# @configure_input@

revision='$Revision: 1.73 $'
version=`set - ${revision}; echo ${2}`
version="R add-on package installer ${version}

Copyright (C) 2000-2001 The R Core Development Team.
This is free software; see the GNU General Public Licence version 2
or later for copying conditions.  There is NO warranty."

usage="Usage: R CMD INSTALL [options] pkgs

Install the add-on packages specified by pkgs.  The elements of pkgs can
be relative or absolute paths to directories with the package (bundle)
sources, or to gzipped package \`tar' archives.  The library tree to
install to can be specified via \`--library'.  By default, packages are
installed in the library tree rooted at the first directory given in the
environment variable R_LIBS if this is set and non-null, and into the
default R library tree (${R_HOME}/library) otherwise.

Options:
  -h, --help		print short help message and exit
  -v, --version		print version info and exit
      --configure-args=ARGS
                        set args for package's configure script (if any)
      --configure-vars=VARS
                        set variables for the configure script (if any)
  -c, --clean		remove all files created during installation
  -s, --save            save the package source as an image file, and
                        arrange for this file to be loaded when the
                        package is attached
      --no-save         do not save the package source as an image file
  -d, --debug		turn on shell and build-help debugging
  -l, --library=LIB	install packages to library tree LIB
      --no-configure    do not use the package's configure script
      --no-docs		do not build and install documentation
      --use-zip-data	collect data files in zip archive
      --use-zip-help	collect help and examples into zip archives
      --use-zip		combine \`--use-zip-data' and \`--use-zip-help'

Report bugs to <r-bugs@r-project.org>."

R_VERSION='@VERSION@'
INSTALL='@INSTALL@'
MAKE=${MAKE-@MAKE@}
NO_PERL5=@NO_PERL5@
NO_PERL5_MSG="\
*** Formatting and installing R help pages needs Perl version 5, which
*** does not seem to be installed on your system or is not in your path.
*** Please install either Perl 5 on your system and re-configure R or
*** get the PDF reference manual from the nearest CRAN server.
*** The CRAN master site can be found at
***    http://cran.r-project.org/"
tmpdir="${TMPDIR-/tmp}/R.INSTALL.$$"

umask 022

. ${R_HOME}/share/sh/dcf.sh	# get_dcf_field()

get_packages () {
  ## get the full path names to all packages contained in $1.
  ## NOTE: modifies pkgs!
  if grep -s "^Contains:" "${1}/DESCRIPTION"; then
    bundlepkg=`get_dcf_field Contains "${1}/DESCRIPTION"`
    for p in ${bundlepkg}; do
      pkgs="${pkgs} \"`cd "${1}/${p}"; pwd`\""
      if test -f "${1}/${p}/DESCRIPTION.in"; then
        cat "${1}/${p}/DESCRIPTION.in"  > "${1}/${p}/DESCRIPTION"
        grep -v "^Contains:" "${1}/DESCRIPTION" >> "${1}/${p}/DESCRIPTION"
      fi
    done
  else 
    pkgs="${pkgs} \"`cd "${1}"; pwd`\""
  fi
}

lib=`echo ${R_LIBS:-"${R_HOME}/library"} | cut -f1 -d:`
pkgs=
clean=false
debug=false
error=false
build_text=true
build_html=true
build_latex=true
build_example=true
build_help=true
build_help_opts=
use_configure=true
use_zip_data=
use_zip_help=
configure_args=
configure_vars=

save="CHECK"
save_args="";

while test -n "${1}"; do
  case ${1} in
    -h|--help)
      echo "${usage}"; exit 0 ;;
    -v|--version)
      echo "${version}"; exit 0 ;;
    -c|--clean)
      clean=true ;;
    -s|--save)
      save=true;;
    --save=*)
      save_args=`echo "${1}" | sed -e 's/[^=]*=//'` ;;
    --no-save)
      save=false ;;
    -d|--debug)
      debug=true ;;
    --no-configure)
      use_configure=false ;;
    --no-docs)
      build_text=false
      build_html=false
      build_latex=false
      build_example=false ;;
    --no-text)
      build_text=false ;;
    --no-html)
      build_html=false ;;
    --no-latex)
      build_latex=false ;;
    --no-example)
      build_example=false ;;
    --use-zip)
      use_zip_data=true
      use_zip_help=true ;;
    --use-zip-data)
      use_zip_data=true ;;
    --use-zip-help)
      use_zip_help=true ;;
    -l|--library)
      lib=${2}; shift ;;
    --library=*)
      lib=`echo "${1}" | sed -e 's/[^=]*=//'` ;;
    --configure-args=*)
      configure_args=`echo "${1}" | sed -e 's/[^=]*=//'` ;;
    --configure-vars=*)
      configure_vars=`echo "${1}" | sed -e 's/[^=]*=//'` ;;
    *)
      if test -f "${1}"; then
        mkdir -p ${tmpdir}
	pkgname=`basename "${1}"`
	pkgname=`echo "${pkgname}" | sed 's/_.*//'`
	gzip -dc "${1}" | (cd ${tmpdir} && tar -xf -)
	if test -d "${tmpdir}/${pkgname}"; then
	  get_packages "${tmpdir}/${pkgname}"
	else
	  echo "ERROR: cannot extract package from ${1}"
	  exit 1
	fi    
      elif test -d "${1}"; then
        get_packages "${1}"
      else
	echo "WARNING: package \`${1}' does not exist"
      fi
      ;;
  esac
  shift
done

if test -z "${pkgs}"; then
  echo "ERROR: no packages specified"
  exit 1
fi

if test -d ${lib} -a -w ${lib} || mkdir ${lib} 2> /dev/null; then
  lib=`cd ${lib}; pwd`
  ## FIXME: Remove eventually.
  rm -f ${lib}/LibIndex
  ## </FIXME>
  cp ${R_HOME}/doc/html/R.css ${lib}
else
  echo "ERROR: cannot write to or create directory \`${lib}'"
  exit 2
fi

if ${build_text}; then
  build_help_opts="${build_help_opts} --txt"
fi
if ${build_html}; then
  build_help_opts="${build_help_opts} --html"
fi
if ${build_latex}; then
  build_help_opts="${build_help_opts} --latex"
fi
if ${build_example}; then
  build_help_opts="${build_help_opts} --example"
fi
if test -z "${build_help_opts}"; then
  build_help=false
elif ${debug}; then
  build_help_opts="--debug ${build_help_opts}"
fi

do_install () {
  cd "${1}"
  pkg=`basename "${1}"`

  depends=`get_dcf_field Depends DESCRIPTION`
  depends=`echo ${depends} | grep 'R *('`
  if test "${depends}"; then
    depends=`echo ${depends} | sed 's/.*R *(\([^)]*\)).*/\1/;s/=/= /'`
    dep_operator=`set - ${depends}; echo ${1}`
    dep_version=`set - ${depends}; echo ${2}`
    ## Currently, only operators `<=' and `>=' are supported.  Hence we
    ## check this, and also whether we found a version string.
    if (test "${dep_operator}" = "<=" \
	|| test "${dep_operator}" = ">=") \
	&& test -n "${dep_version}"; then
      dep_ok=`expr ${R_VERSION} ${dep_operator} ${dep_version} `
      if test ${dep_ok} -eq 0; then
	echo "ERROR: This R is version ${R_VERSION}"
	echo "       package \`${pkg}' depends on R ${dep_version}"
	exit 1;
      fi
    else
      echo "WARNING: malformed \`Depends' field in \`DESCRIPTION'"
    fi
  fi

  mkdir -p ${lib}/${pkg} || exit 3

  if test -d man; then
    ## Assume this is a source package.
    ## FIXME:  Do we have a better test?
    echo "Installing source package \`${pkg}' ..."

    ## Make the destination directories available to the developer's
    ## installation scripts (e.g. configure, etc.)
    R_PACKAGE_DIR=${lib}/${pkg}
    R_LIBRARY_DIR=${lib}
    R_PACKAGE_NAME=${pkg}
    export R_LIBRARY_DIR
    export R_PACKAGE_DIR
    export R_PACKAGE_NAME

    if ${use_configure} && test -x ./configure ; then
      eval ${configure_vars} ./configure ${configure_args}
      if test ${?} -ne 0; then
	echo "ERROR: configuration failed for package \`${pkg}'"
	exit 4
      fi
    fi

    if test -d src; then
      echo " libs"
      if ${debug}; then set -x; fi
      mkdir -p ${lib}/${pkg}/libs
      if test -f src/Makefile; then
        cd src;
          makefiles="-f ${R_HOME}/share/make/shlib.mk -f Makefile"
	  if test -r Makevars; then
	    makefiles="-f Makevars ${makefiles}"
	  fi
	  ${MAKE} ${makefiles} \
	    && cp *@SHLIB_EXT@ ${lib}/${pkg}/libs \
	    || error=true; \
	  if ${clean}; then
	    ${MAKE} clean
	  fi
	cd ..
      else
        cd src;
          srcs=`ls *.[cfC] *.cc *.cpp 2>/dev/null`
	  if test -n "${srcs}"; then
	    sh ${R_HOME}/bin/SHLIB -o ${pkg}@SHLIB_EXT@ ${srcs} \
	      && cp *@SHLIB_EXT@ ${lib}/${pkg}/libs \
  	      || error=true; \
	    if ${clean}; then
	      rm -rf .libs _libs
	      rm -f *.o *@SHLIB_EXT@
	    fi
	  else
	    echo "WARNING: no source files found"
	  fi
	cd ..
      fi
      if ${error}; then
	echo "ERROR: compilation failed for package \`${pkg}'"
	exit 5
      fi
      if ${debug}; then set +x; fi
    fi

    if test -d R; then
      echo " R"
      Rsrcs=`ls R/*.[RSqrs] R/unix/*.[RSqrs] 2>/dev/null`
      if test -n "${Rsrcs}"; then
        mkdir -p ${lib}/${pkg}/R
        cat  ${Rsrcs} > ${lib}/${pkg}/R/${pkg}
      fi
    fi

    if test -d data; then
      echo " data"
      mkdir -p ${lib}/${pkg}/data
      cp data/* ${lib}/${pkg}/data
      chmod 644 ${lib}/${pkg}/data/*
      if test -n "${use_zip_data}" \
          -a -n "${R_UNZIPCMD}" \
          -a -n "${R_ZIPCMD}"; then
        (cd ${lib}/${pkg}/data;
          find . -type f -print > filelist
          ${R_ZIPCMD} -m Rdata * -x filelist 00Index)
      fi
    fi

    if test -d demo; then
      echo " demo"
      mkdir -p ${lib}/${pkg}/demo
      cp demo/* ${lib}/${pkg}/demo
      chmod 644 ${lib}/${pkg}/demo/*
    fi

    if test -d exec; then
      echo " exec"
      mkdir -p ${lib}/${pkg}/exec
      cp exec/* ${lib}/${pkg}/exec
      chmod 755 ${lib}/${pkg}/exec/*
    fi

    if test -d inst; then
      echo " inst"
      cp -r inst/* ${lib}/${pkg}
    fi

    case ${save} in
      CHECK)
	if test -r install.R; then
	  R_SAVE_IMAGE=true;
        else
	  R_SAVE_IMAGE=false;
        fi
	;;
      *)
	R_SAVE_IMAGE=${save} ;;
    esac
    export R_SAVE_IMAGE

    if ${R_SAVE_IMAGE}; then
      echo " save image"
      if test -s "R_PROFILE.R"; then true
      else
        echo "options(echo=FALSE)" > R_PROFILE.R
      fi
      R_PROFILE=./R_PROFILE.R
      export R_PROFILE
      (echo " .lib.loc <- c(\"${lib}\", .lib.loc)";
        cat ${lib}/${pkg}/R/${pkg};
        echo "rm(.lib.loc)") | ${R_HOME}/bin/R --save --silent ${save_args}\
          || (echo "Execution of package source for ${pkg} failed"; exit 1)
      mv .RData ${lib}/${pkg}/R/all.rda
      mv ${lib}/${pkg}/R/${pkg} ${lib}/${pkg}/R/${pkg}.R
      cat ${R_HOME}/share/R/firstlib.R > ${lib}/${pkg}/R/${pkg}
      ## if install.R is non-empty, arrange to evaluate the R code it
      ## contains after the package source (maybe for some kind of
      ## cleanup).
      if test -s install.R; then
        cat install.R >> ${lib}/${pkg}/R/${pkg}
      fi
    fi

    for f in COPYING INDEX; do
      if test -f ${f}; then cp ${f} ${lib}/${pkg}; fi
    done
    title=`get_dcf_field Title DESCRIPTION`
    if test "${title}"; then
      ${R_CMD} perl ${R_HOME}/share/perl/maketitle.pl DESCRIPTION \
        > ${lib}/${pkg}/TITLE
    elif test -f TITLE; then
      cp TITLE ${lib}/${pkg}
    fi
    ## copy DESCRIPTION file and remove blank lines
    if test -f DESCRIPTION; then
      cat DESCRIPTION | sed '/^[	]*$/d;' \
	> ${lib}/${pkg}/DESCRIPTION
    fi
    ## stamp DESCRIPTION with build information
    echo "Built: R" ${R_VERSION}\;  ${R_PLATFORM}\;  `date` \
      >> ${lib}/${pkg}/DESCRIPTION

    if test -d man; then
      echo " help"
      if ${build_help}; then
	if ${NO_PERL5}; then
	  echo "${NO_PERL5_MSG}"
	else
	  if ${debug}; then
	    echo "  build-help ${BUILD_HELP_OPTS} ../${pkg} ${lib}"
	  fi
	  ${R_CMD} perl ${R_HOME}/share/perl/build-help.pl \
	    ${build_help_opts} ../${pkg} ${lib}
	  if test ${?} -ne 0; then
	    echo "ERROR: building help failed for package \`${pkg}'"
	    exit 6
	  fi
	  ${R_CMD} perl ${R_HOME}/share/perl/Rd2contents.pl \
	    --os=unix ../${pkg} > ${lib}/${pkg}/CONTENTS
	  if test ${lib} = ${R_HOME}/library; then 
	    ${R_CMD} perl ${R_HOME}/share/perl/build-help.pl --htmllists
	    cat ${R_HOME}/library/*/CONTENTS \
	      > ${R_HOME}/doc/html/search/index.txt
	  fi	
	fi
	if test -n "${use_zip_help}" \
            -a -n "${R_UNZIPCMD}" \
	    -a -n "${R_ZIPCMD}"; then
	  cd ${lib}/${pkg}
	  if test -d R-ex; then
	    (cd R-ex; ${R_ZIPCMD} -m Rex *.R)
	  fi
	  ## NOT YET:
	  ## if test -d latex; then
	  ##   (cd latex; ${R_ZIPCMD} -m Rhelp *.tex)
	  ## fi
	  if test -d help; then
	    (cd help; ${R_ZIPCMD} -m Rhelp * -x AnIndex);
	  fi
        fi
      fi
    else
      echo "  No man pages found in package \`${pkg}'"
    fi

    if ${clean}; then
      if test -x ./cleanup ; then
	./cleanup
      fi
    fi

  else  
    ## Assume this is a binary package
    echo "Installing binary package \`${pkg}' ..."
    cp -r . ${lib}/${pkg}
  fi

  chmod -R a+r ${lib}/${pkg}

  echo " DONE (${pkg})"
  echo
}

eval "for pkg in ${pkgs}; do do_install \"\${pkg}\"; done"

if test -d "${tmpdir}"; then
  cd /
  rm -rf "${tmpdir}"
fi

echo "DONE (INSTALL)"

### Local Variables: ***
### mode: sh ***
### sh-indentation: 2 ***
### End: ***
