Preparing a Cross-Compilation Sysroot
- installing arm64 Debian dependencies with qemu-chroot
export SYSROOT=~/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/drive-t186ref-linux/targetfs_a cd $SYSROOT sudo apt-get install qemu-user-static sudo cp /usr/bin/qemu-aarch64-static usr/bin/ sudo cp -ib /etc/resolv.conf etc sudo mount -o bind /dev dev sudo mount -o bind /proc proc sudo mount -o bind /sys sys sudo LC_ALL=C chroot . # apt-get update # apt-get install libboost-all-dev libtinyxml-dev libtinyxml2-dev liblz4-dev libbz2-dev libapr1 libaprutil1 libconsole-bridge-dev libpoco-dev libgpgme-dev python-defusedxml python-rospkg python-catkin-pkg python-netifaces liblog4cxx-dev # exit sudo umount sys proc dev sudo rm usr/bin/qemu-aarch64-static sudo mv etc/resolv.conf~ etc/resolv.conf sudo rm -rf var/lib/apt/lists/* sudo rm -rf dev/* sudo rm -rf var/log/* sudo rm -rf var/tmp/* sudo rm -rf var/cache/apt/archives/*.deb sudo rm -rf tmp/*
Fixing Broken Symlinks
- When dependencies are installed with qemu-chroot, the root file system may contain symlinks similar to the following: /usr/lib/aarch64-linux-gnu/libXXXX.so -> /lib/aarch64-linux-gnu/libXXXX.so.versio.no. These symlinks resolve on the arm64 platform but are broken on the host system. Attempts to link libXXXX.so are unsuccessful.To correct broken symlinks
- The broken symlinks can be fixed temporarily with overlays, using commands similar to the following:
sudo mkdir /lib/aarch64-linux-gnu sudo mkdir /tmp/ros-cc-overlayfs sudo mount -t overlay -o lowerdir=$SYSROOT/lib/aarch64-linux-gnu,upperdir=/lib/aarch64-linux-gnu,workdir=/tmp/ros-cc-overlayfs overlay /lib/aarch64-linux-gnu
Downloading Sources
- ROS Bare Bone source code can be downloaded from the upstream repositories using the python utilities python-rosinstall-generator and python-wstool.
- To install python-rosinstall-generator and python-wstool
sudo sh -c 'echo \ "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt-get update sudo apt install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential python-empy libgtest-dev
- To download the source code
mkdir $HOME/ros_catkin_ws && cd $HOME/ros_catkin_ws rosinstall_generator ros_comm --rosdistro melodic --deps --tar > melodic-ros_comm.rosinstall wstool init -j8 src melodic-ros_comm.rosinstall
Invoking the Cross Compiler
- create Toolchain-V5L.cmake with below content for cross compilation
set(CMAKE_SYSTEM_NAME Linux) # Specify the cross compiler set(TOOLCHAIN "$ENV{HOME}/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu") set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-gnu-g++") set(CMAKE_C_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-gnu-gcc") # Targetfs path set(ROS_SYSROOT "$ENV{HOME}/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/drive-t186ref-linux/targetfs_a") # Library paths set(LD_PATH "${ROS_SYSROOT}/usr/lib/aarch64-linux-gnu") set(LD_PATH_EXTRA "${ROS_SYSROOT}/lib/aarch64-linux-gnu") # setup compiler for cross-compilation set(CMAKE_CXX_FLAGS "-fPIC" CACHE STRING "c++ flags") set(CMAKE_C_FLAGS "-fPIC" CACHE STRING "c flags") set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags") set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags") set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "executable linker flags") set(CMAKE_FIND_ROOT_PATH ${ROS_SYSROOT}) # Set compiler flags set(CMAKE_SHARED_LINKER_FLAGS "--sysroot=${CMAKE_FIND_ROOT_PATH} -L${LD_PATH} -L${LD_PATH_EXTRA} -Wl,-rpath,${LD_PATH} -Wl,-rpath,${LD_PATH_EXTRA} -Wl,-rpath,${LD_PATH} -Wl,-rpath,${LD_PATH_EXTRA} ${CMAKE_SHARED_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS "--sysroot=${CMAKE_FIND_ROOT_PATH} -L${LD_PATH} -L${LD_PATH_EXTRA} -Wl,-rpath,${LD_PATH} -Wl,-rpath,${LD_PATH_EXTRA} -Wl,-rpath,${LD_PATH} -Wl,-rpath,${LD_PATH_EXTRA} ${CMAKE_SHARED_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "--sysroot=${CMAKE_FIND_ROOT_PATH} -L${LD_PATH} -L${LD_PATH_EXTRA} -Wl,-rpath,${LD_PATH} -Wl,-rpath,${LD_PATH_EXTRA} -Wl,-rpath,${LD_PATH_EXTRA} ${CMAKE_EXE_LINKER_FLAGS}") set(CMAKE_C_FLAGS "-fPIC --sysroot=${CMAKE_FIND_ROOT_PATH} -fpermissive -g" CACHE INTERNAL "" FORCE) set(CMAKE_CXX_FLAGS "-fPIC --sysroot=${CMAKE_FIND_ROOT_PATH} -fpermissive -g" CACHE INTERNAL "" FORCE) # Search for programs only in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Search for libraries and headers only in the target directories set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # set system default include dir include_directories(BEFORE SYSTEM ${VIBRANTE_PDK}/include)
- To cross-compile ROS
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=<Toolchain-V5L.cmake file path>
- After cross-compilation is complete, revert the overlayfs mount with the following commands:
sudo umount /lib/aarch64-linux-gnu sudo rm -rf /tmp/ros-cc-overlayfs
Verifying
- scp ~/ros_catkin_ws/install_isolated directory to the target and refer to http://wiki.ros.org/ROS/Tutorials to further verification.