<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.openmower.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Damme</id>
	<title>Open Mower Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.openmower.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Damme"/>
	<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Special:Contributions/Damme"/>
	<updated>2026-04-30T18:35:25Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=383</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=383"/>
		<updated>2024-05-29T09:02:07Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* TODO/Fix me */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* check the build with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find devel/ -type f -executable |xargs file&lt;br /&gt;
devel/_setup_util.py:                                      Python script, ASCII text executable&lt;br /&gt;
devel/env.sh:                                              a /usr/bin/env sh script, ASCII text executable&lt;br /&gt;
devel/lib/mower_utils/planner_test:                        ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_utils/xbot_pose_converter:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xesc_driver/xesc_driver_node:                    ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_2040_driver.so:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/ntrip_client/ntrip_ros.py:                       Python script, ASCII text executable&lt;br /&gt;
devel/lib/mower_simulation/mower_simulation:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libvesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_comms/mower_comms:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_map/mower_map_service:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libftc_local_planner.so:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_positioning/xbot_positioning:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_sensor_example:             ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_monitoring:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/heatmap_generator:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_driver_gps/driver_gps_node:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mag_calibration:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/monitoring:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_odometry:                      ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_logic:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/slic3r_coverage_planner/slic3r_coverage_planner: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_remote/xbot_remote:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* rsync folder to raspberry pi, note the section below!&lt;br /&gt;
&lt;br /&gt;
==== TODO/Fix me ====&lt;br /&gt;
* Fix &amp;lt;code&amp;gt;[project]/devel/setup.sh&amp;lt;/code&amp;gt; - scripts to use correct paths, maybe have a wrapper for setup.sh that setup some env vars for example CMAKE_PREFIX_PATH to omit sysroot_arm64 path, need to figure out what paths are wrong. Seems &amp;lt;code&amp;gt;_setup_util.py&amp;lt;/code&amp;gt; is the script that setup ros enviroment. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# One temporary fix is to create a link on the RPi:&lt;br /&gt;
$ ln -s / /opt/sysroot_arm64/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* a script to generate packages.txt&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=382</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=382"/>
		<updated>2024-05-29T08:55:25Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* TODO/Fix me */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* check the build with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find devel/ -type f -executable |xargs file&lt;br /&gt;
devel/_setup_util.py:                                      Python script, ASCII text executable&lt;br /&gt;
devel/env.sh:                                              a /usr/bin/env sh script, ASCII text executable&lt;br /&gt;
devel/lib/mower_utils/planner_test:                        ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_utils/xbot_pose_converter:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xesc_driver/xesc_driver_node:                    ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_2040_driver.so:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/ntrip_client/ntrip_ros.py:                       Python script, ASCII text executable&lt;br /&gt;
devel/lib/mower_simulation/mower_simulation:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libvesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_comms/mower_comms:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_map/mower_map_service:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libftc_local_planner.so:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_positioning/xbot_positioning:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_sensor_example:             ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_monitoring:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/heatmap_generator:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_driver_gps/driver_gps_node:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mag_calibration:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/monitoring:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_odometry:                      ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_logic:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/slic3r_coverage_planner/slic3r_coverage_planner: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_remote/xbot_remote:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* rsync folder to raspberry pi, note the section below!&lt;br /&gt;
&lt;br /&gt;
==== TODO/Fix me ====&lt;br /&gt;
* Fix &amp;lt;code&amp;gt;[project]/devel/setup.sh&amp;lt;/code&amp;gt; - scripts to use correct paths, maybe have a wrapper for setup.sh that setup some env vars for example CMAKE_PREFIX_PATH to omit sysroot_arm64 path, need to figure out what paths are wrong. Seems _setup_util.py is the script that setup ros enviroment. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# One temporary fix is to create a link on the RPi:&lt;br /&gt;
$ ln -s / /opt/sysroot_arm64/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* a script to generate packages.txt&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=381</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=381"/>
		<updated>2024-05-29T08:54:50Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* check the build with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find devel/ -type f -executable |xargs file&lt;br /&gt;
