<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wiegert.link/index.php?action=history&amp;feed=atom&amp;title=OpenMower_Crosscompiling</id>
	<title>OpenMower Crosscompiling - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wiegert.link/index.php?action=history&amp;feed=atom&amp;title=OpenMower_Crosscompiling"/>
	<link rel="alternate" type="text/html" href="https://wiki.wiegert.link/index.php?title=OpenMower_Crosscompiling&amp;action=history"/>
	<updated>2026-06-22T21:05:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://wiki.wiegert.link/index.php?title=OpenMower_Crosscompiling&amp;diff=488&amp;oldid=prev</id>
		<title>Damme at 21:16, 20 June 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.wiegert.link/index.php?title=OpenMower_Crosscompiling&amp;diff=488&amp;oldid=prev"/>
		<updated>2026-06-20T21:16:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:16, 20 June 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Only use &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;these is &lt;/del&gt;you are running bare metal custom build! Otherwise go to the official wiki, this is just a backup for personal reference!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Only use &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;this wiki if &lt;/ins&gt;you are running bare metal custom build! Otherwise go to the official wiki, this is just a backup for personal reference!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki:diff::1.12:old-484:rev-488 --&gt;
&lt;/table&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.wiegert.link/index.php?title=OpenMower_Crosscompiling&amp;diff=484&amp;oldid=prev</id>
		<title>Damme at 21:15, 20 June 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.wiegert.link/index.php?title=OpenMower_Crosscompiling&amp;diff=484&amp;oldid=prev"/>
		<updated>2026-06-20T21:15:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:15, 20 June 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&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;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; Only use these is you are running bare metal custom build! Otherwise go to the official wiki, this is just a backup for personal reference!&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; &lt;/ins&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;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki:diff::1.12:old-467:rev-484 --&gt;
&lt;/table&gt;</summary>
		<author><name>Damme</name></author>
	</entry>
	<entry>
		<id>https://wiki.wiegert.link/index.php?title=OpenMower_Crosscompiling&amp;diff=467&amp;oldid=prev</id>
		<title>Damme: Created page with &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   '''&lt;code&gt;&lt;big&gt;PLEASE DONT RUN ANY SCRIPTS AS SUDO / ROOT! MY SCRIPTS ARE NOT &quot;SAFE&quot;!&lt;/big&gt;&lt;/code&gt;'''  Instead give yourself write-access to /opt, &lt;code&gt;sudo chmod 777 /opt/&lt;/code&gt; for example.  &amp;nbsp;  ===== INSTALL ROS https://wiki.ros.org/no...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.wiegert.link/index.php?title=OpenMower_Crosscompiling&amp;diff=467&amp;oldid=prev"/>
		<updated>2026-06-20T20:46:06Z</updated>

		<summary type="html">&lt;p&gt;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;#039;&amp;#039;&amp;#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;&amp;#039;&amp;#039;&amp;#039;  Instead give yourself write-access to /opt, &amp;lt;code&amp;gt;sudo chmod 777 /opt/&amp;lt;/code&amp;gt; for example.     ===== INSTALL ROS https://wiki.ros.org/no...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&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;
 '''&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;'''&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 '''&amp;lt;code&amp;gt;[arch=amd64]&amp;lt;/code&amp;gt;''' 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 '''&amp;lt;code&amp;gt;[arch=amd64,arm64]&amp;lt;/code&amp;gt;''' 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\' -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 'echo {}; 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 -i sh -c 'echo {}; 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 -i sh -c 'echo {}; sed -i s@\;/usr/@\;\$\{SYSROOT_PATH\}/usr/@g {}'&lt;br /&gt;
find $SYSROOT/opt/ros/noetic/ -name &amp;quot;*.cmake&amp;quot; | xargs -i sh -c 'echo {}; 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;'EOF'&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;'EOF'&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;
 '''&amp;lt;code&amp;gt;$ catkin_make -DCMAKE_TOOLCHAIN_FILE=/opt/open_mower_ros/toolchain.cmake -j1&amp;lt;/code&amp;gt;'''&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>
</feed>