### clibs.m4 -- extra macros for configuring R		-*- Autoconf -*-
###
### Copyright (C) 2004 R Core Team
###
### This file is part of R.
###
### R 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 of the License, or (at your
### option) any later version.
###
### R 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.
###
### You should have received a copy of the GNU General Public License
### along with R; if not, you can obtain it via the World Wide Web at
### along with R; if not, a copy is available at
### http://www.r-project.org/Licenses/

## modified version of AC_F77_LIBRARY_LDFLAGS for C libraries


# _R_PROG_C_V_OUTPUT([FLAG = $r_cv_prog_c_v])
# -------------------------------------------------
# Link a trivial Fortran program, compiling with a verbose output FLAG
# (whose default value, $r_cv_prog_c_v, is computed by
# _R_PROG_C_V), and return the output in $r_c_v_output.  This
# output is processed in the way expected by _AC_FC_LIBRARY_LDFLAGS,
# so that any link flags that are echoed by the compiler appear as
# space-separated items.
AC_DEFUN([_R_PROG_C_V_OUTPUT],
[AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])

# Compile and link our simple test program by passing a flag (argument
# 1 to this macro) to the Fortran compiler in order to get
# "verbose" output that we can then parse for the Fortran linker
# flags.
r_save_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS m4_default([$1], [$r_cv_prog_c_v])"
(eval echo $as_me:__oline__: \"$ac_link\") >&AS_MESSAGE_LOG_FD
r_c_v_output=`eval $ac_link AS_MESSAGE_LOG_FD>&1 2>&1 | grep -v 'Driving:'`
echo "$r_c_v_output" >&AS_MESSAGE_LOG_FD
CFLAGS=$r_save_CFLAGS

rm -rf conftest*

# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where
# /foo, /bar, and /baz are search directories for the Fortran linker.
# Here, we change these into -L/foo -L/bar -L/baz (and put it first):
r_c_v_output="`echo $r_c_v_output |
	grep 'LPATH is:' |
	sed 's,.*LPATH is\(: *[[^ ]]*\).*,\1,;s,: */, -L/,g'` $r_c_v_output"

case $r_c_v_output in
  # If we are using xlc then replace all the commas with spaces.
  *xlcentry*)
    r_c_v_output=`echo $r_c_v_output | sed 's/,/ /g'` ;;

  # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted
  # $LIBS confuse us, and the libraries appear later in the output anyway).
  *mGLOB_options_string*)
    r_c_v_output=`echo $r_c_v_output | sed 's/\"-mGLOB[[^\"]]*\"/ /g'` ;;
esac

])# _R_PROG_C_V_OUTPUT


# _R_PROG_C_V
# --------------
#
# Determine the flag that causes the Fortran compiler to print
# information of library and object files (normally -v)
# Needed for _AC_FC_LIBRARY_FLAGS
# Some compilers don't accept -v (Lahey: -verbose, xlf: -V, Fujitsu: -###)
AC_DEFUN([_R_PROG_C_V],
[AC_CACHE_CHECK([how to get verbose linking output from ${CC}],
                [r_cv_prog_c_v],
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
[r_cv_prog_c_v=
# Try some options frequently used verbose output
for r_verb in -v -verbose --verbose -V -\#\#\#; do
  _R_PROG_C_V_OUTPUT($r_verb)
  # look for -l* and *.a constructs in the output
  for r_arg in $r_c_v_output; do
     case $r_arg in
        [[\\/]]*.a | ?:[[\\/]]*.a | -[[lLRu]]*)
          r_cv_prog_c_v=$r_verb
          break 2 ;;
     esac
  done
done
if test -z "$r_cv_prog_c_v"; then
   AC_MSG_WARN([cannot determine how to obtain linking information from ${CC}])
fi],
                  [AC_MSG_WARN([compilation failed])])
])])# _R_PROG_C_V


# _R_C_LIBRARY_LDFLAGS
# ----------------------
#
# Determine the linker flags (e.g. "-L" and "-l") for the C
# intrinsic and run-time libraries that are required to successfully
# link a C program or shared library.  The output variable
# CLIBS is set to these flags.
#
# This macro is intended to be used in those situations when it is
# necessary to mix, e.g. C++ and Fortran, source code into a single
# program or shared library.
#
# For example, if object files from a C++ and Fortran compiler must
# be linked together, then the C++ compiler/linker must be used for
# linking (since special C++-ish things need to happen at link time
# like calling global constructors, instantiating templates, enabling
# exception support, etc.).
#
# This macro was packaged in its current form by Matthew D. Langston.
# However, nearly all of this macro came from the "OCTAVE_FLIBS" macro
# in "octave-2.0.13/aclocal.m4", and full credit should go to John
# W. Eaton for writing this extremely useful macro.  Thank you John.
AC_DEFUN([_R_C_LIBRARY_LDFLAGS],
[_R_PROG_C_V
AC_CACHE_CHECK([for C libraries of ${CC}], r_cv_c_libs,
[if test "x$CLIBS" != "x"; then
  r_cv_c_libs="$CLIBS" # Let the user override the test.
else

_R_PROG_C_V_OUTPUT

r_cv_c_libs=

# Save positional arguments (if any)
r_save_positional="$[@]"

set X $r_c_v_output
while test $[@%:@] != 1; do
  shift
  r_arg=$[1]
  case $r_arg in
        [[\\/]]*.a | ?:[[\\/]]*.a)
          _AC_LIST_MEMBER_IF($r_arg, $r_cv_c_libs, ,
              r_cv_c_libs="$r_cv_c_libs $r_arg")
          ;;
        -bI:*)
          _AC_LIST_MEMBER_IF($r_arg, $r_cv_c_libs, ,
             [_AC_LINKER_OPTION([$r_arg], r_cv_c_libs)])
          ;;
          # Ignore these flags.
        -lang* | -lcrt[[01]].o | -lcrtbegin.o | -lc | -lgcc | -libmil | -LANG:=*)
          ;;
        -lkernel32)
          test x"$CYGWIN" != xyes && r_cv_c_libs="$r_cv_c_libs $r_arg"
          ;;
        -[[LRuY]])
          # These flags, when seen by themselves, take an argument.
          # We remove the space between option and argument and re-iterate
          # unless we find an empty arg or a new option (starting with -)
	  case $[2] in
	     "" | -*);;
	     *)
		r_arg="$r_arg$[2]"
		shift; shift
		set X $r_arg "$[@]"
		;;
	  esac
          ;;
        -YP,*)
          for r_j in `echo $r_arg | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do
            _AC_LIST_MEMBER_IF($r_j, $r_cv_c_libs, ,
                               [r_arg="$r_arg $r_j"
                               r_cv_c_libs="$r_cv_c_libs $r_j"])
          done
          ;;
        -[[lLR]]*)
          _AC_LIST_MEMBER_IF($r_arg, $r_cv_c_libs, ,
                             r_cv_c_libs="$r_cv_c_libs $r_arg")
          ;;
          # Ignore everything else.
  esac
