#!/bin/bash
# Build kernel for use with Eureka.

exec_name=$0

set -o errtrace
trap 'echo Fatal error: script ${exec_name} aborting at line $LINENO, command \"$BASH_COMMAND\" returned $?; exit 1' ERR


deterministic_build=false
if [[ "$1" == "-d" ]]; then
  deterministic_build=true
  shift
fi

# Set variables for deterministic kernel builds
# These correspond to linux-3.8/scripts/mkcompile_h

if [[ "$deterministic_build" == true ]]; then
  export KBUILD_BUILD_VERSION=0
  export KBUILD_BUILD_TIMESTAMP="$(git log -1 --format=%cd) ($(git rev-parse HEAD | head -c 8))"
  export KBUILD_BUILD_USER=user
  export KBUILD_BUILD_HOST=host
else
  # Add git hash to date. This corresponds to scripts/mkcompile_h
  # This shows up in /proc/version
  export KBUILD_BUILD_TIMESTAMP="$(date) ($(git rev-parse HEAD | head -c 8))"
fi

arch=arm
cross_compile=armv7a-cros-linux-gnueabihf-

cpu_num=$(grep -c processor /proc/cpuinfo)

function usage(){
    echo "Usage: ${exec_name} [-d] [anchovy] [salami] [pepperoni] [chorizo] [pineapple] [mushroom] [caprica]"
    echo
    echo "-d : Build a deterministicly. Use git revision and timestamp and"
    echo "     generic user and host for /proc/version"
}

function run_kernel_make(){
    echo "***** building $5 *****"
    CROSS_COMPILE=$1 make -j$2 ARCH=$3 $4 CONFIG_DEBUG_SECTION_MISMATCH=y
    echo "***** completed building $5 *****"
}

function run_perf_make(){
    echo "***** building perf *****"
    LDFLAGS='-static-libgcc -static-libstdc++' \
    CROSS_COMPILE=$1 ARCH=$2 NO_DWARF=1 make -j$3
    echo "***** completed building perf *****"
}

function build_kernel(){
    local kernel_path=$(readlink -f $1)
    local product=$2
    local dts=$3

    pushd $kernel_path

    # Clean kernel
    run_kernel_make $cross_compile $cpu_num $arch clean
    # Build kernel config
    run_kernel_make $cross_compile $cpu_num $arch ${product}_defconfig
    # Verify kernel config
    diff .config arch/arm/configs/${product}_defconfig

    run_kernel_make $cross_compile $cpu_num $arch zImage-dtb.${dts}

    # Give specific names to output files.
    local out_path="arch/arm/boot/"
    mv $out_path/zImage-dtb.${dts} $out_path/zImage-dtb.${dts}.${product}
    popd
}

function build_dtb(){
    local kernel_path=$(readlink -f $1)
    local dtb_file=$2

    pushd $kernel_path
    # Build device tree blob
    run_kernel_make $cross_compile $cpu_num $arch $dtb_file
    popd
}


function build_perf(){
    local kernel_path=$(readlink -f $1)
    pushd ${kernel_path}/tools/perf
    run_perf_make $cross_compile $arch $cpu_num
    popd
}

