diff --git a/.gitignore b/.gitignore index 62cd70f..cbbb7dd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ build-*/ CMakeCache.txt CMakeFiles/ cmake_install.cmake -Makefile install_manifest.txt kobo-pkg/ *.tgz diff --git a/Dockerfile.cross b/Dockerfile.cross index 66dd172..e63ac5f 100644 --- a/Dockerfile.cross +++ b/Dockerfile.cross @@ -52,11 +52,13 @@ FROM ubuntu:24.04 AS qt-target-builder ENV DEBIAN_FRONTEND=noninteractive ENV QT_VERSION=6.5.2 -# armhf packages live on ports.ubuntu.com, not archive.ubuntu.com +# On amd64: archive.ubuntu.com only serves amd64, so add ports for armhf. RUN dpkg --add-architecture armhf \ - && sed -i 's/^Types:/Architectures: amd64\nTypes:/' /etc/apt/sources.list.d/ubuntu.sources \ - && printf 'Types: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble noble-updates noble-backports\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n\nTypes: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble-security\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n' \ - > /etc/apt/sources.list.d/armhf-ports.sources \ + && if [ "$(dpkg --print-architecture)" = "amd64" ]; then \ + sed -i 's/^Types:/Architectures: amd64\nTypes:/' /etc/apt/sources.list.d/ubuntu.sources; \ + printf 'Types: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble noble-updates noble-backports\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n\nTypes: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble-security\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n' \ + > /etc/apt/sources.list.d/armhf-ports.sources; \ + fi \ && apt-get update \ && apt-get install -y --no-install-recommends \ build-essential cmake ninja-build pkg-config python3 perl \ @@ -104,16 +106,19 @@ RUN mkdir /qt-build-target && cd /qt-build-target \ && cmake --install . \ && rm -rf /qt-build-target /qt-src -# ── Stage 2: Final cross-compilation image ──────────────────────── -FROM ubuntu:24.04 +# ── Stage 3: Final cross-compilation image ──────────────────────── +FROM ubuntu:24.04 AS cross-compiler ENV DEBIAN_FRONTEND=noninteractive -# armhf packages live on ports.ubuntu.com, not archive.ubuntu.com +# On amd64: archive.ubuntu.com only serves amd64, so add ports for armhf. +# On arm64: ports.ubuntu.com already serves both arm64 and armhf — no changes needed. RUN dpkg --add-architecture armhf \ - && sed -i 's/^Types:/Architectures: amd64\nTypes:/' /etc/apt/sources.list.d/ubuntu.sources \ - && printf 'Types: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble noble-updates noble-backports\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n\nTypes: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble-security\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n' \ - > /etc/apt/sources.list.d/armhf-ports.sources \ + && if [ "$(dpkg --print-architecture)" = "amd64" ]; then \ + sed -i 's/^Types:/Architectures: amd64\nTypes:/' /etc/apt/sources.list.d/ubuntu.sources; \ + printf 'Types: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble noble-updates noble-backports\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n\nTypes: deb\nURIs: http://ports.ubuntu.com/ubuntu-ports\nSuites: noble-security\nComponents: main universe multiverse restricted\nArchitectures: armhf\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n' \ + > /etc/apt/sources.list.d/armhf-ports.sources; \ + fi \ && apt-get update \ && apt-get install -y --no-install-recommends \ # ── Build tools ── diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7f8c878 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +.PHONY: build clean + +build: + ./docker-build.sh + +clean: + docker run --rm -v "$(CURDIR)/build-kobo:/build" ubuntu:24.04 rm -rf /build/* /build/.[!.]* 2>/dev/null; \ + rm -rf build-kobo diff --git a/docker-build.sh b/docker-build.sh index e90fde8..aaffcad 100755 --- a/docker-build.sh +++ b/docker-build.sh @@ -13,8 +13,19 @@ HOST_UID=1000 HOST_GID=1000 NINJA_PACKAGE_TARGET="${NINJA_PACKAGE_TARGET:-kobo-package}" +# Some arch detection +HOST_ARCH="$(uname -m)" +case "${HOST_ARCH}" in + x86_64) DOCKER_PLATFORM="linux/amd64" ;; + aarch64|arm64) DOCKER_PLATFORM="linux/arm64" ;; + *) echo "WARNING: unknown architecture '${HOST_ARCH}', defaulting to linux/amd64" >&2 + DOCKER_PLATFORM="linux/amd64" ;; +esac +echo "==> Host architecture: ${HOST_ARCH} → Docker platform: ${DOCKER_PLATFORM}" + echo "==> Building Docker cross-compilation image …" -docker build -t "${IMAGE_NAME}" -f "${SCRIPT_DIR}/Dockerfile.cross" "${SCRIPT_DIR}" +docker build --platform "${DOCKER_PLATFORM}" \ + -t "${IMAGE_NAME}" -f "${SCRIPT_DIR}/Dockerfile.cross" "${SCRIPT_DIR}" mkdir -p "${BUILD_DIR}" @@ -29,6 +40,7 @@ if [[ -z "${KOBO_SYSROOT:-}" && -f "${ROOTFS_IMG}" ]]; then zstd -d "${ROOTFS_IMG}" -o "${BUILD_DIR}/rootfs.ext4" --force # Mount the ext4 image and copy contents (works without root via Docker) docker run --rm --privileged \ + --platform "${DOCKER_PLATFORM}" \ -v "${BUILD_DIR}:/work" \ "${IMAGE_NAME}" \ bash -c " @@ -62,6 +74,7 @@ fi echo "==> Cross-compiling sKeets for Kobo …" echo "==> Packaging target: ${NINJA_PACKAGE_TARGET}" docker run --rm \ + --platform "${DOCKER_PLATFORM}" \ --user "${HOST_UID}:${HOST_GID}" \ -v "${SCRIPT_DIR}:/src:ro" \ -v "${BUILD_DIR}:/build" \