#!/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 cus        -check customer board configs
#./check_compile.sh all        -check both amlogic and customer boards


folder_board="board/amlogic"
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 [ "$2" !=  "" -a "$3" == ""  ]
then
      ARRAY_CFG[$TOTAL_CFG]=$2
      TOTAL_CFG=$TOTAL_CFG+1
fi
if [ "$2" !=  "" -a "$3" != ""  ]
then
      ARRAY_CFG[$TOTAL_CFG]=$3
      TOTAL_CFG=$TOTAL_CFG+1
fi


if [ "$1" != "cus" -a "$2" ==  "" -a "$3" == "" ]
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" ] && [ "$temp_file" != "common" ]; then
      #echo "  \c"
      #echo $temp_file
      ARRAY_CFG[$TOTAL_CFG]=$temp_file
      TOTAL_CFG=$TOTAL_CFG+1
    fi
  done
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))
      set -e
      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
    set -e
    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
