#! /bin/sh
#
# RTEMS Tools Project
# Copyright 2017 Chris Johns
# All rights reserved
#
# Build the tools, kernel and libbsd networking stack.
#

# Uncomment to trace
#set -x

#
# Stop on any error.
#
set -e

#
# Base of the build.
#
base=$(pwd)

#
# Defaults
#
prefix=/opt/rtems
rtems_prefix=${prefix}
libbsd_prefix=${rtems_prefix}
version="4.12"
arch="arm"
bsp="xilinx_zynq_zc706"
bsp_opts="BSP_ZYNQ_RAM_LENGTH=256M"

#
# Repositories
#
rsb_git=git://git.rtems.org/rtems-source-builder.git
rtems_git=git://git.rtems.org/rtems.git
libbsd_git=git://git.rtems.org/rtems-libbsd.git

#
# Local build directories
#
rsb=rtems-source-builder.git
rtems=rtems.git
libbsd=rtems-libbsd.git

#
# Check options.
#
have_prefix=no
have_rtems_prefix=no
have_libbsd_prefix=no
build_tools=yes
build_rtems=yes
build_libbsd=yes
while getopts p:r:l:V:TR opt
do
 case ${opt} in
  p)
   prefix=$OPTARG
   have_prefix=yes
   ;;
  r)
   rtems_prefix=$OPTARG
   have_rtems_prefix=yes
   ;;
  l)
   libbsd_prefix=$OPTARG
   have_libbsd_prefix=yes
   ;;
  V)
   version=$OPTARG
   ;;
  T)
   build_tools=no
   ;;
  R)
   build_rtems=no
   ;;
  L)
   build_libbsd=no
   ;;
  ?)
   echo "Usage: rtems-tools-kernel-net -p PREFIX -r RTEMS-PREFIX -l LIBBSD-PREFIX -V VERSION _T -T -L"
   echo " PREFIX is used for all prefixes if no overridden, RTEMS-PREFIX used for LIBBSD-PREFIX if not overridden"
   exit 1 ;;
 esac
done

if [ ${have_prefix} = "yes" ]; then
 if [ ${have_rtems_prefix} = "no" ]; then
  rtems_prefix=${prefix}
  if [ ${have_libbsd_prefix} = "no" ]; then
   libbsd_prefix=${prefix}
  fi
 fi
fi

if [ ${have_rtems_prefix} = "yes" ]; then
 if [ ${have_libbsd_prefix} = "no" ]; then
  libbsd_prefix=${prefix}
 fi
fi

echo "RTEMS Source Builder GIT ..."
if [ ! -d ${rsb} ]; then
 git clone ${rsb_git} ${rsb}
else
 cd ${rsb}
 git pull
 cd ${base}
fi

if [ ${build_tools} = yes ]; then
 build_rtems=yes
fi
if [ ${build_rtems} = yes ]; then
 build_libbsd=yes
fi

echo "RTEMS Kernel GIT ..."
if [ ! -d ${rtems} ]; then
 git clone ${rtems_git} ${rtems}
else
 cd ${rtems}
 git pull
 cd ${base}
fi

echo "RTEMS LibBSD GIT ..."
if [ ! -d ${libbsd} ]; then
 git clone ${libbsd_git} ${libbsd}
 cd ${libbsd}
  git submodule init
  git submodule update rtems_waf
  cd ${base}
else
 cd ${libbsd}
 git pull
 cd ${base}
fi

if [ "`command -v waf`"no = no ]; then
 echo "error: waf not found in the path"
 exit 1
fi

if [ ${build_tools} = yes ]; then
 echo "RTEMS Tools Build ..."
 cd ${rsb}
  cd rtems
   ../source-builder/sb-set-builder --prefix=${prefix} --without-rtems --log=l.txt \
                                    ${version}/rtems-${arch}
   cd ..
  cd ${base}
fi

XPATH=$PATH
PATH=${prefix}/bin:$PATH

if [ "`command -v ${arch}-rtems${version}-gcc`"no = no ]; then
 echo "error: ${arch}-rtems${version}-gcc not found in the path"
 exit 1
fi

if [ ${build_rtems} = yes ]; then
 echo "RTEMS Kernel Build ..."
 cd ${rtems}
   ${base}/${rsb}/source-builder/sb-bootstrap
   cd ${base}

 rm -rf ${bsp}
 mkdir ${bsp}

 cd ${bsp}
  ${base}/${rtems}/configure --target=${arch}-rtems${version} --prefix=${rtems_prefix} \
                             --enable-posix --disable-networking \
                             --enable-rtemsbsp=${bsp} ${bsp_opts}
  make -j 16
  make install
  cd ${base}
fi

if [ ${build_libbsd} = yes ]; then
 echo "RTEMS LibBSD Build ..."
 cd ${libbsd}
  waf configure --prefix=${libbsd_prefix} --rtems-tools=${prefix} --rtems=${rtems_prefix} \
                --rtems-bsps=${arch}/${bsp}
  waf build install
  cd ${base}
fi

exit 0
