#!/bin/sh
######################################################################
# Project Configuration						     #
######################################################################

pkg_name="snownews"
pkg_verstr="v1.9"
pkg_bugreport="Mike Sharov <msharov@users.sourceforge.net>"

# Files that get created by this script
files="Config.mk config.h"

# Package options
components="
{
name=[with-debug]
desc=[	Compile for debugging]
seds=[s/^#\(debug\)/\1/]
}{
name=[with-native]
desc=[	Use -march=native]
seds=[s/ -std=c/ -march=native -std=c/]
}{
name=[without-nls]
desc=[	Disable translations]
seds=[s/^#define \(LOCALEPATH\)/#undef \1 \/\/ /;s/^\(localedir\)/#\1/;s/ -lintl//]
}{
name=[with-experimental]
desc=[Enable experimental code]
seds=[s/^#undef \(USE_UNSUPPORTED_AND_BROKEN_CODE\)/#define \1/]
}";

# First pair is used if nothing matches
progs="CC=gcc CC=clang CC=cc INSTALL=install MSGFMT=msgfmt"

# Libs found using pkg-config
pkgs="libcurl libxml-2.0 libcrypto ncursesw"
# Default pkg flags to substitute when pkg-config is not found
pkg_libs="-lcurl -lxml2 -lcrypto -lncursesw"
pkg_cflags="-I\/usr\/include\/libxml2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600"
pkg_ldflags=""

# Automatic vars
if [ -d .git ]; then
    pkg_vverstr=$(git describe --always)
    [ -z "$pkg_vverstr" ] || pkg_verstr=$pkg_vverstr
fi
pkg_major=$(expr "$pkg_verstr" : 'v\([0-9]*\)')
pkg_minor=$(expr "$pkg_verstr" : 'v[0-9]*\.\([0-9]*\)')
pkg_string="$pkg_name $pkg_verstr"

# Miscellaneous substitutions
custsubs="s/@pkg_name@/$pkg_name/g
s/@pkg_version@/0x$pkg_major$pkg_minor/g
s/@pkg_verstr@/$pkg_verstr/g
s/@pkg_string@/$pkg_string/g
s/@pkg_uname@/$(echo $pkg_name|tr a-z A-Z)/g
s/@pkg_bugreport@/$pkg_bugreport/g
s/@pkg_major@/$pkg_major/g
s/@pkg_minor@/$pkg_minor/g"

######################################################################
# The rest of the file is configuration code. Leave it alone.	     #
######################################################################

die() { rm -f config.sed; exit; }
sub() { printf "%s\n" "$1">>config.sed; }
escpath() { echo "$@" | sed 's/\//\\\//g'; }

#### Set host-dependent options ######################################

SYSNAME=$(uname|tr A-Z a-z)
case "$SYSNAME" in
    *solaris*| *sun*)	SYSNAME="sun";;
    *darwin*| *osx*)	SYSNAME="mac";;
    *bsd*)		SYSNAME="bsd";;
    *cygwin*)		SYSNAME="cygwin";;
esac

sub "s/^#undef \(OS\)/#define \1 \"$SYSNAME\"/"
if [ "$SYSNAME" = "sun" ]; then
    sub "s/^#undef \(SUN\)/#define \1 1/"
fi

#### Printing helper functions #######################################

print_components() {
    local cc name desc
    cc=$components
    echo "Options:"
    while [ -n "$cc" ]; do
	name=$(expr "$cc" : '[^}]*name=\[\([^]]*\)\]')
	desc=$(expr "$cc" : '[^}]*desc=\[\([^]]*\)\]')
	echo "  --$name	$desc"
	cc=$(expr "$cc" : '[^}]*}\(.*\)')
    done
    echo
}

print_help() {
    echo "This program configures $pkg_string build system.

Usage: configure [option]...

Configuration:
  -h, --help		display this help and exit
  -V, --version		display version information and exit

Installation directories:
  --prefix=dir		architecture-independent files [/usr/local]
  --datadir=dir		architecture-independent data dir [prefix/share]
  --mandir=dir		manual pages [datadir/man]
  --localedir=dir	localization files [datadir/locale]
  --builddir=dir	location for compiled objects [\$TMPDIR/make]
"
    print_components
    echo "Report bugs to $pkg_bugreport."
}

