I assume there's some update that has broken things as I can create a UF2, it just doesn't boot. However, it does work on Ubuntu with older tool chains.
This can be fixed using docker though:
dockerfile
FROM ubuntu:24.04
ARG DEBIAN_FRONTEND=noninteractive
ARG PICO_SDK_REF=2.1.1
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
cmake \
gcc-arm-none-eabi \
git \
libnewlib-arm-none-eabi \
libstdc++-arm-none-eabi-newlib \
ninja-build \
pkg-config \
python3 \
&& rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/raspberrypi/pico-sdk.git /opt/pico-sdk \
&& cd /opt/pico-sdk \
&& git checkout "${PICO_SDK_REF}" \
&& git submodule update --init --recursive
ENV PICO_SDK_PATH=/opt/pico-sdk
WORKDIR /work
Then some scripts to help run:
docker/build.sh
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
SW_DIR=$(cd "${SCRIPT_DIR}/.." && pwd)
REPO_ROOT=$(git -C "${SW_DIR}" rev-parse --show-toplevel)
SW_RELATIVE=$(realpath --relative-to "${REPO_ROOT}" "${SW_DIR}")
CONTAINER_SW_DIR="/repo/${SW_RELATIVE}"
IMAGE_TAG=${IMAGE_TAG:-picocart64-ubuntu-2024}
JOBS=${JOBS:-$(nproc)}
docker run --rm \
-u "$(id -u):$(id -g)" \
-v "${REPO_ROOT}":/repo \
-e PICO_SDK_PATH=/opt/pico-sdk \
"${IMAGE_TAG}" \
bash -lc "cmake --build ${CONTAINER_SW_DIR}/build --target picocart64_v1 -j ${JOBS}"
docker/build-image.sh:
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
IMAGE_TAG=${IMAGE_TAG:-picocart64-ubuntu-2024}
PICO_SDK_REF=${PICO_SDK_REF:-2.1.1}
exec docker build \
--build-arg PICO_SDK_REF="${PICO_SDK_REF}" \
-t "${IMAGE_TAG}" \
-f "${SCRIPT_DIR}/Dockerfile" \
"${SCRIPT_DIR}"
docker/clean-build.sh
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -lt 1 ]]; then
echo "Usage: $0 /absolute/path/to/rom.z64"
exit 1
fi
ROM_PATH=$(realpath "$1")
if [[ ! -f "${ROM_PATH}" ]]; then
echo "ROM not found: ${ROM_PATH}" >&2
exit 1
fi
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
SW_DIR=$(cd "${SCRIPT_DIR}/.." && pwd)
REPO_ROOT=$(git -C "${SW_DIR}" rev-parse --show-toplevel)
SW_RELATIVE=$(realpath --relative-to "${REPO_ROOT}" "${SW_DIR}")
CONTAINER_SW_DIR="/repo/${SW_RELATIVE}"
IMAGE_TAG=${IMAGE_TAG:-picocart64-ubuntu-2024}
REGION=${REGION:-NTSC}
FLASH_SIZE_MB=${FLASH_SIZE_MB:-16}
JOBS=${JOBS:-$(nproc)}
FREERTOS_KERNEL_REF=${FREERTOS_KERNEL_REF:-V11.1.0}
FORCE_FREERTOS_REF=${FORCE_FREERTOS_REF:-0}
if [[ ! -d "${SW_DIR}/lib/freertos-kernel" || -z "$(ls -A "${SW_DIR}/lib/freertos-kernel" 2>/dev/null)" ]]; then
echo "FreeRTOS kernel missing; initializing in ${SW_DIR}/lib/freertos-kernel" >&2
rm -rf "${SW_DIR}/lib/freertos-kernel"
git -C "${SW_DIR}" submodule update --init lib/freertos-kernel || true
if [[ ! -d "${SW_DIR}/lib/freertos-kernel" || -z "$(ls -A "${SW_DIR}/lib/freertos-kernel" 2>/dev/null)" ]]; then
git clone https://github.com/FreeRTOS/FreeRTOS-Kernel.git "${SW_DIR}/lib/freertos-kernel"
git -C "${SW_DIR}/lib/freertos-kernel" checkout "${FREERTOS_KERNEL_REF}"
fi
elif [[ "${FORCE_FREERTOS_REF}" == "1" ]]; then
git -C "${SW_DIR}/lib/freertos-kernel" fetch --tags
git -C "${SW_DIR}/lib/freertos-kernel" checkout "${FREERTOS_KERNEL_REF}"
fi
docker run --rm \
-u "$(id -u):$(id -g)" \
-v "${REPO_ROOT}":/repo \
-v "${ROM_PATH}":/rom.z64:ro \
-e PICO_SDK_PATH=/opt/pico-sdk \
"${IMAGE_TAG}" \
bash -lc "rm -rf ${CONTAINER_SW_DIR}/build ${CONTAINER_SW_DIR}/CMakeCache.txt ${CONTAINER_SW_DIR}/CMakeFiles \
&& python3 ${CONTAINER_SW_DIR}/scripts/load_rom.py --compress /rom.z64 \
&& mkdir ${CONTAINER_SW_DIR}/build \
&& cd ${CONTAINER_SW_DIR}/build \
&& cmake -DPICO_SDK_PATH=/opt/pico-sdk -DREGION=${REGION} -DFLASH_SIZE_MB=${FLASH_SIZE_MB} .. \
&& cmake --build ${CONTAINER_SW_DIR}/build --target picocart64_v1 -j ${JOBS}"
Pass in the z64 for clean build:
./docker/clean-build.sh /path/to/some.z64
I assume there's some update that has broken things as I can create a UF2, it just doesn't boot. However, it does work on Ubuntu with older tool chains.
This can be fixed using docker though:
dockerfile
Then some scripts to help run:
docker/build.sh
docker/build-image.sh:
docker/clean-build.sh
Pass in the z64 for clean build: