# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

# @ECLASS: meson-multilib.eclass
# @MAINTAINER:
# Author: Matt Turner <mattst88@gentoo.org>
# @AUTHOR:
# Author: Michał Górny <mgorny@gentoo.org>
# Author: Matt Turner <mattst88@gentoo.org>
# @SUPPORTED_EAPIS: 7
# @BLURB: meson wrapper for multilib builds
# @DESCRIPTION:
# The meson-multilib.eclass provides a glue between meson.eclass(5)
# and multilib-minimal.eclass(5), aiming to provide a convenient way
# to build packages using meson for multiple ABIs.
#
# Inheriting this eclass sets IUSE and exports default multilib_src_*()
# sub-phases that call meson phase functions for each ABI enabled.
# The multilib_src_*() functions can be defined in ebuild just like
# in multilib-minimal, yet they ought to call appropriate meson
# phase rather than 'default'.

if [[ -z ${_MESON_MULTILIB_ECLASS} ]] ; then
_MESON_MULTILIB_ECLASS=1

case ${EAPI:-0} in
	7) ;;
	*) die "EAPI=${EAPI} is not supported" ;;
esac

inherit meson multilib-minimal

EXPORT_FUNCTIONS src_configure src_compile src_test src_install

# @FUNCTION: meson_native_use_bool
# @USAGE: <USE flag> [option name]
# @DESCRIPTION:
# Given a USE flag and a meson project option, output a string like:
#
#   -Doption=true
#   -Doption=false
#
# if building for the native ABI (multilib_is_native_abi is true). Otherwise,
# output -Doption=false. If the project option is unspecified, it defaults
# to the USE flag.
meson_native_use_bool() {
	multilib_native_usex "${1}" "-D${2-${1}}=true" "-D${2-${1}}=false"
}

# @FUNCTION: meson_native_use_feature
# @USAGE: <USE flag> [option name]
# @DESCRIPTION:
# Given a USE flag and a meson project option, output a string like:
#
#   -Doption=enabled
#   -Doption=disabled
#
# if building for the native ABI (multilib_is_native_abi is true). Otherwise,
# output -Doption=disabled. If the project option is unspecified, it defaults
# to the USE flag.
meson_native_use_feature() {
	multilib_native_usex "${1}" "-D${2-${1}}=enabled" "-D${2-${1}}=disabled"
}

# @FUNCTION: meson_native_enabled
# @USAGE: <option name>
# @DESCRIPTION:
# Output -Doption=enabled option if executables are being built
# (multilib_is_native_abi is true). Otherwise, output -Doption=disabled option.
meson_native_enabled() {
	if multilib_is_native_abi; then
		echo "-D${1}=enabled"
	else
		echo "-D${1}=disabled"
	fi
}

# @FUNCTION: meson_native_true
# @USAGE: <option name>
# @DESCRIPTION:
# Output -Doption=true option if executables are being built
# (multilib_is_native_abi is true). Otherwise, output -Doption=false option.
meson_native_true() {
	if multilib_is_native_abi; then
		echo "-D${1}=true"
	else
		echo "-D${1}=false"
	fi
}

meson-multilib_src_configure() {
	local _meson_args=( "${@}" )

	multilib-minimal_src_configure
}

multilib_src_configure() {
	meson_src_configure "${_meson_args[@]}"
}

meson-multilib_src_compile() {
	local _meson_args=( "${@}" )

	multilib-minimal_src_compile
}

multilib_src_compile() {
	meson_src_compile "${_meson_args[@]}"
}

meson-multilib_src_test() {
	local _meson_args=( "${@}" )

	multilib-minimal_src_test
}

multilib_src_test() {
	meson_src_test "${_meson_args[@]}"
}

meson-multilib_src_install() {
	local _meson_args=( "${@}" )

	multilib-minimal_src_install
}

multilib_src_install() {
	meson_src_install "${_meson_args[@]}"
}

fi
