#!/usr/bin/env bash
# tools/sethost.sh
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.  The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
# License for the specific language governing permissions and limitations
# under the License.
#

set -e

progname=$0
host=
wenv=
MAKECMD="make"

function showusage {
  echo ""
  echo "USAGE: $progname [-l|m|c|g|n|B] [make-opts]"
  echo "       $progname -h"
  echo ""
  echo "Where:"
  echo "  -l|m|c|g|n|B selects Linux (l), macOS (m), Cygwin (c), BSD (B),"
  echo "     MSYS/MSYS2 (g) or Windows native (n). Default Linux"
  echo "  make-opts directly pass to make"
  echo "  -h will show this help test and terminate"
  exit 1
}

# Parse command line

while [ ! -z "$1" ]; do
  case $1 in
  -l )
    host=linux
    ;;
  -c )
    host=windows
    wenv=cygwin
    ;;
  -g )
    host=windows
    wenv=msys
    ;;
  -m )
    host=macos
    ;;
  -n )
    host=windows
    wenv=native
    ;;
  -B )
    host=bsd
    MAKECMD="gmake"
    ;;
  -h )
    showusage
    ;;
  * )
    break
    ;;
  esac
  shift
done

# If the host was not explicitly given, try to guess.
# Examples of "uname -s" outputs:
#   macOS: Darwin
#   Cygwin: CYGWIN_NT-10.0-WOW
#   Linux: Linux
#   MSYS: MINGW32_NT-6.2
#   MSYS2: MSYS_NT-6.3-9600
#   BSD: FreeBSD, OpenBSD, NetBSD, *BSD

if [ -z "$host" ]; then
  case $(uname -s) in
    Darwin)
      host=macos
      ;;
    *BSD)
      host=bsd
      MAKECMD="gmake"
      ;;
    CYGWIN*)
      host=windows
      wenv=cygwin
      ;;
    MINGW32*)
      host=windows
      wenv=msys
      ;;
    MSYS*)
      host=windows
      wenv=msys
      ;;
    *)
      # Assume linux as a fallback

      host=linux
      ;;
  esac
fi

# Detect Host CPU type.
# At least MacOS and Linux can have x86_64 and arm based hosts.

if [ -z "$cpu" ]; then
  case $(uname -m) in
    arm64)
      cpu=arm64
      ;;
    aarch64)
      cpu=arm64
      ;;
    *)
      # Assume x86_64 as default
      cpu=x86_64
      ;;
  esac
fi

WD=`test -d ${0%/*} && cd ${0%/*}; pwd`
cd $WD

if [ -x sethost.sh ]; then
  cd ..
fi

if [ -x tools/sethost.sh ]; then
  nuttx=$PWD
else
  echo "This script must be executed in nuttx/ or nuttx/tools directories"
  exit 1
fi

if [ ! -r $nuttx/.config ]; then
  echo "There is no .config at $nuttx"
  exit 1
fi

if [ ! -r $nuttx/Make.defs ]; then
  echo "ERROR: No readable Make.defs file exists at $nuttx"
  exit 1
fi

# Modify the configuration

if [ "X$host" == "Xlinux" -o "X$host" == "Xmacos" -o "X$host" == "Xbsd" ]; then

  # Disable Windows (to suppress warnings from Window Environment selections)

  kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_WINDOWS

  # Enable Linux or macOS or BSD

  if [ "X$host" == "Xlinux" ]; then
    echo "  Select CONFIG_HOST_LINUX=y"
    kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_MACOS
    kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_BSD
    kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_LINUX

    if [ "X$cpu" == "Xarm64" ]; then
      echo "  Select CONFIG_HOST_ARM64=y"
      kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_ARM64
    fi

  elif [ "X$host" == "Xbsd" ]; then
    echo "  Select CONFIG_HOST_BSD=y"
    kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_MACOS
    kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_LINUX
    kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_BSD

  else
    echo "  Select CONFIG_HOST_MACOS=y"
    kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_LINUX
    kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_BSD
    kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_MACOS

    if [ "X$cpu" == "Xarm64" ]; then
      echo "  Select CONFIG_HOST_ARM64=y"
      kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_ARM64
    fi
  fi

  # Enable the System V ABI

  kconfig-tweak --file $nuttx/.config --enable CONFIG_SIM_X8664_SYSTEMV
else
  echo "  Select CONFIG_HOST_WINDOWS=y"

  kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_LINUX
  kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_MACOS
  kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_BSD

  # Enable Windows and the Microsoft ABI

  kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_WINDOWS
  kconfig-tweak --file $nuttx/.config --enable CONFIG_SIM_X8664_MICROSOFT

  # Enable Windows environment

  if [ "X$wenv" == "Xcygwin" ]; then
    echo "  Select CONFIG_WINDOWS_CYGWIN=y"
    kconfig-tweak --file $nuttx/.config --enable CONFIG_WINDOWS_CYGWIN
  else
    if [ "X$wenv" == "Xmsys" ]; then
      echo "  Select CONFIG_WINDOWS_MSYS=y"
      kconfig-tweak --file $nuttx/.config --enable CONFIG_WINDOWS_MSYS
    else
      echo "  Select CONFIG_WINDOWS_NATIVE=y"
      kconfig-tweak --file $nuttx/.config --enable CONFIG_EXPERIMENTAL
      kconfig-tweak --file $nuttx/.config --enable CONFIG_WINDOWS_NATIVE
    fi
  fi
fi

echo "  Refreshing..."

if [ "X$wenv" == "Xmsys" ]; then
${MAKECMD} olddefconfig || { echo "ERROR: failed to refresh"; exit 1; }
else
${MAKECMD} olddefconfig $* || { echo "ERROR: failed to refresh"; exit 1; }
fi
