#!/usr/bin/env bash

shopt -s nullglob

toolchain_by_config() {
  CF=$1
  FMT=$2

  BR2_VER=$(grep BR2_DEFAULT_KERNEL_VERSION $CF)
  if [ -n "$BR2_VER" ]; then
    VENDOR=$(echo $CF | cut -d - -f 4 | cut -d / -f 1 | sed -r 's/\<./\U&/g')
    KVER=$(echo $BR2_VER | cut -d \" -f 2 | awk -F . '{printf "%s_%s", $1, $2}')
    GCC_VER=$(sed -rn "s/^BR2_GCC_VERSION_([0-9]*)_X=y/\1/p" $CF)
    ARCH=$(sed -rn "s/^BR2_(arm[a-z0-9_]+)=y/\1/p" $CF)
    if [ -z "$ARCH" ]; then
      ARCH=$(sed -rn "s/^BR2_(cortex_[a-z0-9_]+)=y/\1/p" $CF)
    fi
    if [ -z "$ARCH" ]; then
      ARCH=$(sed -rn "s/^BR2_(arm)=y/\1/p" $CF)
    else
      # Here we have something from ARM modern family
      HF=$(sed -rn "s/^BR2_ARM_EABI(HF)=y/\1/p" $CF | tr '[:upper:]' '[:lower:]')
    fi

    if [ -z "$ARCH" ]; then
      ARCH=$(sed -rn "s/^BR2_(mips_[a-z]*)=y/\1/p" $CF)
    else
      THUMB=$(sed -rn "s/^BR2_ARM_INSTRUCTIONS_(THUMB2)=y/\1/p" $CF)
      if [ -n "$THUMB" ]; then
        ARCH="${ARCH}_${THUMB,,}"
      fi
      if [ -n "$HF" ]; then
        ARCH="${ARCH}_${HF}"
      fi
    fi

    LIBC=$(sed -rn "s/^BR2_TOOLCHAIN_BUILDROOT_LIBC=\"(.*)\"/\1/p" $CF)

    SOC=$(echo $CF | cut -d _ -f 3)
    case $FMT in
      list)
        echo $ARCH $GCC_VER $LIBC $KVER $VENDOR $CF
        ;;
      uniq)
        echo $ARCH $GCC_VER $LIBC $KVER
        ;;
      *)
        if [ -n "$2" ]; then
          BR_DIR=buildroot-$2
          GCC_VER=$(sed -rn \
            "s/^\s+default\s+\"([0-9.]+)\"\s+if BR2_GCC_VERSION_${GCC_VER}_X/\1/p" \
              $BR_DIR/package/gcc/Config.in.host)
          case $LIBC in
            musl)
              VER=$(sed -rn "s/^MUSL_VERSION\s*=\s*([0-9.]+)/\1/p" \
                $BR_DIR/package/musl/musl.mk)
              ;;
            uclibc)
              VER=$(sed -rn "s/^UCLIBC_VERSION\s*=\s*([0-9.]+)/\1/p" \
                $BR_DIR/package/uclibc/uclibc.mk)
              ;;
            glibc)
              VER=$(sed -rn "s/^GLIBC_VERSION\s*=\s*([0-9.]+).*/\1/p" \
              $BR_DIR/package/glibc/glibc.mk  | tail -1)
              ;;
            esac
          HASH=$(echo $VER | sha1sum | cut -c 1-8)
          echo ${ARCH}-gcc${GCC_VER}-${LIBC}-${KVER}-${HASH}
        else
          echo ${ARCH}-gcc${GCC_VER}-${LIBC}-${KVER}
        fi
        ;;
    esac
  fi
}

if [ $# -eq 0 ]; then
  $0 list | sort
else
  if [ "$1" != "list" ] && [ "$1" != "uniq" ]; then
    toolchain_by_config $1 $2
  else
    for D in br-ext-chip-*; do
      for CF in $D/configs/*; do
        toolchain_by_config $CF $1
      done
    done
  fi
fi