#!/bin/bash
set -o errexit

if [ ! -d ${GUMSTIXTOP} ] ; then
  echo "Gumstix OpenEmbedded installation not found.";
  exit;
fi;

if [ ! -d ${ROS_ROOT} ] ; then
  echo "ROS native installation not found.";
  exit;
fi;

sudo -v # so that you can go get yourself a cup of tea...

mkdir -p ~/gumros/ros-deps
cd ~/gumros/ros-deps

# log4cxx and its depencencies apr and apr-util
if [ ! -f /opt/gumros/lib/liblog4cxx.so.10 ] ; then
  # adding the ARM compilers to PATH
  OLD_PATH="$PATH"
  PATH="${GUMSTIXTOP}/tmp/cross/arm-angstrom-linux-gnueabi/bin:$PATH"
  
  # apr
  if [ ! -f /opt/gumros/lib/libapr-1.la ] ; then
    if [ ! -f apr-1.3.3.tar.gz ] ; then
      wget --tries=10 http://www.powertech.no/apache/dist/apr/apr-1.3.3.tar.gz
	fi
    tar xzf apr-1.3.3.tar.gz
    cd apr-1.3.3
    ./configure --prefix=/opt/gumros/ \
                --disable-shared \
                --enable-static \
                --host=arm-linux \
                ac_cv_file__dev_zero=yes \
                ac_cv_func_setpgrp_void=yes \
                apr_cv_tcp_nodelay_with_cork=no \
                apr_cv_process_shared_works=no \
                apr_cv_mutex_robust_shared=no \
                ac_cv_sizeof_struct_iovec=8 \
                apr_cv_mutex_recursive=yes
    cd include
    split apr.h -l 407
    mv xaa apr.h
    echo "/* \"kumar's dangerous hack\" */" >> apr.h
    echo "#if !defined(PATH_MAX)" >> apr.h
    echo "#define PATH_MAX 4096" >> apr.h
    echo "#endif" >> apr.h
    echo "" >> apr.h
    cat xab >> apr.h
    rm xab
    cd ..
    make
    sudo make install
    cd ..
  else
    echo "apr appears to be already installed; skipping."
  fi
  
  # apr-util
  if [ ! -f /opt/gumros/lib/libaprutil-1.la ] ; then
    if [ ! -f apr-util-1.3.4.tar.gz ] ; then
      wget --tries=10 http://www.powertech.no/apache/dist/apr/apr-util-1.3.4.tar.gz
    fi
    tar xzf apr-util-1.3.4.tar.gz
    cd apr-util-1.3.4
    ./configure --prefix=/opt/gumros \
                --disable-shared \
                --enable-static \
                --without-pgsql \
                --without-sqlite2 \
                --without-sqlite3 \
                --host=arm-linux \
                --with-apr=/opt/gumros \
                --with-expat=builtin \
                ac_cv_file__dev_zero=yes \
                ac_cv_func_setpgrp_void=yes \
                apr_cv_tcp_nodelay_with_cork=no \
                apr_cv_process_shared_works=no \
                apr_cv_mutex_robust_shared=no \
                ac_cv_sizeof_struct_iovec=8
    make
    sudo make install
    cd ..
  else
    echo "apr-util appears to be already installed; skipping."
  fi
  
  # log4cxx
  if [ ! -f apache-log4cxx-0.10.0-wg_patched.tar.gz ] ; then
    wget --tries=10 http://pr.willowgarage.com/downloads/apache-log4cxx-0.10.0-wg_patched.tar.gz
  fi
  tar xzf apache-log4cxx-0.10.0-wg_patched.tar.gz
  cd apache-log4cxx-0.10.0
  ./configure --prefix=/opt/gumros \
			  --host=arm-linux \
			  --with-apr=/opt/gumros \
			  --with-apr-util=/opt/gumros \
			  ac_cv_file__dev_zero=yes \
			  ac_cv_func_setpgrp_void=yes \
			  apr_cv_tcp_nodelay_with_cork=no \
			  apr_cv_process_shared_works=no \
			  apr_cv_mutex_robust_shared=no \
			  ac_cv_sizeof_struct_iovec=8
  make
  sudo make install
  cd ..
  
  PATH="$OLD_PATH"
else
  echo "log4cxx appears to be already installed; skipping."
fi

# boost
if [ ! -f /opt/gumros/lib/libboost_date_time-gcc41-mt-1_38.so ] ; then
  if [ ! -f boost_1_38_0.tar.gz ] ; then
    wget --tries=10 http://heanet.dl.sourceforge.net/sourceforge/boost/boost_1_38_0.tar.gz
  fi
  tar xzf boost_1_38_0.tar.gz
  cd boost_1_38_0
  GPP_PATH=${GUMSTIXTOP}/tmp/cross/arm-angstrom-linux-gnueabi/bin/g++
  GPP_VER=`${GPP_PATH} -v 2>&1 | tail -1 | awk '{print $3}'`
  echo "using gcc : ${GPP_VER} : ${GPP_PATH}  ; " > tools/build/v2/user-config.jam
  sudo apt-get install bjam
  set +o errexit
  sudo bjam --toolset=gcc-${GPP_VER} --prefix=/opt/gumros install
  set -o errexit
  cd ..
else
  echo "boost appears to be already installed; skipping."
fi
if [ ! -f /opt/gumros/lib/libboost_date_time-gcc41-mt-1_38.so ] ; then
  echo "Failed to compile libboost_date_time";
  exit;