devel/_setup_util.py:                                      Python script, ASCII text executable&lt;br /&gt;
devel/env.sh:                                              a /usr/bin/env sh script, ASCII text executable&lt;br /&gt;
devel/lib/mower_utils/planner_test:                        ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_utils/xbot_pose_converter:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xesc_driver/xesc_driver_node:                    ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_2040_driver.so:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/ntrip_client/ntrip_ros.py:                       Python script, ASCII text executable&lt;br /&gt;
devel/lib/mower_simulation/mower_simulation:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libvesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_comms/mower_comms:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_map/mower_map_service:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libftc_local_planner.so:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_positioning/xbot_positioning:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_sensor_example:             ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_monitoring:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/heatmap_generator:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_driver_gps/driver_gps_node:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mag_calibration:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/monitoring:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_odometry:                      ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_logic:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/slic3r_coverage_planner/slic3r_coverage_planner: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_remote/xbot_remote:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* rsync folder to raspberry pi, note the section below!&lt;br /&gt;
&lt;br /&gt;
==== TODO/Fix me ====&lt;br /&gt;
* Fix &amp;lt;code&amp;gt;[project]/devel/setup.sh&amp;lt;/code&amp;gt; - scripts to use correct paths, maybe have a wrapper for setup.sh that setup some env vars for example CMAKE_PREFIX_PATH to omit sysroot_arm64 path, need to figure out what paths are wrong. Seems _setup_util.py is the script that setup ros enviroment. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# One temporary fix is to create a link:&lt;br /&gt;
$ ln -s / /opt/sysroot_arm64/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* a script to generate packages.txt&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=380</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=380"/>
		<updated>2024-05-29T08:54:26Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Compilation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* check the build with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find devel/ -type f -executable |xargs file&lt;br /&gt;
devel/_setup_util.py:                                      Python script, ASCII text executable&lt;br /&gt;
devel/env.sh:                                              a /usr/bin/env sh script, ASCII text executable&lt;br /&gt;
devel/lib/mower_utils/planner_test:                        ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_utils/xbot_pose_converter:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xesc_driver/xesc_driver_node:                    ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_2040_driver.so:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/ntrip_client/ntrip_ros.py:                       Python script, ASCII text executable&lt;br /&gt;
devel/lib/mower_simulation/mower_simulation:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libvesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_comms/mower_comms:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_map/mower_map_service:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libftc_local_planner.so:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_positioning/xbot_positioning:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_sensor_example:             ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_monitoring:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/heatmap_generator:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_driver_gps/driver_gps_node:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mag_calibration:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/monitoring:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_odometry:                      ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_logic:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/slic3r_coverage_planner/slic3r_coverage_planner: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_remote/xbot_remote:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* rsync folder to raspberry pi, note the section below!&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
* Fix &amp;lt;code&amp;gt;[project]/devel/setup.sh&amp;lt;/code&amp;gt; - scripts to use correct paths, maybe have a wrapper for setup.sh that setup some env vars for example CMAKE_PREFIX_PATH to omit sysroot_arm64 path, need to figure out what paths are wrong. Seems _setup_util.py is the script that setup ros enviroment. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# One temporary fix is to create a link:&lt;br /&gt;
$ ln -s / /opt/sysroot_arm64/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* a script to generate packages.txt&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=379</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=379"/>
		<updated>2024-05-29T08:53:40Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Compilation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* check the build with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find devel/ -type f -executable |xargs file&lt;br /&gt;
devel/_setup_util.py:                                      Python script, ASCII text executable&lt;br /&gt;
devel/env.sh:                                              a /usr/bin/env sh script, ASCII text executable&lt;br /&gt;
devel/lib/mower_utils/planner_test:                        ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_utils/xbot_pose_converter:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xesc_driver/xesc_driver_node:                    ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_2040_driver.so:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/ntrip_client/ntrip_ros.py:                       Python script, ASCII text executable&lt;br /&gt;
devel/lib/mower_simulation/mower_simulation:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libvesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_comms/mower_comms:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_map/mower_map_service:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libftc_local_planner.so:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_positioning/xbot_positioning:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_sensor_example:             ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_monitoring:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/heatmap_generator:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_driver_gps/driver_gps_node:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mag_calibration:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/monitoring:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_odometry:                      ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_logic:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/slic3r_coverage_planner/slic3r_coverage_planner: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_remote/xbot_remote:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
* Fix &amp;lt;code&amp;gt;[project]/devel/setup.sh&amp;lt;/code&amp;gt; - scripts to use correct paths, maybe have a wrapper for setup.sh that setup some env vars for example CMAKE_PREFIX_PATH to omit sysroot_arm64 path, need to figure out what paths are wrong. Seems _setup_util.py is the script that setup ros enviroment. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# One temporary fix is to create a link:&lt;br /&gt;
$ ln -s / /opt/sysroot_arm64/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* a script to generate packages.txt&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=378</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=378"/>
		<updated>2024-05-21T07:25:57Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Compilation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* check the build with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ find devel/ -type f -executable |xargs file&lt;br /&gt;
