Setup

The following bash script can be used to completely setup the environment for the software project on a Linux-based system. All required software is fetched from the internet and installed by the script.
Just copy the code below to a file (i.e. setup.sh) and make it executable (chmod u+x setup.sh). Then, run the script like

>$ ./setup.sh.


#!/bin/bash

#############
# FUNCTIONS #
#############

# print an error
function printError {
  echo "$(tput setaf 1)>>> ERROR: $1$(tput sgr 0)" 
}

# print a warning
function printWarning {
  echo "$(tput setaf 3)>>> WARNING: $1$(tput sgr 0)" 
}

# print an information text
function printInfo {
  echo "$(tput setaf 4)>>> INFO: $1$(tput sgr 0)" 
}

############
### MAIN ###
############

### make sure the user can switch to root permissions
printInfo "Some commands in this skript require root permissions." 
printInfo "This is now tested for once by executing 'sudo echo \${PWD}'..." 
sudo echo ${PWD}
if [ $? != 0 ]; then
  printError "Insufficient permissions." 
  exit 1
fi

### Ask whether this a temporary directory?
printInfo "You should run this script in a temporary directory." 
printInfo "The current directory is '${PWD}'." 
read -p "Continue? [Y/n] " user_input
# abort if the answer was neither empty nor 'yes'
if ! [ "${user_input}" = "" ] && ! [ "${user_input}" = "Y" ] && ! [ "${user_input}" = "y" ] && ! [ "${user_input}" = "Yes" ] && ! [ "${user_input}" = "yes" ]; then
  printWarning "aborted" 
  exit 1
fi

### set some variables before we start
printInfo "setting temporary variables..." 
# the directory where this script is executed
EXEC_DIR=${PWD}
# installation directory which is in the PATH variable
INSTALL_DIR="/usr/local/bin" 
# directory where the big binaries go
PROG_DIR="/opt" 

### Install required packages
printInfo "installing cmake, git, and required 32bit libraries..." 
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get -y install cmake git libc6:i386 libstdc++6:i386 libncurses5:i386 gcc g++

### configure GIT
if [[ -z $(git config --global user.name) ]] || [[ -z $(git config --global user.email) ]]; then
  printInfo "GIT configuration incomplete..." 
  user_input="" 
  while [[ -z $user_input ]]; do
    read -p "full name: " user_input
  done
  git config --global user.name "$user_input" 
  user_input="" 
  while [[ -z $user_input ]]; do
    read -p "email: " user_input
  done
  git config --global user.email "$user_input" 
fi

### Install and configure gtkterm
printInfo "installing gtkterm..." 
sudo apt-get -y install gtkterm
printInfo "starting gtkterm..." 
printInfo "Please ignore all warnings (if any) and close the application again." 
read
gtkterm
if [ -f ${HOME}/.gtktermrc ]; then
  printf "\n" >> ${HOME}/.gtktermrc
  printf "[AMiRo]\n" >> ${HOME}/.gtktermrc
  printf "port    = /dev/ttyUSB0\n" >> ${HOME}/.gtktermrc
  printf "speed    = 115200\n" >> ${HOME}/.gtktermrc
  printf "bits    = 8\n" >> ${HOME}/.gtktermrc
  printf "stopbits    = 1\n" >> ${HOME}/.gtktermrc
  printf "parity    = none\n" >> ${HOME}/.gtktermrc
  printf "flow    = none\n" >> ${HOME}/.gtktermrc
  printf "wait_delay    = 0\n" >> ${HOME}/.gtktermrc
  printf "wait_char    = -1\n" >> ${HOME}/.gtktermrc
  printf "rs485_rts_time_before_tx    = 30\n" >> ${HOME}/.gtktermrc
  printf "rs485_rts_time_after_tx    = 30\n" >> ${HOME}/.gtktermrc
  printf "echo    = False\n" >> ${HOME}/.gtktermrc
  printf "crlfauto    = True\n" >> ${HOME}/.gtktermrc
  printf "font    = \"Nimbus Mono L, 11\"\n" >> ${HOME}/.gtktermrc
  printf "term_transparency    = False\n" >> ${HOME}/.gtktermrc
  printf "term_show_cursor    = True\n" >> ${HOME}/.gtktermrc
  printf "term_rows    = 80\n" >> ${HOME}/.gtktermrc
  printf "term_columns    = 25\n" >> ${HOME}/.gtktermrc
  printf "term_scrollback    = 10000\n" >> ${HOME}/.gtktermrc
  printf "term_visual_bell    = True\n" >> ${HOME}/.gtktermrc
  printf "term_foreground_red    = 43253\n" >> ${HOME}/.gtktermrc
  printf "term_foreground_blue    = 43253\n" >> ${HOME}/.gtktermrc
  printf "term_foreground_green    = 43253\n" >> ${HOME}/.gtktermrc
  printf "term_background_red    = 0\n" >> ${HOME}/.gtktermrc
  printf "term_background_blue    = 0\n" >> ${HOME}/.gtktermrc
  printf "term_background_green    = 0\n" >> ${HOME}/.gtktermrc
  printf "term_background_saturation    = 0,500000\n" >> ${HOME}/.gtktermrc