function create_kernel_pkg(){
    local kernel_path=$(readlink -f $1)
    local pkg_dir=$(mktemp -d)
    local wd=$(pwd)

    for f in ${copy_file_list[@]}
    do
      s=${f%%:*}
      d=${f##*:}
      mkdir -p `dirname $pkg_dir/$d`
      echo "cp $kernel_path/$s $pkg_dir/$d"
      cp $kernel_path/$s $pkg_dir/$d
    done

    (cd $pkg_dir; tar zcvf $wd/kernel.tgz *)
    rm -fr $pkg_dir
}

if (( $# < 1 ))
then
    usage
    exit 2
fi

# List of files to be copied to the output tarball.
declare -a copy_file_list=()
readonly kernel_dir=.

for product in $* ; do
  case $product in
    anchovy)
      dts=berlin2cd-dongle
      build_kernel ${kernel_dir} ${product} ${dts}

      copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
      copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
      copy_file_list+=(tools/perf/perf:${product}/prebuilt/sdk/bin/perf)
      ;;

    salami)
      # Generate A0 device tree blob.
      a0_dts=berlin2cdp-a0-dongle
      a0_dtb=${a0_dts}.dtb

      build_kernel ${kernel_dir} ${product} ${a0_dts}
      build_dtb ${kernel_dir} ${a0_dtb}

      copy_file_list+=(arch/arm/boot/zImage-dtb.${a0_dts}.${product}:${product}/prebuilt/kernel/zImage)
      copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
      copy_file_list+=(tools/perf/perf:${product}/prebuilt/sdk/bin/perf)

      for board in lexx-b3 lexx-b4 ; do
        copy_file_list+=(arch/arm/boot/dts/${a0_dtb}:salami/prebuilt/kernel/${board}.dtb)
      done
      ;;

    chorizo)
      a0_dts=berlin2cdp-a0-dongle
      a0_dtb=${a0_dts}.dtb

      build_kernel ${kernel_dir} ${product} ${a0_dts}
      build_dtb ${kernel_dir} ${a0_dtb}

      copy_file_list+=(arch/arm/boot/zImage-dtb.${a0_dts}.${product}:${product}/prebuilt/kernel/zImage)
      copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)

      for board in earth-b1 earth-b2 earth-b3 earth-b4 ; do
        copy_file_list+=(arch/arm/boot/dts/${a0_dtb}:${product}/prebuilt/kernel/${board}.dtb)
      done
      ;;

    pepperoni)
      dts=berlin2cdp-a0-hendrix
      dtb=${dts}.dtb

      build_kernel ${kernel_dir} ${product} ${dts}
      build_dtb ${kernel_dir} ${dtb}

      copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
      copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
      copy_file_list+=(tools/perf/perf:${product}/prebuilt/sdk/bin/perf)

      for board in hendrix-b1 hendrix-b3 hendrix-b4 ; do
        copy_file_list+=(arch/arm/boot/dts/${dtb}:${product}/prebuilt/kernel/${board}.dtb)
      done
      ;;

    pineapple)
      dts=berlin2cdp-a0-chirp
      dtb=${dts}.dtb

      build_kernel ${kernel_dir} ${product} ${dts}
      build_dtb ${kernel_dir} ${dtb}

      copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
      copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)

      for board in chirp-b1 chirp-b3 chirp-b4 ; do
        copy_file_list+=(arch/arm/boot/dts/${dtb}:${product}/prebuilt/kernel/${board}.dtb)
      done
      ;;

    mushroom)
      dts=berlin2cdp-a0-joplin
      dtb=${dts}.dtb

      build_kernel ${kernel_dir} ${product} ${dts}
      build_dtb ${kernel_dir} ${dtb}

      copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
      copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)

      for board in joplin-b1 joplin-b3 joplin-b4 ; do
        copy_file_list+=(arch/arm/boot/dts/${dtb}:${product}/prebuilt/kernel/${board}.dtb)
      done
      ;;

    caprica)
      a0_dts=berlin2cdp-a0-caprica
      a0_dtb=${a0_dts}.dtb

      build_kernel ${kernel_dir} ${product} ${a0_dts}
      build_dtb ${kernel_dir} ${a0_dtb}

      copy_file_list+=(arch/arm/boot/zImage-dtb.${a0_dts}.${product}:${product}/prebuilt/kernel/zImage)
      copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)

      for board in caprica-b1 caprica-b2 caprica-b3 caprica-b4 ; do
        copy_file_list+=(arch/arm/boot/dts/${a0_dtb}:${product}/prebuilt/kernel/${board}.dtb)
      done
      ;;

    *)
      echo "unknown product: $product"
      exit 1
  esac
done

# Build the perf tool
build_perf ${kernel_dir}

# Create a kernel package for all products
create_kernel_pkg $kernel_dir
