#!/bin/sh
# Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This file is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


prefix=@prefix@
exec_prefix=@exec_prefix@
includedir=@includedir@
libdir=@libdir@
isubdirafter="@GPG_ERROR_CONFIG_ISUBDIRAFTER@"

output=""

usage()
{
    cat <<EOF
Usage: gpg-error-config [OPTIONS]
Options:
	[--prefix]
	[--exec-prefix]
	[--version]
	[--libs]
	[--cflags]
EOF
    exit $1
}

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

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

    case $1 in
        --prefix)
	    output="$output $prefix"
	    ;;
        --exec-prefix)
	    output="$output $exec_prefix"
	    ;;
        --version)
            echo "@VERSION@"
	    exit 0
	    ;;
        --cflags)
	    if test "x$includedir" != "x/usr/include" -a "x$includedir" != "x/include"; then
		output="$output -I$includedir"
	    fi
            # Note: -idirafter is a gcc extension.  It is only used on
            #       systems where gcc is the only compiler we support.
            for i in $isubdirafter; do
                output="$output -idirafter ${includedir}/${i}"
            done
	    output="$output @GPG_ERROR_CONFIG_CFLAGS@"
	    ;;
	--libs)
	    if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/lib"; then
		output="$output -L$libdir"
	    fi
	    output="$output @GPG_ERROR_CONFIG_LIBS@"
	    ;;
	*)
            usage 1 1>&2
	    ;;
    esac
    shift
done

echo $output
