# opkhelper
# lib/buildsystem
# Interface for interacting with software build systems.
#
# 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/>.

[ -n "${_OH_BUILDSYSTEM_SM}" ] && return 0
_OH_BUILDSYSTEM_SM='true'

_OH_BUILDSYSTEMS='
autoconf
kbuild
make
'

oh_buildsystems_init()
{
	local bs=

	for bs in ${_OH_BUILDSYSTEMS}; do
		oh_use "buildsystem/${bs}"
	done

	_OH_BUILDSYSTEM_WORK_AREA="${PWD}"

	[ -z "${_OH_BUILDSYSTEM_SOURCE_DIR}" ] && \
		_OH_BUILDSYSTEM_SOURCE_DIR="${PWD}/src"
	[ -z "${_OH_BUILDSYSTEM_BUILD_DIR}" ] && \
		_OH_BUILDSYSTEM_BUILD_DIR="${PWD}/src"
	[ -z "${_OH_BUILDSYSTEM_DESTDIR}" ] && \
		_OH_BUILDSYSTEM_DESTDIR="${PWD}/dest"
	[ -z "${_OH_BUILDSYSTEM_SYSTEM}" ] && \
		_OH_BUILDSYSTEM_SYSTEM=''

	return 0
}

oh_set_buildsystem_option()
{
	local name=
	local value=

	if [ ${#} -eq 2 ]; then
		name="${1}"
		value="${2}"
	else
		return 125
	fi

	case "${name}" in
		'source-dir')
			_OH_BUILDSYSTEM_SOURCE_DIR="$(cd "${value}" && \
				pwd)"
			;;
		'build-dir')
			_OH_BUILDSYSTEM_BUILD_DIR="${value}"
			;;
		'destdir')
			_OH_BUILDSYSTEM_DESTDIR="$(mkdir -p "${value}" && \
				cd "${value}" && pwd)"
			;;
		'build-system')
			_OH_BUILDSYSTEM_SYSTEM="${value}"
			;;
		'target-arch')
			_OH_BUILDSYSTEM_TARGET_ARCH="${value}"
			;;
		'build-target')
			_OH_BUILDSYSTEM_BUILD_TARGET="${value}"
			;;
		*)
			return 125
			;;
	esac

	return 0
}

oh_buildsystem_find()
{
	local test_step=
	local bs=

	if [ ${#} -eq 1 ]; then
		test_step="${1}"
	else
		return 125
	fi

	if [ -n "${_OH_BUILDSYSTEM_SYSTEM}" ]; then
		if "_oh_${_OH_BUILDSYSTEM_SYSTEM}_can_${test_step}"; then
			printf '%s\n' "${_OH_BUILDSYSTEM_SYSTEM}"
			return 0
		fi
	else
		for bs in ${_OH_BUILDSYSTEMS}; do
			if "_oh_${bs}_can_${test_step}"; then
				printf '%s\n' "${bs}"
				return 0
			fi
		done
	fi

	ob_warn "$(ob_get_msg 'no_capable_build_sys')"
	return 1
}

oh_buildsystem_do()
{
	local step=
	local system=

	if [ ${#} -ge 2 ]; then
		step="${1}"
		system="${2}"
		shift 2
	else
		return 125
	fi

	"_oh_${system}_${step}" "${@}"

	return ${?}
}

oh_buildsystem_arch()
{
	local arch=
	local bs_arch=
	local system=

	if [ ${#} -eq 1 ]; then
		arch="${1}"
		system="$(oh_buildsystem_find 'configure')"
		if [ ${?} -ne 0 ]; then
			return 1
		fi
	elif [ ${#} -eq 2 ]; then
		arch="${1}"
		system="${2}"
	else
		return 125
	fi

	# Try to find a suitable build system host arch.
	for bs_arch in $(cat '@@ARCHTABDIR@@/'"${arch}/${system}")
	do
		if oh_buildsystem_do 'testarch' "${system}" "${bs_arch}"
		then
			printf '%s\n' "${bs_arch}"
			return 0
		fi
	done

	ob_warn "$(ob_get_msg 'no_capable_host_arch')"
	return 1
}