Skip to content

Commit

Permalink
Tools: prereqs-ubuntu: cleanup and improvements
Browse files Browse the repository at this point in the history
reorder install
remove unneeded package
make install verbose
add environment variable to control what to install
register STM toolchain on CCache

Tools: install-prereqs-ubuntu.sh: only update package list once

Tools: install-prereqs-ubuntu.sh: move STM toolchain registery into install step

Tools: install-prereqs-ubuntu.sh: use right comparison for variable value

Tools: install-prereqs-ubuntu.sh: always check for libtool-bin

Tools: install-prereqs-ubuntu.sh: Add support for Ubuntu 20.04

Add a selection for python version
ass python symlink for ubuntu 20.04
Move python-argparse out of default list as it install python2 version

Tools: install-prereqs-ubuntu.sh:Tools: Check python version for python3 distro

Tools: install-prereqs-ubuntu.sh: install pygame requirements

Tools: install-prereqs-ubuntu.sh: check for docker envirement and use .bashrc instead of .profile

Tools: install-prereqs-ubuntu.sh: add bash completion by default

Tools: install-prereqs-ubuntu.sh: better ccache management

Tools: install-prereqs-ubuntu.sh: Correct package installation for trusty
  • Loading branch information
khancyr authored and peterbarker committed Apr 30, 2020
1 parent 2b2dcbb commit 64b7e8f
Showing 1 changed file with 196 additions and 76 deletions.
272 changes: 196 additions & 76 deletions Tools/environment_install/install-prereqs-ubuntu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,49 @@ if [ $EUID == 0 ]; then
fi

OPT="/opt"
# Ardupilot Tools
ARDUPILOT_TOOLS="Tools/autotest"

ASSUME_YES=false
QUIET=false
sep="##############################################"

OPTIND=1 # Reset in case getopts has been used previously in the shell.
while getopts "yq" opt; do
case "$opt" in
\?)
exit 1
;;
y) ASSUME_YES=true
;;
q) QUIET=true
;;
esac
done

APT_GET="sudo apt-get"
if $ASSUME_YES; then
APT_GET="$APT_GET --assume-yes"
fi
if $QUIET; then
APT_GET="$APT_GET -qq"
fi

# update apt package list
$APT_GET update

# Install lsb-release as it is needed to check Ubuntu version
if ! dpkg-query -l "lsb-release"; then
echo "$sep"
echo "Installing lsb-release"
echo "$sep"
$APT_GET install lsb-release
echo "Done!"
fi

# Checking Ubuntu release to adapt software version to install
RELEASE_CODENAME=$(lsb_release -c -s)
PYTHON_V="python" # starting from ubuntu 20.04, python isn't symlink to default python interpreter
if [ ${RELEASE_CODENAME} == 'xenial' ]; then
SITLFML_VERSION="2.3v5"
SITLCFML_VERSION="2.3"
Expand All @@ -19,42 +61,63 @@ elif [ ${RELEASE_CODENAME} == 'disco' ]; then
elif [ ${RELEASE_CODENAME} == 'eoan' ]; then
SITLFML_VERSION="2.5"
SITLCFML_VERSION="2.5"
elif [ ${RELEASE_CODENAME} == 'focal' ]; then
SITLFML_VERSION="2.5"
SITLCFML_VERSION="2.5"
PYTHON_V="python3"
elif [ ${RELEASE_CODENAME} == 'trusty' ]; then
SITLFML_VERSION="2"
SITLCFML_VERSION="2"
else
SITLFML_VERSION="2.4"
SITLCFML_VERSION="2.4"
fi