done
# restore positional arguments
set X $r_save_positional; shift

# We only consider "LD_RUN_PATH" on Solaris systems.  If this is seen,
# then we insist that the "run path" must be an absolute path (i.e. it
# must begin with a "/").
case `(uname -sr) 2>/dev/null` in
   "SunOS 5"*)
      r_ld_run_path=`echo $r_c_v_output |
                        sed -n 's,^.*LD_RUN_PATH *= *\(/[[^ ]]*\).*$,-R\1,p'`
      test "x$r_ld_run_path" != x &&
        _AC_LINKER_OPTION([$r_ld_run_path], r_cv_c_libs)
      ;;
esac
fi # test "x$CLIBS" = "x"
])
CLIBS=
for arg in $r_cv_c_libs; do
  case "${arg}" in
    -L*)
      CLIBS="${CLIBS} $arg"
      ;;
  esac
done
])# _R_C_LIBRARY_LDFLAGS


# R_C_LIBRARY_LDFLAGS
# -------------------
AC_DEFUN([R_C_LIBRARY_LDFLAGS],
[AC_REQUIRE([AC_PROG_CC])dnl
AC_LANG_PUSH(C)dnl
_R_C_LIBRARY_LDFLAGS
AC_LANG_POP(C)dnl
])# R_C_LIBRARY_LDFLAGS