else
  printWarning "Configuration file ${HOME}/.gtktermrc does not exit.\n" 
  printWarning "Create the file with the following content:" 
  printf "[AMiRo]\n" 
  printf "port    = /dev/ttyUSB0\n" 
  printf "speed    = 115200\n" 
  printf "bits    = 8\n" 
  printf "stopbits    = 1\n" 
  printf "parity    = none\n" 
  printf "flow    = none\n" 
  printf "wait_delay    = 0\n" 
  printf "wait_char    = -1\n" 
  printf "rs485_rts_time_before_tx    = 30\n" 
  printf "rs485_rts_time_after_tx    = 30\n" 
  printf "echo    = False\n" 
  printf "crlfauto    = True\n" 
  printf "font    = \"Nimbus Mono L, 11\"\n" 
  printf "term_transparency    = False\n" 
  printf "term_show_cursor    = True\n" 
  printf "term_rows    = 80\n" 
  printf "term_columns    = 25\n" 
  printf "term_scrollback    = 10000\n" 
  printf "term_visual_bell    = True\n" 
  printf "term_foreground_red    = 43253\n" 
  printf "term_foreground_blue    = 43253\n" 
  printf "term_foreground_green    = 43253\n" 
  printf "term_background_red    = 0\n" 
  printf "term_background_blue    = 0\n" 
  printf "term_background_green    = 0\n" 
  printf "term_background_saturation    = 0,500000\n" 
  read
fi
printInfo "Use gtkterm like this: >$ gtkterm -c AMiRo" 
read -p "Do you want an alias ('amiroterm') for that? [y/N] " user_input
# create alias only if the answer was explicitly 'yes'
if [ "${user_input}" = "Y" ] || [ "${user_input}" = "y" ] || [ "${user_input}" = "Yes" ] || [ "${user_input}" = "yes" ]; then
  echo "" >> ${HOME}/.bashrc
  echo "# shortcut for gtkterm call for AMiRo communication (press F8 to toggle the RTS pin)" >> ${HOME}/.bashrc
  echo "alias amiroterm='gtkterm -c AMiRo'" >> ${HOME}/.bashrc
  printInfo "alias 'amiroterm' created." 
fi

### Install hterm
read -p "Do you want to install the optional hterm tool? [y/N] " user_input
# install only if the answer was explicitly 'yes'
if [ "${user_input}" = "Y" ] || [ "${user_input}" = "y" ] || [ "${user_input}" = "Yes" ] || [ "${user_input}" = "yes" ]; then
  printInfo "installing hterm..." 
  HTERM_LOCATION="http://www.der-hammer.info/terminal/hterm.tar.gz" 
  wget ${HTERM_LOCATION}
  tar -xzf `basename ${HTERM_LOCATION}`
  cp ./hterm ${INSTALL_DIR}
  unset HTERM_LOCATION
fi

#### OPTIONAL: Install BeBot/AMiRo cross compiler for CognitionBoard 
#printInfo "installing poky..." 
#INSTALL_DIR="/opt/poky/1.5+snapshot-20140203" 
#${SRC_FOLDER}/poky-eglibc-x86_64-meta-toolchain-openrobotix-cortexa8hf-vfp-neon-toolchain-openrobotix-1.5+snapshot-20140203.sh -d "${INSTALL_DIR}" -y
printWarning "This script does not install the Poky cross compiler yet. [TODO]" 

### STM32FLASH
printInfo "installing stm32flash..." 
STM32FLASH_DIR="stm32flash" 
git clone git://git.code.sf.net/p/stm32flash/code ${STM32FLASH_DIR}
cd ${STM32FLASH_DIR}
git checkout fb52b4d80613b19b28ab82ba9fa415378d00fb9a
make
cp ./stm32flash ${INSTALL_DIR}
cd ${EXEC_DIR}
unset STM32FLASH_DIR