print_version() {
    echo "$pkg_name $pkg_verstr configure"
}

sub_var() {
    local esc2
    esc2=$(escpath $2)
    eval ac_var_$1='$esc2';
    sub "s/@$1@/$esc2/g"
}

sub_comp() {
    local cc name seds
    cc=$components
    while [ -n "$cc" ]; do
       name=$(expr "$cc" : '[^}]*name=\[\([^]]*\)\]')
       seds=$(expr "$cc" : '[^}]*seds=\[\([^]]*\)\]')
       [ "$name" = "$1" ] && sub "$seds"
       cc=$(expr "$cc" : '[^}]*}\(.*\)')
    done
}

for i in "$@"; do
    case "$i" in
	--)		break;;
	--version |-V)	print_version && die;;
	--help |-h |-?)	print_help && die;;
	--*=*)		sub_var $(expr "$i" : '--\([^=]*\)=') "$(expr "$i" : '[^=]*=\(.*\)')";;
	--*)		sub_comp "$(expr "$i" : '--\(.*\)')";;
	*)		echo "Error: unrecognized option \"$i\"" && die;;
    esac
done

#### Set directory prefixes ##########################################

sub "s/@prefix@/${ac_var_prefix:=\/usr\/local}/g
s/@bindir@/${ac_var_bindir:=\$\{prefix\}\/bin}/g
s/@datadir@/${ac_var_datadir:=\$\{prefix\}\/share}/g
s/@mandir@/${ac_var_mandir:=\$\{datadir\}\/man}/g
s/@man1dir@/${ac_var_man1dir:=\$\{mandir\}\/man1}/g
s/@localedir@/${ac_var_localedir:=\$\{datadir\}\/locale}/g
s/@localepath@/${ac_var_prefix}\/share\/locale/g
s/@TMPDIR@/$(escpath ${TMPDIR:-/tmp})/g
s/@builddir@/\$\{TMPDIR\}\/make/g"

#### Find programs and libs ##########################################

# Programs found using which
for i in $progs; do
    pname=$(expr $i : '\([^=]*\)')
    pcall=$(expr $i : '[^=]*=\([^=]*\)')
    ppath=$(escpath $(eval echo \$\{$pname\}))
    # First check if an environment variable is set
    [ -n "$ppath" ] && sub "s/@$pname@/$ppath/g"
    # Check if the program exists
    ppath=$(which $pcall 2>/dev/null)
    [ -n "$ppath" ] && [ -x "$ppath" ] && sub "s/@$pname@/$pcall/g"
done
# If nothing found in first loop, set the first pair anyway
for i in $progs; do
    pname=$(expr $i : '\([^=]*\)')
    pcall=$(expr $i : '[^=]*=\([^=]*\)')
    sub "s/@$pname@/$pcall/g"
done

# Packages found using pkg-config
pkgconfig=$(which pkg-config 2>/dev/null)
if [ -n "$pkgconfig" ] && [ -x "$pkgconfig" ]; then
    faildeps=""
    for i in $pkgs; do
        $pkgconfig --exists "$i" || faildeps="$i $faildeps"
    done
    if [ -n "$faildeps" ]; then
	echo "Error: missing required packages: $faildeps"; die
    fi
    pkg_cflags=$(escpath $($pkgconfig --cflags $pkgs))
    pkg_libs=$(escpath $($pkgconfig --libs-only-l $pkgs))
    pkg_ldflags=$(escpath $($pkgconfig --libs-only-L --libs-only-other $pkgs))
fi
sub "s/@pkg_cflags@/$pkg_cflags/"
sub "s/@pkg_libs@/$pkg_libs/"
sub "s/@pkg_ldflags@/$pkg_ldflags/"

sub "$custsubs"

#### Apply substitutions to all files ################################

for i in $files; do
    sed -f config.sed $i.in > $i
done

touch config.status
echo "#!/bin/sh
$0 $@
$(tail -n+3 config.status)" > config.status.new
chmod u+x config.status.new
mv config.status.new config.status

die