devel/_setup_util.py:                                      Python script, ASCII text executable&lt;br /&gt;
devel/env.sh:                                              a /usr/bin/env sh script, ASCII text executable&lt;br /&gt;
devel/lib/mower_utils/planner_test:                        ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_utils/xbot_pose_converter:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xesc_driver/xesc_driver_node:                    ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_2040_driver.so:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/ntrip_client/ntrip_ros.py:                       Python script, ASCII text executable&lt;br /&gt;
devel/lib/mower_simulation/mower_simulation:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libvesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_comms/mower_comms:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_map/mower_map_service:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libftc_local_planner.so:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_positioning/xbot_positioning:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_sensor_example:             ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/xbot_monitoring:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_monitoring/heatmap_generator:               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_driver_gps/driver_gps_node:                 ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mag_calibration:                     ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/monitoring:                          ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_odometry:                      ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/mower_logic/mower_logic:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/libxesc_driver.so:                               ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/slic3r_coverage_planner/slic3r_coverage_planner: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
devel/lib/xbot_remote/xbot_remote:                         ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=377</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=377"/>
		<updated>2024-05-21T07:22:47Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Compilation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* check the build with&lt;br /&gt;
&amp;lt;code&amp;gt;$ find devel/ -type f -executable |xargs file&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=376</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=376"/>
		<updated>2024-05-21T07:16:17Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Instructions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=375</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=375"/>
		<updated>2024-05-21T07:15:37Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=374</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=374"/>
		<updated>2024-05-21T07:13:54Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Create toolchain.cmake */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=373</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=373"/>
		<updated>2024-05-21T06:58:06Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Create 2-fix-links-cmake.bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libdl.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libdl.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=372</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=372"/>
		<updated>2024-05-21T06:44:16Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Instructions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
