#!/bin/bash

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

# Author: xiaobo.gu@amlogic.com
# Init version: 20160329
# Update for bootloader.repo: 2017.01.01

#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

function check_compile() {
  # $1: filter
  folder_board="bl33/board/amlogic/defconfigs"
  customer_folder="bl33/customer/board/defconfigs"

  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`
      # del "_defconfig"
      temp_file=${temp_file%_*}
      #echo "$temp_file"
      ARRAY_CFG[$TOTAL_CFG]=$temp_file
      TOTAL_CFG=$TOTAL_CFG+1
    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`
        temp_file=${temp_file%_*}
        #echo $temp_file
        ARRAY_CFG_C[$TOTAL_CFG_C]=$temp_file
        TOTAL_CFG_C=$TOTAL_CFG_C+1
      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

  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
      BUILD_COUNTER=3
      BUILD_RESULT=0
      while [ "${BUILD_COUNTER}" -gt "0" ]; do
        BUILD_COUNTER=$((BUILD_COUNTER - 1))
        #make distclean
        #make $cfg'_defconfig'
        #make -j
        fip/mk_script.sh $cfg
        # 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"
}
