## 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-2017 The R Core 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 at ## https://www.R-project.org/Licenses/ revision='$Revision$' version=`set - ${revision}; echo ${2}` version="R configuration information retrieval script: ${R_VERSION} (r${version}) Copyright (C) 2002-2015 The R Core Team. This is free software; see the GNU General Public License 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 C/C++ file using R as a library --ldflags print linker flags needed for linking a front-end against the R library --no-user-files ignore customization files under ~/.R --no-site-files ignore site customization files under R_HOME/etc --all print names and values of all variables below Variables: BLAS_LIBS flags needed for linking against external BLAS libraries CC C compiler command CFLAGS C compiler flags CPICFLAGS special flags for compiling C code to be included in a shared library CPP C preprocessor CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX default compiler command for C++ code CXXCPP C++ preprocessor CXXFLAGS compiler flags for CXX CXXPICFLAGS special flags for compiling C++ code to be included in a shared library CXX98 compiler command for C++98 code CXX98CPP C++98 preprocessor CXX98FLAGS compiler flags for CXX98 CXX98PICFLAGS special flags for compiling C++98 code to be included in a shared library CXX11 compiler command for C++11 code CXX11STD flag used with CXX11 to enable C++11 support CXX11FLAGS further compiler flags for CXX11 CXX11PICFLAGS special flags for compiling C++11 code to be included in a shared library CXX14 compiler command for C++14 code CXX14STD flag used with CXX14 to enable C++14 support CXX14FLAGS further compiler flags for CXX14 CXX14PICFLAGS special flags for compiling C++14 code to be included in a shared library CXX17 compiler command for C++17 code CXX17STD flag used with CXX17 to enable C++17 support CXX17FLAGS further compiler flags for CXX17 CXX17PICFLAGS special flags for compiling C++17 code to be included in a shared library DYLIB_EXT file extension (including '.') for dynamic libraries DYLIB_LD command for linking dynamic libraries which contain object files from a C or Fortran compiler only DYLIB_LDFLAGS special flags used by DYLIB_LD 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 FC Fortran 9x compiler command FCFLAGS Fortran 9x compiler flags FCPICFLAGS special flags for compiling Fortran 9x code to be turned into a shared library JAR Java archive tool command JAVA Java interpreter command JAVAC Java compiler command JAVAH Java header and stub generator command JAVA_HOME path to the home of Java distribution JAVA_LIBS flags needed for linking against Java libraries JAVA_CPPFLAGS C preprocessor flags needed for compiling JNI programs LAPACK_LIBS flags needed for linking against external LAPACK libraries LIBnn location for libraries, e.g. 'lib' or 'lib64' on this platform LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory OBJC Objective C compiler command OBJCFLAGS Objective C compiler flags MAKE Make command SAFE_FFLAGS Safe (as conformant as possible) Fortran 77 compiler flags SHLIB_CFLAGS additional CFLAGS used when building shared objects SHLIB_CXXLD command for linking shared objects which contain object files from a C++ compiler (and CXX98 CXX11 CXX14 CXX17) SHLIB_CXXLDFLAGS special flags used by SHLIB_CXXLD (and CXX98 CXX11 CXX14 CXX17) SHLIB_EXT file extension (including '.') for shared objects SHLIB_FFLAGS additional FFLAGS used when building shared objects SHLIB_LD command for linking shared objects which contain object files from a C or Fortran compiler only SHLIB_LDFLAGS special flags used by SHLIB_LD SHLIB_FCLD, SHLIB_FCLDFLAGS ditto when using Fortran 9x 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 " if test "${R_OSTYPE}" = "windows"; then usage="${usage} Windows only: COMPILED_BY name and version of compiler used to build R" fi usage="${usage} Report bugs at ." ## ## 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 ' ' \ ## | grep -v '^MAIN_' \ ## | grep -v '^R_' \ ## | sort \ ## | uniq` ## to obtain the configure vars and hence create most of the above usage ## info as well as the list of accepted variables below automatically. ## if test $# = 0; then echo "${usage}" exit 1 fi if test "${R_OSTYPE}" = "windows"; then MAKE=make R_DOC_DIR=${R_HOME}/doc R_INCLUDE_DIR=${R_HOME}/include R_SHARE_DIR=${R_HOME}/share fi makefiles="-f ${R_HOME}/etc${R_ARCH}/Makeconf -f ${R_SHARE_DIR}/make/config.mk" ## avoid passing down -jN MAKEFLAGS= export MAKEFLAGS query="${MAKE} -s ${makefiles} print R_HOME=${R_HOME}" LIBR=`eval $query VAR=LIBR` STATIC_LIBR=`eval $query VAR=STATIC_LIBR` MAIN_LDFLAGS=`eval $query VAR=MAIN_LDFLAGS` LIBS=`eval $query VAR=LIBS` LDFLAGS=`eval $query VAR=LDFLAGS` if test -n "${R_ARCH}"; then includes="-I${R_INCLUDE_DIR} -I${R_INCLUDE_DIR}${R_ARCH}" else includes="-I${R_INCLUDE_DIR}" fi var= personal="yes" site="yes" all="no" 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 if test -z "${STATIC_LIBR}"; then echo "R was not built as a library" >&2 else echo "${includes}" fi else echo "${includes}" fi exit 0 ;; --ldflags) ## changed in R 3.1.0 to be those needed to link a front-end if test -z "${LIBR}"; then if test -z "${STATIC_LIBR}"; then echo "R was not built as a library" >&2 else echo "${MAIN_LDFLAGS} ${LDFLAGS} ${STATIC_LIBR}" fi else echo "${MAIN_LDFLAGS} ${LDFLAGS} ${LIBR} ${LIBS}" fi exit 0 ;; --no-user-files) personal="no" ;; --no-site-files) site="no" ;; --all) all="yes" ;; *) if test -z "${var}"; then var="${1}" else echo "ERROR: cannot query more than one variable" >&2 exit 1 fi ;; esac shift done ## quotes added in R 3.3.2 if test "${site}" = "yes"; then : ${R_MAKEVARS_SITE="${R_HOME}/etc${R_ARCH}/Makevars.site"} if test -f "${R_MAKEVARS_SITE}"; then makefiles="${makefiles} -f \"${R_MAKEVARS_SITE}\"" fi fi if test "${personal}" = "yes"; then if test "${R_OSTYPE}" = "windows"; then if test -f "${R_MAKEVARS_USER}"; then makefiles="${makefiles} -f \"${R_MAKEVARS_USER}\"" elif test ${R_ARCH} = "/x64" -a -f "${HOME}/.R/Makevars.win64"; then makefiles="${makefiles} -f \"${HOME}\"/.R/Makevars.win64" elif test -f "${HOME}/.R/Makevars.win"; then makefiles="${makefiles} -f \"${HOME}\"/.R/Makevars.win" elif test -f "${HOME}/.R/Makevars"; then makefiles="${makefiles} -f \"${HOME}\"/.R/Makevars" fi else . ${R_HOME}/etc${R_ARCH}/Renviron if test -f "${R_MAKEVARS_USER}"; then makefiles="${makefiles} -f \"${R_MAKEVARS_USER}\"" elif test -f "${HOME}/.R/Makevars-${R_PLATFORM}"; then makefiles="${makefiles} -f \"${HOME}\"/.R/Makevars-${R_PLATFORM}" elif test -f "${HOME}/.R/Makevars"; then makefiles="${makefiles} -f \"${HOME}\"/.R/Makevars" fi fi fi query="${MAKE} -s ${makefiles} print R_HOME=${R_HOME}" ok_c_vars="CC CFLAGS CPICFLAGS CPP CPPFLAGS" ok_cxx_vars="CXX CXXCPP CXXFLAGS CXXPICFLAGS CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS CXX14 CXX14STD CXX14FLAGS CXX14PICFLAGS CXX98 CXX98STD CXX98FLAGS CXX98PICFLAGS CXX17 CXX17STD CXX17FLAGS CXX17PICFLAGS CXX1X CXX1XSTD CXX1XFLAGS CXX1XPICFLAGS" ok_dylib_vars="DYLIB_EXT DYLIB_LD DYLIB_LDFLAGS" ok_objc_vars="OBJC OBJCFLAGS" ok_java_vars="JAVA JAVAC JAVAH JAR JAVA_HOME JAVA_LIBS JAVA_CPPFLAGS" ok_f77_vars="F77 FFLAGS FPICFLAGS FLIBS SAFE_FFLAGS FC FCFLAGS FCPICFLAGS" ok_ld_vars="LDFLAGS" ok_shlib_vars="SHLIB_CFLAGS SHLIB_CXXLD SHLIB_CXXLDFLAGS SHLIB_CXX98LD SHLIB_CXX98LDFLAGS SHLIB_CXX11LD SHLIB_CXX11LDFLAGS SHLIB_CXX14LD SHLIB_CXX14LDFLAGS SHLIB_CXX17LD SHLIB_CXX17LDFLAGS SHLIB_EXT SHLIB_FFLAGS SHLIB_LD SHLIB_LDFLAGS SHLIB_FCLD SHLIB_FCLDFLAGS SHLIB_CXX1XLD SHLIB_CXX1XLDFLAGS" ok_tcltk_vars="TCLTK_CPPFLAGS TCLTK_LIBS" ok_other_vars="BLAS_LIBS LAPACK_LIBS MAKE LIBnn LOCAL_SOFT COMPILED_BY" if test "${all}" = "yes"; then query="${MAKE} -s ${makefiles} print-name-and-value R_HOME=${R_HOME}" for v in ${ok_c_vars} ${ok_cxx_vars} ${ok_dylib_vars} ${ok_f77_vars} \ ${ok_objc_vars} ${ok_java_vars} \ ${ok_ld_vars} ${ok_shlib_vars} ${ok_tcltk_vars} \ ${ok_other_vars}; do eval "${query} VAR=${v}" done exit 0 fi ## Can we do this elegantly using case? var_ok=no for v in ${ok_c_vars} ${ok_cxx_vars} ${ok_dylib_vars} ${ok_f77_vars} \ ${ok_objc_vars} ${ok_java_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: ***