# opkhelper
# lib/buildsystem.sh
# Interface for interacting with software build systems.
#
# Copyright (C) 2012-2014  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/>.

[ "x${_OH_BUILDSYSTEM_SM+set}" = 'xset' ] && return 0
_OH_BUILDSYSTEM_SM=1

_OH_BUILDSYSTEMS='
autoconf
kbuild
make
'
_OH_BUILDSYSTEM_WORK_AREA=''
_OH_BUILDSYSTEM_SOURCE_DIR="${PWD}/src"
_OH_BUILDSYSTEM_BUILD_DIR="${PWD}/src"
_OH_BUILDSYSTEM_DESTDIR="${PWD}/dest"
_OH_BUILDSYSTEM_SYSTEM=''
_OH_BUILDSYSTEM_TARGET_ARCH=''
_OH_BUILDSYSTEM_BUILD_TARGET=''

oh_buildsystems_init()
{
	local bs=

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

	_OH_BUILDSYSTEM_WORK_AREA="${PWD}"

	return 0
}

oh_set_buildsystem_option()
{
	local name="${1}"
	local value="${2}"

	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="${1}"
	local bs=

	if [ "x${_OH_BUILDSYSTEM_SYSTEM}" != 'x' ]; 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

	oh_warn "$(oh_get_msg 'no_capable_build_sys')"
	return 1
}

oh_buildsystem_do()
{
	local step="${1}"
	local system="${2}"

	shift 2

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

	return ${?}
}

oh_buildsystem_arch()
{
	local arch="${1}"
	local system="${2}"
	local bs_arch=

	if [ "x${system}" = 'x' ]; then
		system="$(oh_buildsystem_find 'configure')"
		if [ ${?} -ne 0 ]; then
			return 1
		fi
	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

	oh_warn "$(oh_get_msg 'no_capable_host_arch')"
	return 1
}