#!/bin/bash

#------------IMPORTANT------------#
#--RUN THIS SCRIPT BEFOR COMMIT---#
#---------------------------------#

# Author: xiaobo.gu@amlogic.com
# Init version: 20160329

#usage:
#
#./check_compile.sh            -check amlogic board configs
#./check_compile.sh khadas     -check khadas board configs
#./check_compile.sh cus        -check customer board configs
#./check_compile.sh all        -check amlogic/khadas/customer boards


folder_board="board/amlogic"
folder_khadas="board/khadas"
customer_folder="customer/board"

echo "************** Amlogic Compile Check Tool **************"

# filters define:
#    cus: all customer board
#    all: all boards
#    other:
#      gxb: all gxbaby board
#      gxtvbb: all gxtvbb board
#      skt: all socket board
#      p200: p200 board
#      etc.....
declare filter="$1"

# ARRAY_CFG store config names
declare -a ARRAY_CFG
declare -a ARRAY_CFG_C
# TOTAL_CFG store config total num
declare -i TOTAL_CFG
declare -i TOTAL_CFG_C

# if filter!=cus, then include amlogic configs
# get all configs name from board folder
if [ "$1" != "cus" ]
then
  filter=$1
  for file in ${folder_board}/*; do
    temp_file=`basename $file`
    #echo "$temp_file"
    if [ -d ${folder_board}/${temp_file} ] && [ "$temp_file" != "defconfigs" ] && [ "$temp_file" != "configs" ];then
      #echo "  \c"
      #echo $temp_file
      ARRAY_CFG[$TOTAL_CFG]=$temp_file
      TOTAL_CFG=$TOTAL_CFG+1
    fi
  done
fi

# if filter==all || filter==khadas, then include khadas configs
# get all configs name from board folder
if [ "$1" == "khadas" ] || [ "$1" == "all" ]
then
  filter=""
  if [ -e ${khadas_folder} ];then
    for file in ${khadas_folder}/*; do
      temp_file=`basename $file`
      if [ -d ${khadas_folder}/${temp_file} ] && [ "$temp_file" != "defconfigs" ] && [ "$temp_file" != "configs" ];then
        #echo "  \c"
        #echo $temp_file
        ARRAY_CFG_C[$TOTAL_CFG_C]=$temp_file
        TOTAL_CFG_C=$TOTAL_CFG_C+1
      fi
    done
  fi
fi

# if filter==all || filter==cus, then include customer configs
# get all customer configs name from customer board folder
if [ "$1" == "cus" ] || [ "$1" == "all" ]
then
  filter=""
  if [ -e ${customer_folder} ];then
    for file in ${customer_folder}/*; do
      temp_file=`basename $file`
      if [ -d ${customer_folder}/${temp_file} ] && [ "$temp_file" != "defconfigs" ] && [ "$temp_file" != "configs" ];then
        #echo "  \c"
        #echo $temp_file
        ARRAY_CFG_C[$TOTAL_CFG_C]=$temp_file
        TOTAL_CFG_C=$TOTAL_CFG_C+1
      fi
    done
  fi
fi

echo "************************ START *************************"

# compile check start
# RESULT store compile result
declare RESULT=""
declare -i LOOP_NUM=0
# counter variables
declare -i PASS_COUNTER=0
declare -i FAIL_COUNTER=0

# print bar and alignment
declare -i BAR_TOTAL=30
declare -i BAR_LOOP

# trying fix scp task compile failure misreport issue
declare -i BUILD_COUNTER=3
declare -i BUILD_RESULT=0

RESULT=$RESULT"########### Compile Check Result ###########\n"

if [ "$1" != "cus" ]
then
  RESULT=$RESULT"--------------------------------------------\n"
  RESULT=$RESULT"############## Amlogic Boards ##############\n"
  # loop all cfgs
  for cfg in ${ARRAY_CFG[@]}
  do
    # find filter in config name
    if [[ $(echo $cfg | grep "${filter}") == "" ]]
    then
      # skip !filter configs
      continue
    fi
    LOOP_NUM=$LOOP_NUM+1
    RESULT=$RESULT' '
    # print '0' charactors for alignment
    BAR_LOOP=3-`expr length $LOOP_NUM`
    if [ "$BAR_LOOP" -gt "0" ]
    then
      for tmp in `seq $BAR_LOOP`;do RESULT=$RESULT'0';done
    fi
    RESULT=$RESULT$LOOP_NUM' '
    RESULT=$RESULT$cfg' '
    # print '-' charactors for alignment
    BAR_LOOP=BAR_TOTAL-`expr length $cfg`
    if [ "$BAR_LOOP" -gt "0" ]
    then
      for tmp in `seq $BAR_LOOP`;do RESULT=$RESULT'-';done
    fi
    # compile
    BUILD_COUNTER=3
    BUILD_RESULT=0
    while [ "${BUILD_COUNTER}" -gt "0" ]; do
      BUILD_COUNTER=$((BUILD_COUNTER - 1))
      make distclean
      make $cfg'_defconfig'
      make -j
      # check last 'make -j' result
      if [ $? != 0 ]; then
        BUILD_RESULT=$((BUILD_RESULT + 1))
      else
        BUILD_RESULT=0
        BUILD_COUNTER=0
      fi
    done
    # check compile result
    if [ ${BUILD_RESULT} != 0 ]; then
      RESULT=$RESULT'- failed\n'
      FAIL_COUNTER=$FAIL_COUNTER+1
    else
      RESULT=$RESULT'- pass\n'
      PASS_COUNTER=$PASS_COUNTER+1
    fi
    # print result
    echo -e $RESULT
    #echo $cfg
  done
fi

# check customer configs
if [ "$1" == "cus" ] || [ "$1" == "all" ]
then
  RESULT=$RESULT"--------------------------------------------\n"
  RESULT=$RESULT"############## Customer Boards #############\n"
  for cfg in ${ARRAY_CFG_C[@]}
  do
    LOOP_NUM=$LOOP_NUM+1
    RESULT=$RESULT' '
    BAR_LOOP=3-`expr length $LOOP_NUM`
    if [ "$BAR_LOOP" -gt "0" ]
    then
      for tmp in `seq $BAR_LOOP`;do RESULT=$RESULT'0';done
    fi
    RESULT=$RESULT$LOOP_NUM' '
    RESULT=$RESULT$cfg' '
    BAR_LOOP=BAR_TOTAL-`expr length $cfg`
    if [ "$BAR_LOOP" -gt "0" ]
    then
      for tmp in `seq $BAR_LOOP`;do RESULT=$RESULT'-';done
    fi
    make distclean
    make $cfg'_defconfig'
    make -j
    if [ $? != 0 ]
    then
      RESULT=$RESULT'- failed\n'
      FAIL_COUNTER=$FAIL_COUNTER+1
    else
      RESULT=$RESULT'- pass\n'
      PASS_COUNTER=$PASS_COUNTER+1
    fi
    echo -e $RESULT
  done
fi

echo -e "#################### END ###################\n"

exit $FAIL_COUNTER
