#!/bin/sh
#
# This file is part of msrtool.
#
# Copyright (c) 2008, 2009 Peter Stuge <peter@stuge.se>
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#

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

REV="`svnversion -c . 2>/dev/null | sed 's,.*:,,' 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}" 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
