Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ build-*/
CMakeCache.txt
CMakeFiles/
cmake_install.cmake
Makefile
install_manifest.txt
kobo-pkg/
*.tgz
Expand Down
25 changes: 15 additions & 10 deletions Dockerfile.cross
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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 ──
Expand Down
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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
15 changes: 14 additions & 1 deletion docker-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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}"

Expand All @@ -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 "
Expand Down Expand Up @@ -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" \
Expand Down
Loading