#! /bin/sh
#
# opkhelper
# configure
# Configuration script to generate Makefile.
#
# Copyright (C) 2012 Patrick "P. J." McDermott
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# 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, see <http://www.gnu.org/licenses/>.

package_name='opkhelper'
package_version='3.0.0-beta1'
package_description='OPK Build Helper Tools'
package_library='libopkhelper.3.0'

srcdir="$(cd "${0%/*}" && pwd)"
prefix='/usr/local'
bindir='${prefix}/bin'
libdir='${prefix}/share'
pkglibdir='${libdir}/${package_library}'
libopkhelper='${pkglibdir}'
datadir='${prefix}/share'
mandir='${datadir}/man'
man1dir='${mandir}/man1'
localedir='${datadir}/locale'
multiarch_libdir='false'

quiet='false'
missing_deps='false'
dep_cmds='
sh
make
'
dep_libs='
libopkbuild.1
archtab
'

long_opts_with_args='
srcdir
prefix
bindir
libdir
pkglibdir
datadir
mandir
man1dir
localedir
'

features="
${dep_cmds}
${dep_libs}
${opt_dep_cmds}
${opt_dep_libs}
multiarch-libdir
"

subst_vars="
package_name
package_version
package_description
package_library
${long_opts_with_args}
libopkhelper
${features}
"

main()
{
	parse_options "${@}"
	shift ${optind}
	if [ ${#} -ne 0 ]; then
		print_usage
		exit
	fi

	for dep in ${dep_cmds}; do
		dep_name="$(printf '%s' "${dep}" | tr -c '[a-z0-9]' '_')"
		dep_val="$(eval echo \$\{"${dep_name}"\})"
		if [ -z "${dep_val}" ]; then
			find_dep_cmd "${dep}" || missing_deps='true'
		fi
	done
	for dep in ${dep_libs}; do
		dep_name="$(printf '%s' "${dep}" | tr -c '[a-z0-9]' '_')"
		dep_val="$(eval echo \$\{"${dep_name}"\})"
		if [ -z "${dep_val}" ]; then
			find_dep_lib "${dep}" || missing_deps='true'
		fi
	done
	for dep in ${opt_dep_cmds}; do
		dep_name="$(printf '%s' "${dep}" | tr -c '[a-z0-9]' '_')"
		dep_val="$(eval echo \$\{"${dep_name}"\})"
		if [ -z "${dep_val}" ]; then
			find_dep_cmd "${dep}"
		fi
	done
	for dep in ${opt_dep_libs}; do
		dep_name="$(printf '%s' "${dep}" | tr -c '[a-z0-9]' '_')"
		dep_val="$(eval echo \$\{"${dep_name}"\})"
		if [ -z "${dep_val}" ]; then
			find_dep_lib "${dep}"
		fi
	done

	if ${missing_deps}; then
		cat <<EOF

Some dependencies could not be found.
Please make sure all dependencies are installed and try again.

EOF
		exit 1
	fi

	write_makefiles

	printf '\nConfiguration complete!\n\n'
}

print_usage()
{
	printf 'Usage: %s [OPTION]...\n' "${0}"
}

print_help()
{
	cat <<EOF
\`configure' configures ${package_name} ${package_version} to adapt to many \
kinds of systems.

$(print_usage)

Configuration:
  -h, --help              display this help and exit
  -V, --version           display version information and exit
  -q, --quiet             do not print \`checking ...' messages
      --srcdir=SRCDIR     find the scripts in SRCDIR
                          default: configure dir

Installation directories:
  --prefix=PREFIX         install files under PREFIX
                          default: /usr/local
  --bindir=BINDIR         install scripts in BINDIR
                          default: PREFIX/bin
  --libdir=LIBDIR         install library scripts in LIBDIR
                          default: PREFIX/share
  --pkglibdir=PKGLIBDIR   install package library scripts in PKGLIBDIR
                          default: LIBDIR/${package_library}
  --datadir=DATADIR       expect to find data in DATADIR
                          default: PREFIX/share
  --mandir=MANDIR         install manual pages in MANDIR
                          default: DATADIR/man
  --man1dir=MAN1DIR       install section 1 manual pages in MAN1DIR
                          default: MANDIR/man1
  --localedir=LOCALEDIR   install locales in LOCALEDIR
                          default: DATADIR/locale

Features:
  --with-multiarch-libdir=BOOL
                          use multiarch library paths in packages
                          default: false

Dependencies:
  --with-sh=PATH          use sh at PATH
  --with-libopkbuild.1=PATH
                          use libopkbuild.1 at PATH
  --with-archtab=PATH     use archtab at PATH
EOF
}

print_version()
{
	cat <<EOF
${package_name} ${package_version} configure
Not generated by GNU Autoconf

Copyright (C) 2011-2012 Patrick "P. J." McDermott
License: GNU GPL version 2 or later <http://www.gnu.org/licenses/gpl.html>.
This configure script is free software: you can redistribute and/or modify it.
There is NO WARRANTY, to the extent permitted by law.
EOF
}

parse_options()
{
	optind=0

	for _opt; do

		# Handle arguments of "--opt arg" options.
		if [ -n "${_prev}" ]; then
			eval "${_prev}"=\"\$\{_opt\}\"
			_prev=''
			continue
		fi

		# Detect "--opt=arg" and "--opt arg" options.
		case "${_opt}" in
			*=*)
				_optarg="${_opt#*=}"
				_opt="${_opt%=*}"
				_optarg_set='true'
				;;
			*)
				_optarg_set='false'
				;;
		esac

		# Handle short and long options.
		case "${_opt}" in
			--)
				break
				;;
			-h|--help)
				print_help
				exit 0
				;;
			-V|--version)
				print_version
				exit 0
				;;
			-q|--quiet)
				quiet='true'
				continue
				;;
		esac

		# Anything beyond this point should be a long option.
		case "${_opt}" in
			--with-*)
				_opt="${_opt#--with-}"
				_opts="${features}"
				_type='package'
				;;
			--*)
				_opt="${_opt#--}"
				_opts="${long_opts_with_args}"
				_type='option'
				;;
			*)
				break
				;;
		esac

		grep "^${_opt}\$" >/dev/null 2>&1 <<EOF
"${_opts}"
EOF
		if [ ${?} -ne 0 ]; then
			printf 'warning: unrecognized %s name: %s\n' \
				"${_type}" "${_opt}" >&2
			continue
		fi
		if ${_optarg_set}; then
			_opt="$(printf '%s' "${_opt}" | tr -c '[a-z0-9]' '_')"
			eval "${_opt}"=\"\$\{_optarg\}\"
		else
			_prev="${_opt}"
		fi

		optind=$(($optind + 1))

	done
}

find_dep_cmd()
{
	_dep="${1}"

	${quiet} || printf 'checking for %s... ' "${_dep}"

	IFS=':'

	for _element in ${PATH}; do
		unset IFS
		: ${_element=-.}
		if [ -f "${_element}/${_dep}" -a -x "${_element}/${_dep}" ]; then
			${quiet} || printf '%s/%s\n' "${_element}" "${_dep}"
			_var="$(printf '%s' "${_dep}" | tr -c '[a-z0-9]' '_')"
			eval "${_var}"=\"${_element}/${_dep}\"
			return 0
		fi
	done

	unset IFS

	${quiet} || printf 'not found\n'
	return 1
}

find_dep_lib()
{
	_dep="${1}"

	${quiet} || printf 'checking for %s... ' "${_dep}"

	IFS=':'

	for _element in $(eval echo "${libdir}") ${PATH}; do
		unset IFS
		: ${_element=-.}
		if [ -d "${_element}/${_dep}" ]; then
			${quiet} || printf '%s/%s\n' "${_element}" "${_dep}"
			_var="$(printf '%s' "${_dep}" | tr -c '[a-z0-9]' '_')"
			eval "${_var}"=\"${_element}/${_dep}\"
			return 0
		fi
	done

	unset IFS

	${quiet} || printf 'not found\n'
	return 1
}

write_makefiles()
{
	for _dir in src lib lib/buildsystem locale man; do
		[ -d "${_dir}" ] || mkdir "${_dir}"
	done

	# Make a script to edit input makefiles.
	_sed_script=''
	for _var in ${subst_vars}; do
		_var="$(printf '%s' "${_var}" | tr -c '[a-z0-9]' '_')"
		_sed_script="${_sed_script}s&@${_var}@&$(eval echo \$\{"${_var}"\})&g;"
	done
	sed "${_sed_script}" "${srcdir}/Makefile.in" >'Makefile'

	# New and improved kludge to generate an architecture table for testing.
	# TODO: Remove when no longer used.
	sed "${_sed_script}" "${srcdir}/mkarchtab.in" >'mkarchtab'
	chmod 755 'mkarchtab'
}

main "${@}"