# 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
make
'

oh_buildsystems_init()
{
	_oh_local _ohbsi_bs

	for _ohbsi_bs in ${_OH_BUILDSYSTEMS}; do
		oh_use "buildsystem/${_ohbsi_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=''
}

oh_set_buildsystem_option()
{
	_oh_local _ohsbso_name _obsbso_value

	if [ ${#} -eq 2 ]; then
		_ohsbso_name="${1}"
		_ohsbso_value="${2}"
	else
		_oh_return 125
		return ${?}
	fi

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

oh_buildsystem_find()
{
	_oh_local _ohbsf_test_step _ohbsf_bs

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

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

	ob_warn "$(ob_get_msg 'no_capable_build_sys')"
	_oh_return 1
	return ${?}
}

oh_buildsystem_do()
{
	_oh_local _ohbsd_step _ohbsd_system

	if [ ${#} -ge 2 ]; then
		_ohbsd_step="${1}"
		_ohbsd_system="${2}"
		shift 2
	else
		_oh_return 125
		return ${?}
	fi

	"_oh_${_ohbsd_system}_${_ohbsd_step}" "${@}"

	_oh_return ${?}
	return ${?}
}

oh_buildsystem_arch()
{
	_oh_local _ohbsa_arch _ohbsa_bs_arch _ohbsa_system

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

	_ohbsa_system="$(oh_buildsystem_find 'configure')"
	if [ ${?} -ne 0 ]; then
		_oh_return 1
		return ${?}
	fi

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

	ob_warn "$(ob_get_msg 'no_capable_host_arch')"
	_oh_return 1
	return ${?}
}