Skip to content

Commit 5652e04

Browse files
authored
Add cross compilers for robot firmware building on MacOS (#3797)
* Setup STM32 cross compiler for motor driver firmware * Add mac cross compiler for raspberry pi * Specify linux only targets * Fix firmware flashing * Dont hardcode cross compiler version * Print status message for setup * Install cross compiler with brew dont need the util * Remove unnecessary comments
1 parent 8c8335d commit 5652e04

12 files changed

Lines changed: 142 additions & 24 deletions

File tree

environment_setup/setup_software.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ host_software_packages=(
7575
libffi-dev # needed to use _ctypes in Python3
7676
libssl-dev # needed to build Python 3 with ssl support
7777
openssl # possibly also necessary for ssl in Python 3
78-
sshpass #used to remotely ssh into robots via Ansible
78+
sshpass # used to remotely ssh into robots via Ansible
7979
unzip # installing tigers autoref
8080
xvfb # used for CI to run GUI applications
8181
)

environment_setup/setup_software_mac.sh

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ host_software_packages=(
3232
node@20
3333
go@1.24
3434
clang-format@20
35+
sshpass # used to remotely ssh into robots via Ansible
36+
messense/macos-cross-toolchains/aarch64-unknown-linux-gnu # raspberry pi cross compiler
3537
)
3638

3739
for pkg in "${host_software_packages[@]}"; do
@@ -72,9 +74,13 @@ print_status_msg "Install clang-format"
7274
install_clang_format $sys
7375
print_status_msg "Done installing clang-format"
7476

75-
print_status_msg "Setting up cross compiler for robot software"
76-
install_cross_compiler $sys
77-
print_status_msg "Done setting up cross compiler for robot software"
77+
print_status_msg "Setting Up PlatformIO"
78+
sudo ln -s /opt/tbotspython/bin/platformio /usr/local/bin/platformio
79+
print_status_msg "Done PlatformIO Setup"
80+
81+
print_status_msg "Setting up STM32 cross-compiler for motor board firmware"
82+
install_stm32_cross_compiler $sys
83+
print_status_msg "Done setting up STM32 cross-compiler"
7884

7985
print_status_msg "Setting Up Python Development Headers"
8086
install_python_toolchain_headers

environment_setup/util.sh

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,14 @@ install_clang_format() {
3838

3939
install_cross_compiler() {
4040
file_name=aarch64-tbots-linux-gnu-for-aarch64
41-
if is_darwin $1; then
42-
full_file_name=$file_name.tar.xz
43-
curl -L "https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name" \
44-
-o /tmp/tbots_download_cache/$full_file_name
45-
tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/
46-
sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython
47-
rm /tmp/tbots_download_cache/$full_file_name
48-
else
49-
if is_x86 $1; then
50-
file_name=aarch64-tbots-linux-gnu-for-x86
51-
fi
52-
full_file_name=$file_name.tar.xz
53-
wget https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name -O /tmp/tbots_download_cache/$full_file_name
54-
tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/
55-
sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython
56-
rm /tmp/tbots_download_cache/$full_file_name
41+
if is_x86 $1; then
42+
file_name=aarch64-tbots-linux-gnu-for-x86
5743
fi
44+
full_file_name=$file_name.tar.xz
45+
wget https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name -O /tmp/tbots_download_cache/$full_file_name
46+
tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/
47+
sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython
48+
rm /tmp/tbots_download_cache/$full_file_name
5849
}
5950

6051
install_gamecontroller () {
@@ -127,14 +118,17 @@ install_python_dev_cross_compile_headers() {
127118

128119
install_stm32_cross_compiler() {
129120
arch="aarch64"
130-
if is_x86 $1; then
121+
if is_darwin $1; then
122+
arch="darwin-arm64"
123+
elif is_x86 $1; then
131124
arch="x86_64"
132125
fi
133-
download_link=https://developer.arm.com/-/media/Files/downloads/gnu/14.3.rel1/binrel/arm-gnu-toolchain-14.3.rel1-${arch}-arm-none-eabi.tar.xz
126+
toolchain_name=arm-gnu-toolchain-14.3.rel1-${arch}-arm-none-eabi
127+
download_link=https://developer.arm.com/-/media/Files/downloads/gnu/14.3.rel1/binrel/${toolchain_name}.tar.xz
134128

135129
wget -N $download_link -O /tmp/tbots_download_cache/arm-gnu-toolchain.tar.xz
136130
tar -xf /tmp/tbots_download_cache/arm-gnu-toolchain.tar.xz -C /tmp/tbots_download_cache/
137-
sudo mv /tmp/tbots_download_cache/arm-gnu-toolchain-14.3.rel1-${arch}-arm-none-eabi /opt/tbotspython/arm-none-eabi-gcc
131+
sudo mv /tmp/tbots_download_cache/${toolchain_name} /opt/tbotspython/arm-none-eabi-gcc
138132
rm /tmp/tbots_download_cache/arm-gnu-toolchain.tar.xz
139133
}
140134

src/MODULE.bazel

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ register_toolchains(
250250
)
251251

252252
register_toolchains(
253+
"//toolchains/cc:cc_toolchain_for_macos_robot",
253254
"//toolchains/cc:cc_toolchain_for_k8_aarch64_linux",
254255
"//toolchains/cc:cc_toolchain_for_k8",
255256
"//toolchains/cc:cc_toolchain_for_aarch64",
@@ -286,6 +287,12 @@ new_local_repository(
286287
path = "/opt/tbotspython/aarch64-tbots-linux-gnu/",
287288
)
288289

290+
new_local_repository(
291+
name = "macos_robot_gcc",
292+
build_file = "@//extlibs:macos_robot_gcc.BUILD",
293+
path = "/opt/homebrew/opt/aarch64-unknown-linux-gnu/toolchain/",
294+
)
295+
289296
new_local_repository(
290297
name = "motor_board_gcc",
291298
build_file = "@//extlibs:motor_board_gcc.BUILD",

src/extlibs/macos_robot_gcc.BUILD

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package(default_visibility = ["//visibility:public"])
2+
3+
filegroup(
4+
name = "everything",
5+
srcs = glob(["**"]),
6+
)

src/software/embedded/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ cc_library(
7272
name = "spi_utils",
7373
srcs = ["spi_utils.cpp"],
7474
hdrs = ["spi_utils.h"],
75+
# Uses Linux kernel headers (linux/spi/spidev.h); robot-only.
76+
target_compatible_with = ["@platforms//os:linux"],
7577
deps = [
7678
"//software/logger",
7779
],

src/software/embedded/gpio/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ cc_library(
1010
"gpio.h",
1111
"gpio_char_dev.h",
1212
],
13+
# Uses Linux kernel headers (linux/gpio.h); robot-only.
14+
target_compatible_with = ["@platforms//os:linux"],
1315
deps = [
1416
"//software/logger",
1517
"//software/logger:network_logger",

src/software/embedded/motor_controller/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ cc_library(
2727
"stspin_motor_controller.h",
2828
"tmc_motor_controller.h",
2929
],
30+
# Uses Linux kernel headers (linux/spi/spidev.h); robot-only.
31+
target_compatible_with = ["@platforms//os:linux"],
3032
deps = [
3133
":motor_board",
3234
":motor_fault_indicator",

src/software/embedded/services/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ cc_library(
4242
name = "imu",
4343
srcs = ["imu.cpp"],
4444
hdrs = ["imu.h"],
45+
# Uses Linux kernel headers (linux/i2c-dev.h); robot-only.
46+
target_compatible_with = ["@platforms//os:linux"],
4547
deps = [
4648
"//proto:tbots_cc_proto",
4749
"//shared:constants",

src/tbots.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ def create_command(config: BuildConfig, extra_args: list[str]) -> list[str]:
194194
if config.test_suite and config.action == ActionArgument.test:
195195
target = """-- //... \\
196196
-//software/gameplay_tests/... \\
197-
-//toolchains/cc/... \\
197+
-//toolchains/... \\
198198
-//software:unix_full_system_tar_gen"""
199199
else:
200200
target = fuzzy_find_target(
@@ -221,6 +221,9 @@ def create_command(config: BuildConfig, extra_args: list[str]) -> list[str]:
221221
if condition:
222222
command += list(flag.value)
223223

224+
if config.test_suite and config.action == ActionArgument.test:
225+
command += ["--build_tests_only"]
226+
224227
if config.jobs_option:
225228
command += [f"--jobs={config.jobs_option}"]
226229

0 commit comments

Comments
 (0)