#!/usr/bin/env sh
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#

# If this is left unset, try to set the version string from the highest
# revision number of the checked out files.
VERSION=""

REV="`git describe --always 2>/dev/null`"
VERSION="${VERSION:-$REV}"

findprog() {
	NPARMS=$#
	WHAT="${1}"
	shift
	FROMENV="${1}"
	shift
	printf "searching for ${WHAT} (${*})..." 1>&2
	test -n "${FROMENV}" && {
		echo "  using environment: ${FROMENV}" 1>&2
		echo "${FROMENV}"
		exit 0
	}
	i=2
	while test $i -lt $NPARMS; do
		test -z "${1}" && {
			shift
			i=$(($i+1))
			continue
		}
		FILE="`which "${1}" 2>/dev/null`"
		test $? -eq 0 && {
			echo "${1}"
			break
		}
		shift
		i=$(($i+1))
	done
	test -z "${1}" && {
		echo "  not found!" 1>&2
		echo 1>&2
		echo "This is a fatal error, configure is exiting!" 1>&2
		exit 1
	}
	echo "  using ${FILE} in PATH" 1>&2
	exit 0
}

trycompile() {
	NPARMS=$#
	WHAT="${1}"
	shift
	printf "finding CFLAGS for ${WHAT}... " 1>&2
	OUT="${OUT}\n${CC} ${CFLAGS} -o .config.o -c .config.c"
	OUT="${OUT}\n`echo "${CC} ${CFLAGS} -o .config.o -c .config.c"|sh 2>&1`"
	test $? -eq 0 && {
		echo " using: ${CFLAGS}" 1>&2
		echo "${CFLAGS}"
		exit 0
	}
	i=1
	while test $i -lt $NPARMS; do
		OUT="${OUT}\n${CC} ${CFLAGS} ${1} -o .config.o -c .config.c 2>&1"
		OUT="${OUT}\n`echo "${CC} ${CFLAGS} ${1} -o .config.o -c .config.c"|sh 2>&1`"
		test $? -eq 0 && {
			echo " using: ${CFLAGS} ${1}" 1>&2
			echo "${CFLAGS} ${1}"
			exit 0
		}
		shift
		i=$(($i+1))
	done
	echo "failed!" 1>&2
	echo 1>&2
	printf "The following compiler commands were executed:" 1>&2
	echo -e "${OUT}\n" 1>&2
	echo "This is a fatal error, configure is exiting!" 1>&2
	echo 1>&2
	echo "You can try to fix this by manually setting CFLAGS in the environment before" 1>&2
	echo "running configure. E.g.:" 1>&2
	echo "CFLAGS=-I/opt/somedir/include ./configure" 1>&2
	echo 1>&2
	exit 1
}

trylink() {
	NPARMS=$#
	WHAT="${1}"
	shift
	printf "finding LDFLAGS for ${WHAT}... " 1>&2
	OUT="${OUT}\n${CC} -o .config .config.o ${LDFLAGS} 2>&1"
	OUT="${OUT}\n`echo "${CC} -o .config .config.o ${LDFLAGS}"|sh 2>&1`"
	test $? -eq 0 && {
		echo " using: ${LDFLAGS}" 1>&2
		echo "${LDFLAGS}"
		exit 0
	}
	i=1
	while test $i -lt $NPARMS; do
		OUT="${OUT}\n${CC} -o .config .config.o ${LDFLAGS} ${1} 2>&1"
		OUT="${OUT}\n`echo "${CC} -o .config .config.o ${LDFLAGS} ${1}"|sh 2>&1`"
		test $? -eq 0 && {
			echo " using: ${LDFLAGS} ${1}" 1>&2
			echo "${LDFLAGS} ${1}"
			exit 0
		}
		shift
		i=$(($i+1))
	done
	echo "failed!" 1>&2
	echo 1>&2
	printf "The following linker commands were executed:" 1>&2
	echo -e "${OUT}\n" 1>&2
	echo "This is a fatal error, configure is exiting!" 1>&2
	echo 1>&2
	echo "You can try to fix this by manually setting LDFLAGS in the environment before" 1>&2
	echo "running configure. E.g.:" 1>&2
	echo "LDFLAGS=-L/opt/somedir/lib ./configure" 1>&2
	echo 1>&2
	exit 1
}

CC=`findprog "compiler" "${CC}" clang gcc cc icc` || exit
INSTALL=`findprog "install" "${INSTALL}" install ginstall` || exit

test -n "$DEBUG" && myCFLAGS="-O2 -g" || myCFLAGS="-Os"
CFLAGS="${CFLAGS} ${myCFLAGS} -Wall -Werror"

cat > .config.c << EOF
#include <pci/pci.h>
struct pci_access *pacc;
int main(int argc, char *argv[])
{ pacc = pci_alloc(); return 0; }
EOF

pc_CFLAGS="`pkg-config libpci --cflags 2>/dev/null`"
pc_LDFLAGS="`pkg-config libpci --libs 2>/dev/null`"
CFLAGS=`trycompile "libpci (from pciutils)" "${pc_CFLAGS}" "-I/usr/local/include"` || {
	rm -f .config.c
	exit 1
}
LDFLAGS=`trylink "libpci (from pciutils)" "${pc_LDFLAGS}" "-lpci -lz" "-L/usr/local/lib -lpci -lz" "-framework DirectHW -lpci -lz"` || {
	rm -f .config.c .config.o
	exit 1
}
rm -f .config.c .config.o .config

PREFIX="${PREFIX:-/usr/local}"

echo
echo "configured using the following settings:"
echo
echo "VERSION=${VERSION}"
echo "CC=${CC}"
echo "CFLAGS=${CFLAGS}"
echo "LDFLAGS=${LDFLAGS}"
echo "INSTALL=${INSTALL}"
echo "PREFIX=${PREFIX}"
echo
printf "creating Makefile..."
echo "# This file was automatically generated by configure" > Makefile
sed -e "s#@VERSION@#${VERSION}#g" \
	-e "s#@CC@#${CC}#g" \
	-e "s#@CFLAGS@#${CFLAGS}#g" \
	-e "s#@LDFLAGS@#${LDFLAGS}#g" \
	-e "s#@INSTALL@#${INSTALL}#g" \
	-e "s#@PREFIX@#${PREFIX}#g" \
	Makefile.in >> Makefile
echo "  done"
echo
