#!/bin/bash
RED = '\033[0;31m'
GREEN = '\033[0;32m'
NC = '\033[0m'
function op_first_install( ) {
( set -e
echo "Installing op system-wide..."
RC_FILE = " ${ HOME } /. $( basename ${ SHELL } ) rc "
if [ " $( uname) " = = "Darwin" ] && [ $SHELL = = "/bin/bash" ] ; then
RC_FILE = " $HOME /.bash_profile "
fi
printf "\nalias op='source " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " >/dev/null && pwd ) /op.sh" \"\$@\"'\n" >> $RC_FILE
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] op installed successfully. Open a new shell to use it.\n "
)
}
# be default, assume openpilot dir is in current directory
OPENPILOT_ROOT = $( pwd )
function op_check_openpilot_dir( ) {
( set -e
if [ ! -f " $OPENPILOT_ROOT /launch_openpilot.sh " ] ; then
echo "openpilot directory not found!"
return 1
fi
)
}
function op_check_git( ) {
( set -e
cd $OPENPILOT_ROOT
echo "Checking for git..."
if ! command -v "git" > /dev/null 2>& 1; then
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] git not found on your system! "
return 1
else
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] git found on your system.\n "
fi
echo "Checking for git lfs files..."
if [ [ $( file -b $( git lfs ls-files -n | grep "\.so" | head -n 1) ) = = "ASCII text" ] ] ; then
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] git lfs files not found! Run git lfs pull "
return 1
else
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] git lfs files found on your system.\n "
fi
echo "Checking for git submodules..."
if $( git submodule foreach --quiet --recursive 'return 1' 2& > /dev/null) ; then
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] git submodules not found! Run 'git submodule update --init --recursive' "
return 1
else
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] git submodules found on your system.\n "
fi
)
}
function op_check_os( ) {
( set -e
echo "Checking for compatible os version..."
if [ [ " $OSTYPE " = = "linux-gnu" * ] ] ; then
if [ -f "/etc/os-release" ] ; then
source /etc/os-release
case " $VERSION_CODENAME " in
"jammy" | "kinetic" | "noble" | "focal" )
OS_VERSION = "Ubuntu"
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] Ubuntu $VERSION_CODENAME detected.\n "
; ;
* )
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] Incompatible Ubuntu version $VERSION_CODENAME detected! "
return 1
; ;
esac
else
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] No /etc/os-release on your system. Make sure you're running on Ubuntu, or similar! "
return 1
fi
elif [ [ " $OSTYPE " = = "darwin" * ] ] ; then
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] macos detected.\n "
OS_VERSION = "Darwin"
else
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] OS type $OSTYPE not supported! "
return 1
fi
)
}
function op_check_python( ) {
( set -e
echo "Checking for compatible python version..."
export REQUIRED_PYTHON_VERSION = $( grep "requires-python" pyproject.toml | cut -d= -f3- | tr -d '"' | tr -d ' ' )
if ! command -v "python3" > /dev/null 2>& 1; then
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] python3 not found on your system. You need python version at least $REQUIRED_PYTHON_VERSION to continue! "
return 1
else
if $( python3 -c " import sys; quit(not sys.version_info >= tuple(map(int, \" $REQUIRED_PYTHON_VERSION \".split('.')))) " ) ; then
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] $( python3 --version) detected.\n "
else
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] You need python version at least $REQUIRED_PYTHON_VERSION to continue! "
return 1
fi
fi
)
}
# this must be run in the same shell as the user calling "op"
function op_venv( ) {
op_check_openpilot_dir || return 1
source $OPENPILOT_ROOT /.venv/bin/activate || ( echo -e "\nCan't activate venv. Have you ran 'op install' ?" && return 1)
}
function op_check( ) {
( set -e
op_check_openpilot_dir
cd $OPENPILOT_ROOT
op_check_git
op_check_os
op_check_python
)
}
function op_run( ) {
( set -e
op_venv
cd $OPENPILOT_ROOT
$OPENPILOT_ROOT /launch_openpilot.sh
)
}
function op_install( ) {
( set -e
op_check_openpilot_dir
cd $OPENPILOT_ROOT
op_check_os
op_check_python
case " $OS_VERSION " in
"Ubuntu" )
$OPENPILOT_ROOT /tools/ubuntu_setup.sh
; ;
"Darwin" )
$OPENPILOT_ROOT /tools/mac_setup.sh
; ;
esac
git submodule update --init --recursive
git lfs pull
)
}
function op_build( ) {
( set -e
op_venv
cd $OPENPILOT_ROOT
scons $@ || echo -e "\nBuild failed. Have you ran 'op install' ?"
)
}
function op_juggle( ) {
( set -e
op_venv
cd $OPENPILOT_ROOT
$OPENPILOT_ROOT /tools/plotjuggler/juggle.py $@
)
}
function op_default( ) {
echo "An openpilot helper"
echo ""
echo -e "\e[4mUsage:\e[0m op [OPTIONS] <COMMAND>"
echo ""
echo -e "\e[4mCommands:\e[0m"
echo " venv Activate the virtual environment"
echo " check Check system requirements (git, os, python) to start using openpilot"
echo " install Install requirements to use openpilot"
echo " build Build openpilot"
echo " run Run openpilot"
echo " juggle Run Plotjuggler"
echo " help Show this message"
echo " --install Install this tool system wide"
echo ""
echo -e "\e[4mOptions:\e[0m"
echo " -d, --dir"
echo " Specify the openpilot directory you want to use"
echo " Default to the current working directory"
echo ""
echo -e "\e[4mExamples:\e[0m"
echo " op --dir /tmp/openpilot check"
echo " Run the check command on openpilot located in /tmp/openpilot"
echo ""
echo " op juggle --install"
echo " Install plotjuggler in the openpilot located in your current"
echo " working directory"
echo ""
echo " op --dir /tmp/openpilot build -j4"
echo " Run the build command on openpilot located in /tmp/openpilot"
echo " on 4 cores"
}
function _op( ) {
# parse Options
case $1 in
-d | --dir ) shift 1; OPENPILOT_ROOT = " $1 " ; shift 1 ; ;
esac
# parse Commands
case $1 in
venv ) shift 1; op_venv " $@ " ; ;
check ) shift 1; op_check " $@ " ; ;
install ) shift 1; op_install " $@ " ; ;
build ) shift 1; op_build " $@ " ; ;
run ) shift 1; op_run " $@ " ; ;
juggle ) shift 1; op_juggle " $@ " ; ;
--install ) shift 1; op_first_install " $@ " ; ;
* ) op_default " $@ " ; ;
esac
}
_op $@
# remove from env
unset -f _op
unset -f op_check
unset -f op_install
unset -f op_build
unset -f op_run
unset -f op_juggle
unset -f op_venv
unset -f op_check_openpilot_dir
unset -f op_check_git
unset -f op_check_python
unset -f op_check_os
unset -f op_first_install
unset -f op_default