#!/bin/sh

##
##  Copyright 2003-2004  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.

APREQ_DOTTED_VERSION="@APREQ_DOTTED_VERSION@"

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

LIBS="@APREQ_EXPORT_LIBS@"
INCLUDES="@APREQ_INCLUDES@"
LDFLAGS="@APREQ_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 libapreq2 library version as a dotted triple
  --package-version print the version of the distribution
  --package-name    print the distribution file's name
  --package-title   print the full name of the release
  --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/src/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
    ;;
    --package-name)
    echo "@PACKAGE@-@VERSION@.tar.gz"
    exit 0
    ;;
    --package-title)
    echo "@PACKAGE_STRING@"
    exit 0
    ;;
    --package-version)
    echo "@VERSION@"
    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/src"
    else
        # this is for VPATH builds
        flags="$thisdir/include $APREQ_SOURCE_DIR/src"
    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/src $INCLUDES"
    else
        # this is for VPATH builds
        flags="$flags -I$thisdir/include -I$APREQ_SOURCE_DIR/src $INCLUDES"
    fi
    ;;
    --ldflags)
    flags="$flags $LDFLAGS"
    ;;
    --srcdir)
    echo $APREQ_SOURCE_DIR
    exit 0
    ;;
    --library-version)
    echo $APREQ_DOTTED_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/src -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"
    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