BASE_PKGS="build-essential ccache g++ gawk git make wget"
# Lists of packages to install
BASE_PKGS="build-essential ccache g++ gawk git make wget cmake"
PYTHON_PKGS="future lxml pymavlink MAVProxy pexpect"
# add some Python packages required for commonly-used MAVProxy modules and hex file generation:
PYTHON_PKGS="$PYTHON_PKGS pygame intelhex"
PX4_PKGS="python-argparse openocd flex bison libncurses5-dev \
autoconf texinfo libftdi-dev zlib1g-dev \
zip genromfs python-empy cmake cmake-data"
if [[ $SKIP_AP_EXT_ENV -ne 1 ]]; then
PYTHON_PKGS="$PYTHON_PKGS pygame intelhex"
fi
ARM_LINUX_PKGS="g++-arm-linux-gnueabihf pkg-config-arm-linux-gnueabihf"
# python-wxgtk packages are added to SITL_PKGS below
SITL_PKGS="libtool libxml2-dev libxslt1-dev python-dev python-pip python-setuptools python-matplotlib python-serial python-scipy python-opencv python-numpy python-pyparsing xterm lcov gcovr"
SITL_PKGS="libtool libxml2-dev libxslt1-dev ${PYTHON_V}-dev ${PYTHON_V}-pip ${PYTHON_V}-setuptools ${PYTHON_V}-numpy ${PYTHON_V}-pyparsing"
# add some packages required for commonly-used MAVProxy modules:
SITL_PKGS="$SITL_PKGS libcsfml-dev libcsfml-audio${SITLCFML_VERSION} libcsfml-dev libcsfml-graphics${SITLCFML_VERSION} libcsfml-network${SITLCFML_VERSION} libcsfml-system${SITLCFML_VERSION} libcsfml-window${SITLCFML_VERSION} libsfml-audio${SITLFML_VERSION} libsfml-dev libsfml-graphics${SITLFML_VERSION} libsfml-network${SITLFML_VERSION} libsfml-system${SITLFML_VERSION} libsfml-window${SITLFML_VERSION} python-yaml python3-yaml"

ASSUME_YES=false
QUIET=false

MACHINE_TYPE=$(uname -m)
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
PX4_PKGS+=" libc6-i386"
else
echo "no extra pkgs for i386"
if [[ $SKIP_AP_GRAPHIC_ENV -ne 1 ]]; then
SITL_PKGS="$SITL_PKGS xterm ${PYTHON_V}-matplotlib ${PYTHON_V}-serial ${PYTHON_V}-scipy ${PYTHON_V}-opencv libcsfml-dev libcsfml-audio${SITLCFML_VERSION} libcsfml-dev libcsfml-graphics${SITLCFML_VERSION} libcsfml-network${SITLCFML_VERSION} libcsfml-system${SITLCFML_VERSION} libcsfml-window${SITLCFML_VERSION} libsfml-audio${SITLFML_VERSION} libsfml-dev libsfml-graphics${SITLFML_VERSION} libsfml-network${SITLFML_VERSION} libsfml-system${SITLFML_VERSION} libsfml-window${SITLFML_VERSION} ${PYTHON_V}-yaml"
fi
if [[ $SKIP_AP_COV_ENV -ne 1 ]]; then
# Coverage utilities
COVERAGE_PKGS="lcov gcovr"
fi

# GNU Tools for ARM Embedded Processors
# (see https://launchpad.net/gcc-arm-embedded/)
ARM_ROOT="gcc-arm-none-eabi-6-2017-q2-update"
ARM_TARBALL="$ARM_ROOT-linux.tar.bz2"
ARM_TARBALL_URL="https://firmware.ardupilot.org/Tools/STM32-tools/$ARM_TARBALL"

# Ardupilot Tools
ARDUPILOT_TOOLS="Tools/autotest"
# ArduPilot official Toolchain for STM32 boards
function install_arm_none_eabi_toolchain() {
# GNU Tools for ARM Embedded Processors
# (see https://launchpad.net/gcc-arm-embedded/)
ARM_ROOT="gcc-arm-none-eabi-6-2017-q2-update"
ARM_TARBALL="$ARM_ROOT-linux.tar.bz2"
ARM_TARBALL_URL="https://firmware.ardupilot.org/Tools/STM32-tools/$ARM_TARBALL"
if [ ! -d $OPT/$ARM_ROOT ]; then
(
cd $OPT;
echo "$sep"
echo "Installing toolchain for STM32 Boards"
echo "$sep"
echo "Downloading from ArduPilot server"
sudo wget $ARM_TARBALL_URL
echo "Installing..."
sudo tar xjf ${ARM_TARBALL}
echo "... Cleaning"
sudo rm ${ARM_TARBALL};
)
fi
echo "Registering STM32 Toolchain for ccache"
sudo ln -s $CCACHE_PATH /usr/lib/ccache/arm-none-eabi-g++
sudo ln -s $CCACHE_PATH /usr/lib/ccache/arm-none-eabi-gcc
echo "Done!"
}