= Instructions =&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
===== INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu =====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=371</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=371"/>
		<updated>2024-05-21T06:40:35Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=370</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=370"/>
		<updated>2024-05-21T06:39:57Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Setup sysroot and prepare open_mower_ros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Download &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS! =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=369</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=369"/>
		<updated>2024-05-21T06:37:18Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Setup sysroot and prepare open_mower_ros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sfv $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sfv $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c &#039;echo {}; sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g {}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=368</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=368"/>
		<updated>2024-05-21T06:33:52Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Setup sysroot and prepare open_mower_ros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=367</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=367"/>
		<updated>2024-05-21T06:22:07Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* clone open_mower_ros repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=366</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=366"/>
		<updated>2024-05-21T06:21:51Z</updated>

		<summary type="html">&lt;p&gt;Damme: /* Setup Open_mower_ros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== clone open_mower_ros repository ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=365</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=365"/>
		<updated>2024-05-21T06:19:16Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup Open_mower_ros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=364</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=364"/>
		<updated>2024-05-21T06:18:20Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup Open_mower_ros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ bash 1-setup_sysroot.bash&lt;br /&gt;
$ bash 2-fix-links-cmake.bash&lt;br /&gt;
$ bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=363</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=363"/>
		<updated>2024-05-21T06:16:09Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup Open_mower_ros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=362</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=362"/>
		<updated>2024-05-21T06:10:20Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup Open_mower_ros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=361</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=361"/>
		<updated>2024-05-21T06:05:01Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup Open_mower_ros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the created scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=360</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=360"/>
		<updated>2024-05-21T06:03:56Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup Open_mower_ros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== test =====&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Execute scripts ====&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=359</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=359"/>
		<updated>2024-05-21T06:02:50Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update and install packages ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== setup Open_mower_ros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Setup sysroot and prepare open_mower_ros ====&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== execute scripts ====&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation  ====&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=358</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=358"/>
		<updated>2024-05-21T05:59:59Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Clone open_mower_ros and its componnets.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=357</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=357"/>
		<updated>2024-05-20T15:33:13Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY CODE IS NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Clone open_mower_ros and its componnets.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/) ## not needed? wrong target folder version atleast xD&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=356</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=356"/>
		<updated>2024-05-20T15:28:43Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY CODE IS NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Clone open_mower_ros and its componnets.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
cd /opt/open_mower_ros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/)&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=355</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=355"/>
		<updated>2024-05-20T15:27:05Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY CODE IS NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Clone open_mower_ros and its componnets.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/)&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=354</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=354"/>
		<updated>2024-05-20T15:26:49Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY CODE IS NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Instead give yourself access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Clone open_mower_ros and its componnets.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/)&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=353</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=353"/>
		<updated>2024-05-20T15:25:24Z</updated>

		<summary type="html">&lt;p&gt;Damme: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;big&amp;gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY CODE IS NOT &amp;quot;SAFE&amp;quot;!&amp;lt;/big&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Clone open_mower_ros and its componnets.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/)&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=352</id>
		<title>Crosscompiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Crosscompiling&amp;diff=352"/>
		<updated>2024-05-20T15:19:49Z</updated>

		<summary type="html">&lt;p&gt;Damme: Created page with &amp;quot;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)   == Instructions == These instructions are made for Ubuntu 20.04.6 LTS  &amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;  ==== Update source files ==== * Add &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current ma...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Warning! You are in for a treat! :D - You have been warned. But reward is good, from 3250sec with docker buildx using qemu to 304s on my machine (Clean build)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
These instructions are made for Ubuntu 20.04.6 LTS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;INSTALL ROS https://wiki.ros.org/noetic/Installation/Ubuntu&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update source files ====&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb on each line in &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; (This should be changed to your current machines native arch!)&lt;br /&gt;
* Add &#039;&#039;&#039;&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;&#039;&#039;&#039; after deb in &amp;lt;code&amp;gt;/etc/apt/sources.list.d/ros-latest.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create &amp;lt;code&amp;gt;/etc/apt/sources.list.d/arm-cross-compile-sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse&lt;br /&gt;
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo dpkg --add-architecture arm64&lt;br /&gt;
&lt;br /&gt;
sudo apt install crossbuild-essential-arm64 parallel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Clone open_mower_ros and its componnets.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/ClemensElflein/open_mower_ros&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use CMAKE_SYSROOT /opt/sysroot_arm64 and /opt/sysroot_arm64_download - change these accordingly in the files for your needs. Total size to download is about 200MB and extracted is ~1.1GB. Change the number of download threads as desired.&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;toolchain.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(CMAKE_SYSTEM_NAME Linux)&lt;br /&gt;
set(CMAKE_SYSTEM_VERSION 1)&lt;br /&gt;
set(CMAKE_SYSTEM_PROCESSOR aarch64)&lt;br /&gt;
&lt;br /&gt;
# Specify the cross compiler&lt;br /&gt;
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)&lt;br /&gt;
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)&lt;br /&gt;
&lt;br /&gt;
#set(CMAKE_EXE_LINKER_FLAGS &amp;quot;${CMAKE_EXE_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
#set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -static&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Specify the target system root&lt;br /&gt;
set(CMAKE_SYSROOT /opt/sysroot_arm64)&lt;br /&gt;
&lt;br /&gt;
set(SYSROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
unset(CMAKE_SYSTEM_PREFIX_PATH)&lt;br /&gt;
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_PREFIX_PATH ${CMAKE_SYSROOT}/opt/ros/noetic ${CMAKE_SYSROOT}/opt/ros/noetic/share)&lt;br /&gt;
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/lib)&lt;br /&gt;
set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/opt/ros/noetic/include)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})&lt;br /&gt;
&lt;br /&gt;
# Search for programs in the build host directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;br /&gt;
&lt;br /&gt;
# For libraries and headers in the target directories&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;br /&gt;
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)&lt;br /&gt;
&lt;br /&gt;
set(CMAKE_MODULE_PATH ${CMAKE_SYSROOT}/usr/share/cmake-3.13/Modules/)&lt;br /&gt;
set(ENV{PKG_CONFIG_PATH} ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig/)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;1_setup-sysroot.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
DOWNLOADDIR=/opt/sysroot_downloads&lt;br /&gt;
PARALLELDOWNLOAD=6&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
rm -rf $SYSROOT&lt;br /&gt;
mkdir -p $SYSROOT&lt;br /&gt;
mkdir -p $DOWNLOADDIR&lt;br /&gt;
&lt;br /&gt;
# Link might not be needed? Cant remember :D&lt;br /&gt;
ln -s $SYSROOT/usr/lib $SYSROOT/lib&lt;br /&gt;
&lt;br /&gt;
install_package() {&lt;br /&gt;
#  for PKG in &amp;quot;${PACKAGES[@]}&amp;quot;; do&lt;br /&gt;
    PKG=$1&lt;br /&gt;
    URL=$(apt-get download --print-uris $PKG | cut -d\&#039; -f2)&lt;br /&gt;
    if [ -n &amp;quot;$URL&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;Downloading $PKG ($URL)&amp;quot;&lt;br /&gt;
      wget -q -nc $URL -P $DOWNLOADDIR &amp;amp;&amp;amp; dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
# --show-progress&lt;br /&gt;
#      dpkg -x $DOWNLOADDIR/$(basename $URL) $SYSROOT&lt;br /&gt;
      echo &amp;quot;Done installing $PKG&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;$PKG NOT FOUND!&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
#  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export -f install_package&lt;br /&gt;
export DOWNLOADDIR&lt;br /&gt;
export SYSROOT&lt;br /&gt;
&lt;br /&gt;
# read packages.txt into PACKAGES&lt;br /&gt;
while IFS= read -r line; do&lt;br /&gt;
    PACKAGES+=(&amp;quot;$line&amp;quot;)&lt;br /&gt;
done &amp;lt; &amp;quot;packages.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parallel -j $PARALLELDOWNLOAD install_package ::: &amp;quot;${PACKAGES[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download my little &amp;lt;code&amp;gt;packages.txt&amp;lt;/code&amp;gt; # Focal Ubuntu 20.04.6 LTS!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://gist.githubusercontent.com/Damme/3161f92ccadf452b4d5f3eee32da097e/raw/8df0172858e95da76091b04f8492705fc0cf0396/packages.txt -O packages.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;2-fix-links-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SYSROOT=/opt/sysroot_arm64&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Linking some missing library links, broken links /hardcoded to /lib/...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so.62 $SYSROOT/usr/lib/aarch64-linux-gnu/libPocoFoundation.so&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/blas/libblas.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libblas.so.3&lt;br /&gt;
ln -sf $SYSROOT/usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/liblapack.so.3&lt;br /&gt;
&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/librt.so.1 $SYSROOT/sysroot_arm64/usr/lib/aarch64-linux-gnu/librt.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpthread.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libpthread.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libBrokenLocale.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libBrokenLocale.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libanl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libanl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libblkid.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libblkid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libbz2.so.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libbz2.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libexpat.so.1.6.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libexpat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libgpg-error.so.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libgpg-error.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libkeyutils.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libkeyutils.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/liblzma.so.5.2.4 $SYSROOT/usr/lib/aarch64-linux-gnu/liblzma.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libm.so.6 $SYSROOT/usr/lib/aarch64-linux-gnu/libm.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libmount.so.1.1.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libmount.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnsl.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libnsl.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_compat.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_compat.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_dns.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_dns.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_files.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_files.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_hesiod.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_hesiod.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nis.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nis.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libnss_nisplus.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libnss_nisplus.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libpcre.so.3 $SYSROOT/usr/lib/aarch64-linux-gnu/libpcre.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libresolv.so.2 $SYSROOT/usr/lib/aarch64-linux-gnu/libresolv.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libthread_db.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libthread_db.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libutil.so.1 $SYSROOT/usr/lib/aarch64-linux-gnu/libutil.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libuuid.so.1.3.0 $SYSROOT/usr/lib/aarch64-linux-gnu/libuuid.so&lt;br /&gt;
ln -sf $SYSROOT/lib/aarch64-linux-gnu/libz.so.1.2.11 $SYSROOT/usr/lib/aarch64-linux-gnu/libz.so&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Fix cmake files with hardcoded paths..&amp;quot;&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@/opt/ros/noetic/lib@\${SYSROOT_PATH}/opt/ros/noetic/lib@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@PREFIX\ /opt/ros/noetic@PREFIX\ \${SYSROOT_PATH}/opt/ros/noetic@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs sed -i s@\&amp;quot;/usr/@\&amp;quot;\$\{SYSROOT_PATH\}/usr/@g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* create &amp;lt;code&amp;gt;3-patch-openmower-cmake.bash&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd src/lib/slic3r_coverage_planner&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -33,7 +33,9 @@ ExternalProject_Add(&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
         SOURCE_SUBDIR src&lt;br /&gt;
-        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF&lt;br /&gt;
+        CMAKE_ARGS -DSLIC3R_BUILD_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&lt;br /&gt;
cd src/lib/xbot_driver_gps&lt;br /&gt;
&lt;br /&gt;
patch CMakeLists.txt &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
@@ -32,6 +32,9 @@ ExternalProject_Add(&lt;br /&gt;
         INSTALL_COMMAND cmake -E echo &amp;quot;Skipping install step.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         CMAKE_CACHE_ARGS&lt;br /&gt;
+        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}&lt;br /&gt;
+               -DCMAKE_EXE_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
+               -DCMAKE_SHARED_LINKER_FLAGS:STRING=--sysroot=${CMAKE_SYSROOT}\;-L${CMAKE_SYSROOT}/opt/ros/noetic/lib\;-L${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu&lt;br /&gt;
         BUILD_COMMAND ${CMAKE_COMMAND} --build &amp;lt;BINARY_DIR&amp;gt; --config Release&lt;br /&gt;
 )&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cd ../../../&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* run the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash 1-setup_sysroot.bash&lt;br /&gt;
bash 2-fix-links-cmake.bash&lt;br /&gt;
bash 3-patch-openmower-cmake.bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build with the following command, change -j1 for number of parallel processes. For some reason catkin_make does not parse toolchain.cmake without forcing it...&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.openmower.de/index.php?title=Template:Hc&amp;diff=351</id>
		<title>Template:Hc</title>
		<link rel="alternate" type="text/html" href="https://wiki.openmower.de/index.php?title=Template:Hc&amp;diff=351"/>
		<updated>2024-05-20T14:06:31Z</updated>

		<summary type="html">&lt;p&gt;Damme: Created page with &amp;quot;&amp;lt;noinclude&amp;gt;{{DISPLAYTITLE:Template:hc}} {{Template}}  Block code with header.  * Use Template:bc for block code without header. * Use Template:ic for inline code.  ==Usage==  * {{ic|1}} or {{ic|head}}: the code in the top pane * {{ic|2}} or {{ic|output}}: the code in the bottom pane   &amp;lt;nowiki&amp;gt;{{hc|main.h|#include &amp;lt;stdio.h&amp;gt;}}&amp;lt;/nowiki&amp;gt;   &amp;lt;nowiki&amp;gt;{{hc|head=main.h|output=#include &amp;lt;stdio.h&amp;gt;}}&amp;lt;/nowiki&amp;gt;  ==Example==  {{hc|head=main.h|output=#include &amp;lt;stdio.h&amp;gt;}}&amp;lt;/noinclu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{DISPLAYTITLE:Template:hc}}&lt;br /&gt;
{{Template}}&lt;br /&gt;
&lt;br /&gt;
Block code with header.&lt;br /&gt;
&lt;br /&gt;
* Use [[Template:bc]] for block code without header.&lt;br /&gt;
* Use [[Template:ic]] for inline code.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
* {{ic|1}} or {{ic|head}}: the code in the top pane&lt;br /&gt;
* {{ic|2}} or {{ic|output}}: the code in the bottom pane&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{hc|main.h|#include &amp;lt;stdio.h&amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{hc|head=main.h|output=#include &amp;lt;stdio.h&amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
{{hc|head=main.h|output=#include &amp;lt;stdio.h&amp;gt;}}&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;pre&amp;lt;noinclude&amp;gt;&amp;lt;/noinclude&amp;gt; style=&amp;quot;margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;&amp;quot;&amp;gt;{{{head|{{{1|{{META Error}}}}}}}}&amp;lt;/pre&amp;lt;noinclude&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;gt;&amp;lt;!-- The line break is needed, otherwise the wiki will generate extraneous paragraphs inside the 2nd pre block --&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;lt;noinclude&amp;gt;&amp;lt;/noinclude&amp;gt; style=&amp;quot;margin-top: 0; border-top-style:dashed; padding-top: 0.8em;&amp;quot;&amp;gt;{{{output|{{{2|{{META Error}}}}}}}}&amp;lt;/pre&amp;lt;noinclude&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&amp;lt;!-- The &amp;amp;lt;noinclude&amp;gt;&amp;amp;lt;/noinclude&amp;gt; hack is needed to allow wiki markup inside the pre tags; reference: https://en.wikipedia.org/wiki/Help:Wikitext#Pre --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
</feed>