#!/bin/sh

##
##  Copyright 2003-2006  The Apache Software Foundation
##
##  Licensed under the Apache License, Version 2.0 (the "License");
##  you may not use this file except in compliance with the License.
##  You may obtain a copy of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
##  Unless required by applicable law or agreed to in writing, software
##  distributed under the License is distributed on an "AS IS" BASIS,
##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
##  See the License for the specific language governing permissions and
##  limitations under the License.
##

# apreq2-config- based on apu-config:
# APR-util script designed to allow easy command line access to APR-util
# configuration parameters.

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

LIBS="@APR_LIBS@"
LDFLAGS="@APR_LDFLAGS@"
INCLUDES="@APR_INCLUDES@"
LDFLAGS="@APR_LDFLAGS@"

APREQ_LIBNAME="@APREQ_LIBNAME@"

APREQ_SOURCE_DIR="@abs_srcdir@"
APREQ_BUILD_DIR="@abs_builddir@"

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

Known values for OPTION are:
  --prefix[=DIR]    change prefix to DIR
  --bindir          print location where binaries are installed
  --includes        print include information
  --includedir      print location where headers are installed
  --ldflags         print linker flags
  --libs            print library information
  --srcdir          print apreq2 source directory
  --link-ld         print link switch(es) for linking to libapreq2
  --link-libtool    print the libtool inputs for linking to libapreq2
  --la-file         print the path to the library's .la file, if available
  --library-version print the API version as a dotted triple
  --libtool-version print the ABI version in a libtool-compatible format
  --package-version print the version number of the distribution
  --help            print this help

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

An application should use the results of --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 we have the realpath program, use it to resolve symlinks.
# Otherwise, being in a symlinked dir may result in incorrect output.
if test -x "`which realpath 2>/dev/null`"; then
    thisdir="`realpath $thisdir`"
    if test -d "$APREQ_SOURCE_DIR"; then
        APREQ_SOURCE_DIR="`realpath $APREQ_SOURCE_DIR`"
    fi
    if test -n "$tmpbindir"; then
        tmpbindir="`realpath $tmpbindir`"
    fi
fi
if test "$tmpbindir" = "$thisdir"; then
    location=installed
elif test "$APREQ_SOURCE_DIR" = "$thisdir"; then
    location=source
else
    location=build
fi


if test "$location" = "installed"; then
    LA_FILE="$libdir/lib${APREQ_LIBNAME}.la"
else
    LA_FILE="$thisdir/library/lib${APREQ_LIBNAME}.la"
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
    ;;
    --bindir)
    echo $bindir
    exit 0
    ;;
    --libs)
    flags="$flags $LIBS"
    ;;
    --includedir)
    if test "$location" = "installed"; then
        flags="$includedir"
    elif test "$location" = "source"; then
        flags="$APREQ_SOURCE_DIR/include"
    else
        # this is for VPATH builds
        flags="$thisdir/include $APREQ_SOURCE_DIR/include"
    fi
    echo $flags
    exit 0
    ;;
    --includes)
    if test "$location" = "installed"; then
        flags="$flags -I$includedir $INCLUDES"
    elif test "$location" = "source"; then
        flags="$flags -I$APREQ_SOURCE_DIR/include $INCLUDES"
    else
        # this is for VPATH builds
        flags="$flags -I$thisdir/include -I$APREQ_SOURCE_DIR/include $INCLUDES"
    fi
    ;;
    --ldflags)
    flags="$flags $LDFLAGS"
    ;;
    --srcdir)
    echo $APREQ_SOURCE_DIR
    exit 0
    ;;
    --library-version)
    echo @APREQ_DOTTED_VERSION@
    exit 0
    ;;
    --libtool-version)
    echo @APREQ_LIBTOOL_VERSION@
    exit 0
    ;;
    --package-version)
    echo "@VERSION@"
    exit 0
    ;;
    --link-ld)
    if test "$location" = "installed"; then
        ### avoid using -L if libdir is a "standard" location like /usr/lib
        flags="$flags -L$libdir -l$APREQ_LIBNAME"
    else
        flags="$flags -L$thisdir/library/.libs -l$APREQ_LIBNAME"
    fi
    ;;
    --link-libtool)
    # If the LA_FILE exists where we think it should be, use it.  If we're
    # installed and the LA_FILE does not exist, assume to use -L/-l
    # (the LA_FILE may not have been installed).  If we're building ourselves,
    # we'll assume that at some point the .la file be created.
    if test -f "$LA_FILE"; then
        flags="$flags $LA_FILE"
    elif test "$location" = "installed"; then
        ### avoid using -L if libdir is a "standard" location like /usr/lib
        flags="$flags -L$libdir -l$APREQ_LIBNAME $apreq_libs"
    else
        flags="$flags $LA_FILE"
    fi
    ;;
    --la-file)
    if test -f "$LA_FILE"; then
        flags="$flags $LA_FILE"
    fi
    ;;
    --help)
    show_usage
    exit 0
    ;;
    *)
    show_usage
    exit 1
    ;;
    esac

    # Next please.
    shift
done

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

exit 0