function maybe_prompt_user() {
if $ASSUME_YES; then
Expand All @@ -69,98 +132,155 @@ function maybe_prompt_user() {
fi
}


OPTIND=1 # Reset in case getopts has been used previously in the shell.
while getopts "y" opt; do
case "$opt" in
\?)
exit 1
;;
y) ASSUME_YES=true
;;
q) QUIET=true
;;
esac
done

APT_GET="sudo apt-get"
if $ASSUME_YES; then
APT_GET="$APT_GET --assume-yes"
fi
if $QUIET; then
APT_GET="$APT_GET -qq"
fi

if ! dpkg-query -l "lsb-release"; then
$APT_GET install lsb-release
fi
# possibly grab a newer cmake for older ubuntu releases
read -r UBUNTU_CODENAME <<<$(lsb_release -c -s)
if [ "$UBUNTU_CODENAME" = "precise" ]; then
if [ ${RELEASE_CODENAME} == "precise" ]; then
sudo add-apt-repository ppa:george-edison55/precise-backports -y
elif [ "$UBUNTU_CODENAME" = "trusty" ]; then
$APT_GET update
elif [ ${RELEASE_CODENAME} == "trusty" ]; then
sudo add-apt-repository ppa:george-edison55/cmake-3.x -y
$APT_GET update
fi

echo "$sep"
echo "Add user to dialout group to allow managing serial ports"
echo "$sep"
sudo usermod -a -G dialout $USER
echo "Done!"

echo "$sep"
echo "Removing modemmanager package that could conflict with firmware uploading"
echo "$sep"
if dpkg-query -l "modemmanager"; then
$APT_GET remove modemmanager
fi
$APT_GET update
echo "Done!"

if apt-cache search python-wxgtk3.0 | grep wx; then
SITL_PKGS+=" python-wxgtk3.0 libtool-bin"
# Add back python symlink to python interpreter on Ubuntu >= 20.04
if [ ${RELEASE_CODENAME} == 'focal' ]; then
BASE_PKGS+=" python-is-python3"
SITL_PKGS+=" libpython3-stdlib" # for argparse
else
# we only support back to trusty:
SITL_PKGS+=" python-wxgtk2.8"
SITL_PKGS+=" python-argparse"
fi

# Check for graphical package for MAVProxy
if [[ $SKIP_AP_GRAPHIC_ENV -ne 1 ]]; then
if [ ${RELEASE_CODENAME} == 'focal' ]; then
SITL_PKGS+=" python3-wxgtk4.0"
SITL_PKGS+=" fonts-freefont-ttf libfreetype6-dev libjpeg8-dev libpng16-16 libportmidi-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsdl1.2-dev" # for pygame
elif apt-cache search python-wxgtk3.0 | grep wx; then
SITL_PKGS+=" python-wxgtk3.0"
else
# we only support back to trusty:
SITL_PKGS+=" python-wxgtk2.8"
SITL_PKGS+=" fonts-freefont-ttf libfreetype6-dev libjpeg8-dev libpng12-0 libportmidi-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsdl1.2-dev" # for pygame
fi
fi

# Check if we need to manually install realpath
RP=$(apt-cache search -n '^realpath$')
if [ -n "$RP" ]; then
BASE_PKGS+=" realpath"
fi

$APT_GET install $BASE_PKGS $SITL_PKGS $PX4_PKGS $ARM_LINUX_PKGS
pip2 -q install --user -U $PYTHON_PKGS
# Check if we need to manually install libtool-bin
LBTBIN=$(apt-cache search -n '^libtool-bin')
if [ -n "$LBTBIN" ]; then
SITL_PKGS+=" libtool-bin"
fi

# Install all packages
$APT_GET install $BASE_PKGS $SITL_PKGS $PX4_PKGS $ARM_LINUX_PKGS $COVERAGE_PKGS
# Check python version for distro that don't have python2 support by default
PYTHON_VERSION_MAJOR=$(python -c"import sys; print(sys.version_info.major)")
if [ "$PYTHON_VERSION_MAJOR" -eq 2 ]; then
pip2 install --user -U $PYTHON_PKGS
elif [ "$PYTHON_VERSION_MAJOR" -eq 3 ]; then
pip3 install --user -U $PYTHON_PKGS
else
echo "Unknown python version: $PYTHON_VERSION_MAJOR"
fi

