Skip to content

UF2 seems to build incorrectly on Arch #67

Description

@Carl-Llewellyn

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions