#!/bin/sh
# ====================================================================
# Copyright (c) 2000-2003 CollabNet.  All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution.  The terms
# are also available at http://subversion.tigris.org/license-1.html.
# If newer versions of this license are posted there, you may use a
# newer version instead, at your option.
#
# This software consists of voluntary contributions made by many
# individuals.  For exact contribution history, see the revision
# history and logs, available at http://subversion.tigris.org/.
# ====================================================================

# SVN script designed to allow easy command line access to SVN
# configuration parameters.

prefix="@prefix@"
exec_prefix="@exec_prefix@"
bindir="@bindir@"
libdir="@libdir@"
includedir="@includedir@"

LIBS="@NEON_LIBS@ @SVN_APRUTIL_EXPORT_LIBS@ @SVN_APR_EXPORT_LIBS@ @SVN_DB_LIBS@ @LIBS@"
CFLAGS="@CFLAGS@"
CPPFLAGS="@CPPFLAGS@"
INCLUDES="@SVN_NEON_INCLUDES@ @SVN_DB_INCLUDES@ @SVN_APR_INCLUDES@ @SVN_APRUTIL_INCLUDES@"
LDFLAGS="@LDFLAGS@"

SVN_SOURCE_DIR="@abs_srcdir@"
SVN_BUILD_DIR="@abs_builddir@"

show_usage()
{
    cat << EOF
Usage: svn-config [OPTION]

Known values for OPTION are:
  --prefix[=DIR]    change prefix to DIR
  --cflags          print C compiler flags
  --cppflags        print cpp flags
  --includes        print include information
  --ldflags         print linker flags
  --libs            print library information
  --srcdir          print SVN source directory
  --link-ld         [NOT IMPL] print link switch(es) for linking to SVN
  --link-libtool    [NOT IMPL] print the libtool inputs for linking to SVN
  --help            print this help

When linking with libtool, an application should do something like:
  SVN_LIBS="\`svn-config --link-libtool --libs\`"
or when linking directly:
  SVN_LIBS="\`svn-config --link-ld --libs\`"

An application should use the results of --cflags, --cppflags, --includes,
and --ldflags in their build process.
EOF
}

if test $# -eq 0; then
    show_usage
    exit 1
fi

thisdir="`dirname $0`"
thisdir="`cd $thisdir && pwd`"
if test -d $bindir; then
  tmpbindir="`cd $bindir && pwd`"
else
  tmpbindir=""
fi
if test "$tmpbindir" = "$thisdir"; then
  location=installed
elif test "$SVN_SOURCE_DIR" = "$thisdir"; then
  location=source
else
  location=build
fi

flags=""

while test $# -gt 0; do
    # Normalize the prefix.
    case "$1" in
    -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
    *) optarg= ;;
    esac

    case "$1" in
    # It is possible for the user to override our prefix.
    --prefix=*)
    prefix=$optarg
    ;;
    --prefix)
    echo $prefix
    exit 0
    ;;
    --cflags)
    flags="$flags $CFLAGS"
    ;;
    --cppflags)
    flags="$flags $CPPFLAGS"
    ;;
    --libs)
    flags="$flags $LIBS"
    ;;
    --includes)
    if test "$location" = "installed"; then
        flags="$flags -I$includedir/subversion-1 $INCLUDES"
    elif test "$location" = "source"; then
        flags="$flags -I$SVN_SOURCE_DIR/include $INCLUDES"
    else
        flags="$flags -I$thisdir/include -I$SVN_SOURCE_DIR/include $INCLUDES"
    fi
    ;;
    --ldflags)
    flags="$flags $LDFLAGS"
    ;;
    --srcdir)
    echo $SVN_SOURCE_DIR
    exit 0
    ;;
    --help)
    show_usage
    exit 0
    ;;
    *)
    show_usage
    exit 1
    ;;
    esac

    # Next please.
    shift
done

if test -n "$flags"; then
  echo "$flags"
fi

exit 0
