# special functions for projects which use meson build system

meson_build () {
  local PREFIX=${PREFIX:-/usr}
  local MESON_BUILD_TYPE="${MESON_BUILD_TYPE:-release}" &&

  local MESON_BUILD &&
  local MESON_OPTS &&
  local BUILDER &&
  local BUILDER_OPTS="-j $((${#DISTCC_HOSTS[*]} * JOBS_PER_HOST + MAKE_NJOBS)) -C builddir/" &&

  if [[ $(get_spell_provider ${SPELL} MESON-BUILD) == muon ]]; then
    MESON_BUILD="muon setup" &&

    OPTS="prefix=${INSTALL_ROOT}${PREFIX} buildtype=${MESON_BUILD_TYPE} default_library=shared libdir=lib ${OPTS}"
  else
    MESON_BUILD="meson setup"
    MESON_OPTS="--prefix ${INSTALL_ROOT}${PREFIX} --buildtype ${MESON_BUILD_TYPE} --default-library shared --libdir lib"
  fi &&

  if ! is_depends_enabled ${SPELL} $(get_spell_provider ${SPELL} NINJA-BUILD); then
    BUILDER="muon samu"
  elif [[ $(get_spell_provider ${SPELL} NINJA-BUILD) == samurai ]]; then
    BUILDER="samu"
  else
    BUILDER="ninja"
  fi &&

  for MO in $OPTS; do
    MESON_OPTS+=" -D${MO}"
  done &&

  cd "${SOURCE_DIRECTORY}" &&

  ${MESON_BUILD} ${MESON_OPTS} builddir/ &&

  ${BUILDER} ${BUILDER_OPTS}
}

meson_install () {
  local MESON_INSTALL &&
  local MESON_OPTS &&
  local EXTRA_OPTS="${@}" &&

  if [[ $(get_spell_provider ${SPELL} MESON-BUILD) == muon ]]; then
    MESON_INSTALL="muon"

    MESON_OPTS="-C builddir/ install ${EXTRA_OPTS}"
  else
    MESON_INSTALL="meson"

    MESON_OPTS="install -C builddir/ --no-rebuild ${EXTRA_OPTS}"
  fi &&

  cd "${SOURCE_DIRECTORY}" &&

  DESTDIR="${INSTALL_ROOT}/" ${MESON_INSTALL} ${MESON_OPTS}
}

#---------------------------------------------------------------------
## Converts from y/n or list values to meson build options.
##
## @param setting_type (boolean, feature, list/array, or choice/combo,
##          defaults to feature)
## @param setting_name
## @param setting_value
##
## Note: this function automatically sets OPT. This function should
## only be called from BUILD.
#---------------------------------------------------------------------
meson_opt() {
  local name
  local result
  local type="$1"
  case "$type" in
    bool|boolean|feature|list|array|choice|combo)
      name="$2"
      shift 2
      ;;
    *)
      type="feature"
      name="$1"
      shift 1
      ;;
  esac
  case "$type" in
    bool|boolean)
      case "${1:-n}" in
        y) result="true" ;;
        n) result="false" ;;
      esac
      ;;
    feature)
      case "${1:-n}" in
        y) result="enabled" ;;
        n) result="disabled" ;;
      esac
      ;;
    list|array|choice|combo)
      result="${@// /,}"
      ;;
  esac
  OPTS="$OPTS $name=$result"
}

default_build() {
  meson_build
}

default_install() {
  meson_install
}
