#!/bin/sh
#
# CUPS configuration utility.
#
# Copyright © 2007-2019 by Apple Inc.
# Copyright © 2001-2006 by Easy Software Products, all rights reserved.
#
# Licensed under Apache License v2.0.  See the file "LICENSE" for more
# information.
#

VERSION="@CUPS_VERSION@"
APIVERSION="2.3"
BUILD="@CUPS_BUILD@"

prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
includedir=@includedir@
libdir=@libdir@
datarootdir=@datadir@
datadir=@datadir@
sysconfdir=@sysconfdir@
cups_datadir=@CUPS_DATADIR@
cups_serverbin=@CUPS_SERVERBIN@
cups_serverroot=@CUPS_SERVERROOT@
INSTALLSTATIC=@INSTALLSTATIC@

# flags for compiler and linker...
CFLAGS=""
LDFLAGS="@EXPORT_LDFLAGS@"
LIBS="@LIBGSSAPI@ @DNSSDLIBS@ @EXPORT_SSLLIBS@ @LIBZ@ @LIBS@"

# Check for local invocation...
selfdir=`dirname $0`

if test -f "$selfdir/cups/cups.h"; then
    CFLAGS="-I$selfdir"
    LDFLAGS="-L$selfdir/cups $LDFLAGS"
    libdir="$selfdir/cups"
else
    if test $includedir != /usr/include; then
	CFLAGS="$CFLAGS -I$includedir"
    fi

    if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib64; then
	LDFLAGS="$LDFLAGS -L$libdir"
    fi
fi


usage ()
{
    echo "Usage: cups-config --api-version"
    echo "       cups-config --build"
    echo "       cups-config --cflags"
    echo "       cups-config --datadir"
    echo "       cups-config --help"
    echo "       cups-config --ldflags"
    echo "       cups-config [--image] [--static] --libs"
    echo "       cups-config --serverbin"
    echo "       cups-config --serverroot"
    echo "       cups-config --version"

    exit $1
}

if test $# -eq 0; then
    usage 1
fi

# Parse command line options
static=no

while test $# -gt 0; do
    case $1 in
	--api-version)
	    echo $APIVERSION
	    ;;
	--build)
	    echo $BUILD
	    ;;
	--cflags)
	    echo $CFLAGS
	    ;;
	--datadir)
	    echo $cups_datadir
	    ;;
	--help)
	    usage 0
	    ;;
	--image)
	    # Do nothing
	    ;;
	--ldflags)
	    echo $LDFLAGS
	    ;;
	--libs)
	    if test $static = no; then
	        libs="@EXTLINKCUPS@";
	    else
	        libs="$libdir/libcups.a $LIBS";
	    fi
	    echo $libs
	    ;;
	--serverbin)
	    echo $cups_serverbin
	    ;;
	--serverroot)
	    echo $cups_serverroot
	    ;;
	--static)
	    if test -z "$INSTALLSTATIC"; then
	        echo "WARNING: Static libraries not installed." >&2
	    else
	        static=yes
	    fi
	    ;;
	--version)
	    echo $VERSION
	    ;;
	*)
	    usage 1
	    ;;
    esac

    shift
done