if [ ! -d $OPT/$ARM_ROOT ]; then
(
cd $OPT;
sudo wget $ARM_TARBALL_URL;
sudo tar xjf ${ARM_TARBALL};
sudo rm ${ARM_TARBALL};
)
if [[ -z "${DO_AP_STM_ENV}" ]] && maybe_prompt_user "Install ArduPilot STM32 toolchain [N/y]?" ; then
DO_AP_STM_ENV=1
fi

CCACHE_PATH=$(which ccache)
if [[ $DO_AP_STM_ENV -eq 1 ]]; then
install_arm_none_eabi_toolchain
fi

echo "$sep"
echo "Check if we are inside docker environment..."
echo "$sep"
IS_DOCKER=false
if [[ -f /.dockerenv ]] || grep -Eq '(lxc|docker)' /proc/1/cgroup ; then
IS_DOCKER=true
fi
echo "Done!"

SHELL_LOGIN=".profile"
if $IS_DOCKER; then
echo "Inside docker, we add the tools path into .bashrc directly"
SHELL_LOGIN=".bashrc"
fi

echo "$sep"
echo "Adding ArduPilot Tools to environment"
echo "$sep"

SCRIPT_DIR=$(dirname $(realpath ${BASH_SOURCE[0]}))
ARDUPILOT_ROOT=$(realpath "$SCRIPT_DIR/../../")

exportline="export PATH=$OPT/$ARM_ROOT/bin:\$PATH";
grep -Fxq "$exportline" ~/.profile 2>/dev/null || {
grep -Fxq "$exportline" ~/$SHELL_LOGIN 2>/dev/null || {
if maybe_prompt_user "Add $OPT/$ARM_ROOT/bin to your PATH [N/y]?" ; then
echo $exportline >> ~/.profile
echo $exportline >> ~/$SHELL_LOGIN
eval $exportline
else
echo "Skipping adding $OPT/$ARM_ROOT/bin to PATH."
fi
}

exportline2="export PATH=$ARDUPILOT_ROOT/$ARDUPILOT_TOOLS:\$PATH";
grep -Fxq "$exportline2" ~/.profile 2>/dev/null || {
grep -Fxq "$exportline2" ~/$SHELL_LOGIN 2>/dev/null || {
if maybe_prompt_user "Add $ARDUPILOT_ROOT/$ARDUPILOT_TOOLS to your PATH [N/y]?" ; then
echo $exportline2 >> ~/.profile
echo $exportline2 >> ~/$SHELL_LOGIN
eval $exportline2
else
echo "Skipping adding $ARDUPILOT_ROOT/$ARDUPILOT_TOOLS to PATH."
fi
}

apt-cache search arm-none-eabi
exportline3="source $ARDUPILOT_ROOT/Tools/completion/completion.bash";
grep -Fxq "$exportline3" ~/$SHELL_LOGIN 2>/dev/null || {
if maybe_prompt_user "Add ArduPilot Bash Completion to your bash shell [N/y]?" ; then
echo $exportline3 >> ~/.bashrc
eval $exportline3
else
echo "Skipping adding ArduPilot Bash Completion."
fi
}


exportline4="export PATH=/usr/lib/ccache:\$PATH";
grep -Fxq "$exportline4" ~/$SHELL_LOGIN 2>/dev/null || {
if maybe_prompt_user "Append CCache to your PATH [N/y]?" ; then
echo $exportline4 >> ~/$SHELL_LOGIN
eval $exportline4
else
echo "Skipping appending CCache to PATH."
fi
}
echo "Done!"

(
cd $ARDUPILOT_ROOT
git submodule update --init --recursive
)
if [[ $SKIP_AP_GIT_CHECK -ne 1 ]]; then
if [ -d ".git" ]; then
echo "$sep"
echo "Update git submodules"
echo "$sep"
cd $ARDUPILOT_ROOT
git submodule update --init --recursive
echo "Done!"
fi
fi
echo "---------- $0 end ----------"

0 comments on commit 64b7e8f

Please sign in to comment.