### arm-gnu-none-eabi
printInfo "installing arm-gnu-none-eabi..." 
ARM_GCC_LOCATION="https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q1-update/+download/gcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2" 
wget ${ARM_GCC_LOCATION}
ARM_GCC_TARBALL=`basename ${ARM_GCC_LOCATION}`
tar -jxf ${ARM_GCC_TARBALL}
COMPILER_DIR=`tar --bzip2 -tf ${ARM_GCC_TARBALL} | sed -e 's@/.*@@' | uniq`
sudo cp -fR "${EXEC_DIR}/${COMPILER_DIR}" ${PROG_DIR}
# Link the programs to the ${INSTALL_DIR} directory
sudo sh -c 'ls ${PROG_DIR}/${COMPILER_DIR}/bin/ | xargs -i ln -sf ${PROG_DIR}/${COMPILER_DIR}/bin/{} ${INSTALL_DIR}/{}'
unset ARM_GCC_LOCATION
unset ARM_GCC_TARBALL
unset COMPILER_DIR

### Create a UDEV rule, that everyone can access the /dev/ttyUSB* devices
printInfo "setting USB permissions..." 
sudo echo 'KERNEL=="ttyUSB[0-9]*",NAME="tts/USB%n",SYMLINK+="%k",MODE="0666"' > /etc/udev/rules.d/50-ttyusb.rules

### Installation path
printInfo "The required repositories with all source code will be cloned now." 
printInfo "Please specify installation path." 
user_input="" 
while [ -z $user_input ]; do
  read -p "installation path: " -e user_input
  if [ -z $user_input ]; then
    printError "invalid input" 
  fi
done
CLONE_PATH=${user_input}
if [ ${CLONE_PATH:0:1} == "~" ]; then
  CLONE_PATH=${CLONE_PATH:1}
  CLONE_PATH=${HOME}/$CLONE_PATH
fi
mkdir -p $(realpath -m ${CLONE_PATH})

### AMiRo-BLT
printInfo "cloning AMiRo-BLT repository to ${CLONE_PATH}/amiro-blt..." 
cd ${CLONE_PATH}
git clone http://openresearch.cit-ec.de/git/amiro-os.amiro-blt.git -b 1.0_stable amiro-blt
cd ${EXEC_DIR}

### AMiRo-OS
printInfo "cloning AMiRo-OS repository to ${CLONE_PATH}/amiro-os..." 
cd ${CLONE_PATH}
git clone http://openresearch.cit-ec.de/git/amiro-os.amiro-os.git -b 1.0_stable amiro-os
cd ${EXEC_DIR}

### ChibiOS
printInfo "cloning ChibiOS repository to ${CLONE_PATH}/ChibiOS..." 
cd ${CLONE_PATH}
git clone https://github.com/ChibiOS/ChibiOS.git ChibiOS
cd ChibiOS
git checkout 2e6dfc7364e7551483922ea6afbaea8f3501ab0e
cd ${EXEC_DIR}

### ChibiOS patches
printInfo "applying custom patches to ChibiOS..." 
cd ${CLONE_PATH}/ChibiOS
cp ../amiro-os/patches/* ./
for i in `ls | grep patch`; do git am --ignore-space-change --ignore-whitespace < ${i}; done
cd ${EXEC_DIR}

### SerailBoot
printInfo "installing SerialBoot..." 
cd ${CLONE_PATH}/amiro-blt/Host/Source/SerialBoot
mkdir build
cd build
cmake ..
make
cd ${EXEC_DIR}

### clean up
printInfo "done" 
read -p "Do you want this directory to be deleted? [y/N] " user_input
# delete only if the answer was explicitly 'yes'
if [ "${user_input}" = "Y" ] || [ "${user_input}" = "y" ] || [ "${user_input}" = "Yes" ] || [ "${user_input}" = "yes" ]; then
  printInfo "deleting ${EXEC_DIR}..." 
  cd ..
  rm -rf `basename ${EXEC_DIR}`
else
  printInfo "Please cleanup this directory manually." 
fi

### unset all remaining variables
printInfo "clearing temporary variables..." 
unset CLONE_PATH
unset INSTALL_DIR
unset EXEC_DIR
unset PROG_DIR
unset user_input

### done
printInfo "setup done." 
printWarning "Several new environment variables have been set.\nStart a new shell so these changes will be applied." 
read -p "I got it!"