#! /bin/sh

## config -- Simple shell script to get the values of basic R configure
## variables, or the header and library flags necessary for linking
## against R.
##
## Usage:
##   R CMD config [options] [VAR]

## Copyright (C) 2002 The R Core Development Team
##
## This document is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2, or (at your option)
## any later version.
##
## This program is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## A copy of the GNU General Public License is available via WWW at
## http://www.gnu.org/copyleft/gpl.html.  You can also obtain it by
## writing to the Free Software Foundation, Inc., 59 Temple Place,
## Suite 330, Boston, MA  02111-1307, U.S.A.

revision='$Revision: 1.2 $'
version=`set - ${revision}; echo ${2}`
version="R configuration information retrieval script ${version}

Copyright (C) 2002 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 config [options] [VAR]

Get the value of a basic R configure variable VAR which must be among
those listed in the 'Variables' section below, or the header and
library flags necessary for linking against R.

Options:
  -h, --help            print short help message and exit
  -v, --version         print version info and exit
      --cppflags        print pre-processor flags required to compile
                        a program using R as a shared library
      --ldflags         print linker flags needed for linking against
                        the R shared library

Variables:
  CC                    C compiler command
  CFLAGS                C compiler flags
  CPICFLAGS             special flags for compiling C code to be turned
                        into a shared library
  CPP                   C preprocessor
  CPPFLAGS              C/C++ preprocessor flags, e.g. -I<dir> if you
                        have headers in a nonstandard directory <dir>
  CXX                   C++ compiler command
  CXXCPP                C++ preprocessor
  CXXFLAGS              C++ compiler flags
  CXXPICFLAGS           special flags for compiling C++ code to be
                        turned into a shared library
  F2C                   FORTRAN-to-C converter command
  F77                   Fortran 77 compiler command
  FFLAGS                Fortran 77 compiler flags
  FLIBS                 linker flags needed to link FORTRAN code
  FPICFLAGS             special flags for compiling FORTRAN code to be
                        turned into a shared library
  LDFLAGS               linker flags, e.g. -L<dir> if you have libraries
                        in a nonstandard directory <dir>
  MAKE                  Make command
  SHLIB_CFLAGS          additional CFLAGS used when building shared
                        libraries
  SHLIB_CXXLD           command for linking shared libraries which
                        contain object files from a C++ compiler
  SHLIB_CXXLDFLAGS      special flags used by SHLIB_CXXLD
  SHLIB_FFLAGS          additional FFLAGS used when building shared
                        libraries 
  SHLIB_LD              command for linking shared libraries which
                        contain object files from a C or FORTRAN
                        compiler only 
  SHLIB_LDFLAGS         special flags used by SHLIB_LD
  BLAS_LIBS             linker flags for the BLAS libraries used when
                        building R (empty if none were used)
  TCLTK_CPPFLAGS        flags needed for finding the tcl.h and tk.h headers
  TCLTK_LIBS            flags needed for linking against the Tcl and Tk
                        libraries

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

## <NOTE>
## The variables are basically the precious configure variables (with
## the R_* and MAIN_* ones removed), plus FLIBS and BLAS_LIBS.
## One could use
##   precious_configure_vars=`~/src/R/configure --help \
##     | sed -n '/^Some influential/,/^[^ ]/p' \
##     | sed '/^[^ ]/d' \
##     | sed 's/^  //' \
##     | cut -f1 -d ' ' \
##     | sort \
##     | uniq`
## to obtain the configure vars and hence create most of the above usage
## info as well as the list ok accepted variables below automatically.

makefiles="-f ${R_HOME}/etc/Makeconf -f ${R_HOME}/share/make/config.mk"
query="${MAKE} -s ${makefiles} print R_HOME=${R_HOME}"

LIBR=`eval $query VAR=LIBR`

var=
while test -n "${1}"; do
  case "${1}" in
    -h|--help)
      echo "${usage}"; exit 0 ;;
    -v|--version)
      echo "${version}"; exit 0 ;;
    --cppflags)
      if test -z "${LIBR}"; then
        echo "R was not built as a shared library" >&2
      else
        echo "-I${R_HOME}/include"
      fi
      exit 0
      ;;
    --ldflags)
      if test -z "${LIBR}"; then
        echo "R was not built as a shared library" >&2
      else
        echo "${LIBR}"
      fi
      exit 0
      ;;
    *)
      if test -z "${var}"; then
        var="${1}"
      else
        echo "ERROR: cannot query more than one variable" >&2
        exit 1
      fi
      ;;
  esac
  shift
done

ok_c_vars="CC CFLAGS CPICFLAGS CPP CPPFLAGS"
ok_cxx_vars="CXX CXXCPP CXXFLAGS CXXPICFLAGS"
ok_f77_vars="F2C F77 FFLAGS FPICFLAGS FLIBS"
ok_ld_vars="LDFLAGS"
ok_shlib_vars="SHLIB_CFLAGS SHLIB_CXXLD SHLIB_CXXLDFLAGS SHLIB_FFLAGS SHLIB_LD SHLIB_LDFLAGS"
ok_tcltk_vars="TCLTK_CPPFLAGS TCLTK_LIBS"
ok_other_vars="BLAS_LIBS MAKE"

## Can we do this elegantly using case?

var_ok=no
for v in ${ok_c_vars} ${ok_cxx_vars} ${ok_f77_vars} ${ok_ld_vars} \
         ${ok_shlib_vars} ${ok_tcltk_vars} ${ok_other_vars}; do
  if test "${var}" = "${v}"; then
    var_ok=yes
    break
  fi
done

if test "${var_ok}" = yes; then
  eval "${query} VAR=${var}"
else
  echo "ERROR: no information for variable '${var}'"
  exit 1
fi

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