[105] | 1 | #check required version of a lib in host graphic lib (ie i965)
|
---|
| 2 | #return 1 if robomap3 version is not sufficient
|
---|
| 3 | function check_required_lib_ver () {
|
---|
| 4 | DRIVER_LIB=$1
|
---|
| 5 | PATTERN=$2
|
---|
| 6 | LIB=$3
|
---|
| 7 |
|
---|
| 8 | #get the highest required version of $PATTERN
|
---|
| 9 | VER_REQUIRED=$(objdump -T $DRIVER_LIB | grep $PATTERN | sed -e 's/.*'$PATTERN'_\(.*\) .*/\1/' | sort -uV | tail -1)
|
---|
| 10 | #get currently used $LIB
|
---|
| 11 | LIB_PROVIDED=$(ldd $EXEC | grep $LIB | sed -e 's/.*=> \(.*\) (.*/\1/')
|
---|
| 12 | #get the highest version of $PATTERN supported by the $LIB
|
---|
| 13 | VER_PROVIDED=$(objdump -T $LIB_PROVIDED | grep ".*"$PATTERN"_[0-9.]*$" | sed -e 's/.*'$PATTERN'_\(.*\)/\1/' | sort -V | tail -1)
|
---|
| 14 | if [ $(echo -e "$VER_PROVIDED\n$VER_REQUIRED" | sort -V | tail -n1) != $VER_PROVIDED ]; then
|
---|
| 15 | echo "We must use the local system $LIB"
|
---|
| 16 | return 1
|
---|
| 17 | fi
|
---|
| 18 | }
|
---|
| 19 |
|
---|
[2] | 20 | if [ -f /etc/lsb-release ]; then
|
---|
| 21 | . /etc/lsb-release
|
---|
| 22 | fi
|
---|
| 23 |
|
---|
[70] | 24 | if [ _$DISTRIB_ID = _Ubuntu ]; then
|
---|
| 25 | #tested on Ubuntu 17.10
|
---|
[2] | 26 | #we must run as root
|
---|
| 27 | if [ $EUID -ne 0 ]; then
|
---|
| 28 | exec sudo -E $0 $*
|
---|
| 29 | fi
|
---|
| 30 |
|
---|
| 31 | #we must run in root cgroup to escape possible restrictions on scheduling
|
---|
| 32 | if [ -d /sys/fs/cgroup/cpu ]; then
|
---|
| 33 | echo $$ > /sys/fs/cgroup/cpu/tasks
|
---|
| 34 | fi
|
---|
[70] | 35 |
|
---|
[105] | 36 | fi
|
---|
| 37 |
|
---|
| 38 | #special actions if we use 3D
|
---|
| 39 | ldd $EXEC | grep "libGL.so" > /dev/null
|
---|
| 40 | if [ $? -eq 0 ]; then
|
---|
[70] | 41 | #allow root access to the X server
|
---|
| 42 | xhost si:localuser:root
|
---|
| 43 |
|
---|
[105] | 44 | #Mesa DRI driver may need a lib more recent than robomap3's
|
---|
[70] | 45 | ldconfig -p | grep mesa > /dev/null
|
---|
| 46 | if [ $? -eq 0 ]; then
|
---|
[105] | 47 | read DRI_CARD_MAJOR DRI_CARD_MINOR < <(stat -c '%t %T' /dev/dri/card0)
|
---|
| 48 | DRIVER=$(cat /sys/dev/char/$((16#$DRI_CARD_MAJOR)):$((16#$DRI_CARD_MINOR))/device/uevent | grep DRIVER | cut -d= -f2)
|
---|
| 49 | echo "Mesa DRI driver is $DRIVER"
|
---|
| 50 | DRIVER_LIB=$(LIBGL_DEBUG=verbose glxinfo 2>&1 | grep OpenDriver | tail -n 1 | sed -e "s/.* \(.*\)/\1/")
|
---|
| 51 |
|
---|
| 52 | #todo: make a list, find a complete one!
|
---|
| 53 | check_required_lib_ver $DRIVER_LIB GLIBC libm.so.6
|
---|
| 54 | if [ "$?" = "1" ]; then
|
---|
| 55 | ADDED_LIBS=$(ldconfig -p | grep libm.so.6 | cut -d'>' -f2)
|
---|
| 56 | fi
|
---|
| 57 |
|
---|
| 58 | check_required_lib_ver $DRIVER_LIB CXXABI libstdc++.so.6
|
---|
| 59 | if [ "$?" = "1" ]; then
|
---|
| 60 | ADDED_LIBS="$ADDED_LIBS:$(ldconfig -p | grep libstdc++.so.6 | cut -d'>' -f2)"
|
---|
| 61 | fi
|
---|
| 62 | #remove whitespace
|
---|
| 63 | #add libs to LD_PRELOAD if version robomap3 version is not sufficient
|
---|
| 64 | export LD_PRELOAD="$(echo -e "${ADDED_LIBS}" | tr -d '[:space:]')"
|
---|
[70] | 65 | fi
|
---|
[2] | 66 | fi
|
---|
| 67 |
|
---|
[105] | 68 |
|
---|
| 69 |
|
---|