fi

## set up environment variables
echo "export ROS_ROOT=~/gumros/ros" > ~/.bashrc.gumros
echo "export ROS_PACKAGE_PATH=~/gumros/ros-pkg" >> ~/.bashrc.gumros
echo "export ROS_MASTER_URI=http://localhost:11311/" >> ~/.bashrc.gumros
echo "export ROS_BINDEPS_PATH=/opt/gumros" >> ~/.bashrc.gumros
echo "export PYTHONPATH=\$PYTHONPATH:\$ROS_ROOT/core/roslib/src" >> ~/.bashrc.gumros
echo "export OCTAVE_PATH=\$OCTAVE_PATH:\$ROS_ROOT/core/experimental/rosoct" >> ~/.bashrc.gumros
echo "export PARALLEL_JOBS=-j`cat /proc/cpuinfo | grep processor | wc -l`" >> ~/.bashrc.gumros
echo "source \$ROS_ROOT/tools/rosbash/rosbash" >> ~/.bashrc.gumros

## check out the ROS core and the PR package set
cd ~/gumros
if [ ! -d ~/gumros/ros ] ; then
  svn co https://ros.svn.sourceforge.net/svnroot/ros/tags/stable ros
  echo "#!/bin/sh" > ~/gumros/ros/core/rospy/scripts/genmsg_py
  echo "#!/bin/sh" > ~/gumros/ros/core/rospy/scripts/gensrv_py
  echo "set(CMAKE_SYSTEM_NAME Linux)" > ~/gumros/ros/rostoolchain.cmake
  echo "set(CMAKE_C_COMPILER ${GUMSTIXTOP}/tmp/cross/arm-angstrom-linux-gnueabi/bin/gcc)" >> ~/gumros/ros/rostoolchain.cmake
  echo "set(CMAKE_CXX_COMPILER ${GUMSTIXTOP}/tmp/cross/arm-angstrom-linux-gnueabi/bin/g++)" >> ~/gumros/ros/rostoolchain.cmake
  echo "set(CMAKE_FIND_ROOT_PATH ${GUMSTIXTOP}/tmp/cross)" >> ~/gumros/ros/rostoolchain.cmake
  echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)" >> ~/gumros/ros/rostoolchain.cmake
  echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> ~/gumros/ros/rostoolchain.cmake
  echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> ~/gumros/ros/rostoolchain.cmake
  cd ~/gumros/ros/core/roscpp/include/ros
  split common.h -l 48
  mv xaa common.h
  echo "/* ugly hack */" >> common.h
  echo "#if !defined(PATH_MAX)" >> common.h
  echo "#define PATH_MAX 4096" >> common.h
  echo "#endif" >> common.h
  echo "" >> common.h
  cat xab xac xad >> common.h
  rm xab xac xad
  cd ~/gumros
fi
if [ ! -d ~/gumros/ros-pkg ] ; then
  svn co https://personalrobots.svn.sourceforge.net/svnroot/personalrobots/pkg/trunk ros-pkg
fi

source ~/.bashrc.gumros
cd ~/gumros/ros/tools/rospack && make
cd ~/gumros/ros/3rdparty/gtest && make
cd ~/gumros/ros/core/genmsg_cpp && make
cd ~/ros/ros/core/genmsg_cpp
cp genmsg genmsg_lisp genmsg_oct genmsgtest gensrv gensrv_lisp gensrv_oct submsgs ~/gumros/ros/core/genmsg_cpp/
cd ~/gumros/ros/core/roslib && make
cd ~/gumros/ros/core/rospy && make
cd ~/gumros/ros/3rdparty/pycrypto && make
cd ~/gumros/ros/3rdparty/paramiko && make
cd ~/gumros/ros/3rdparty/xmlrpc++ && make
cd ~/gumros/ros/tools/roslaunch && make
cd ~/gumros/ros/test/rostest && make
cd ~/gumros/ros/core/rosconsole && make
cd ~/gumros/ros/core/roscpp && make
cd ~/gumros/ros/core/rosout && make
echo "\nHOORAY! The ROS tools are now built. Now, you can use 'rosmake' for\nrecursive builds.\n"

if [ -f ~/.bashrc.ros ] ; then
  source ~/.bashrc.ros
  # create convenient shortcuts for "source" for switching between PC-compilation and gumstix-compilation
  # use "source rospc" and "source rosgum" to do this
  # It's the same as using "source ~/.bashrc.ros" and "source ~/.bashrc.gumros", just faster to write :)
  if [ ! -f ${ROS_ROOT}/bin/rospc ] ; then ln -s ~/.bashrc.ros ${ROS_ROOT}/bin/rospc ; fi
  if [ ! -f ~/gumros/ros/bin/rospc ] ; then ln -s ~/.bashrc.ros ~/gumros/ros/bin/rospc ; fi
  if [ ! -f ${ROS_ROOT}/bin/rosgum ] ; then ln -s ~/.bashrc.gumros ${ROS_ROOT}/bin/rosgum ; fi
  if [ ! -f ~/gumros/ros/bin/rosgum ] ; then ln -s ~/.bashrc.gumros ~/gumros/ros/bin/rosgum ; fi
fi

# Compile the tutorials
source ~/.bashrc.gumros
rosmake roscpp_tutorials
echo "Finished setting up ROS for Gumstix at `date`"

