diff --git a/packaging/.gitignore b/packaging/.gitignore new file mode 100644 index 0000000..ae07daf --- /dev/null +++ b/packaging/.gitignore @@ -0,0 +1,5 @@ +.build-image.* +distfiles/ +target/ +synit-apk-key +synit-apk-key.pub diff --git a/packaging/Dockerfile b/packaging/Dockerfile new file mode 100644 index 0000000..bc684fe --- /dev/null +++ b/packaging/Dockerfile @@ -0,0 +1,19 @@ +ARG DOCKER_ARCH +FROM --platform=linux/${DOCKER_ARCH} alpine:latest + +RUN sed -i -e s:https:http:g /etc/apk/repositories +ARG http_proxy +RUN http_proxy=${http_proxy} apk add bash sudo alpine-sdk linux-headers + +ARG UID +ARG BUILD_USER +RUN adduser -D -u ${UID} ${BUILD_USER} && addgroup ${BUILD_USER} abuild +RUN echo "${BUILD_USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +ARG KEYFILE +COPY ${KEYFILE}.pub /etc/apk/keys/. +RUN mkdir -p /home/${BUILD_USER}/.abuild/ +RUN echo "PACKAGER_PRIVKEY=/home/${BUILD_USER}/.abuild/signing-key.rsa" >> /home/${BUILD_USER}/.abuild/abuild.conf + +USER ${BUILD_USER} +WORKDIR /data diff --git a/packaging/Makefile b/packaging/Makefile new file mode 100644 index 0000000..bece57b --- /dev/null +++ b/packaging/Makefile @@ -0,0 +1,68 @@ +.PHONY: build-image build sign clean veryclean keyfile + +# If you run: +# docker run --rm --name squid adricu/alpine-squid +# and set DOCKER_SQUID_CONTAINER=squid +# then you can avoid repeated downloads of a lot of alpine packages. +# +DOCKER_SQUID_CONTAINER?=squid +ifeq ($(DOCKER_SQUID_CONTAINER),) +DOCKER_SQUID_OPTS= +else +DOCKER_SQUID_OPTS=--link $(DOCKER_SQUID_CONTAINER):squid -e http_proxy=http://squid:3128/ +HTTP_PROXY=http://$(shell docker inspect squid | preserves-tool convert -o unquoted --select '/ . "NetworkSettings" . "IPAddress"'):3128/ +endif + +ARCH?=aarch64 +DOCKER_ARCH=$(shell ./map_docker_arch.sh $(ARCH)) +KEYFILE?=$(CURDIR)/synit-apk-key +UID:=$(shell id -u) +GID:=$(shell id -g) +BUILD_USER?=build + +DOCKER_CMD=\ + mkdir -p $(CURDIR)/distfiles && \ + docker run --platform linux/$(DOCKER_ARCH) -it --rm \ + $(DOCKER_SQUID_OPTS) \ + -v `pwd`:/data \ + -v $(KEYFILE):/home/$(BUILD_USER)/.abuild/signing-key.rsa \ + -v $(CURDIR)/distfiles:/var/cache/distfiles \ + synit-build:$(ARCH) + +build: build-image + $(DOCKER_CMD) make -f Makefile.internal build + +sign: build-image + $(DOCKER_CMD) make -f Makefile.internalsign + +%.apk: + +clean: + rm -f .build-image.* + -docker rmi synit-build:aarch64 + -docker rmi synit-build:x86_64 + -docker rmi synit-build:armv7 + +veryclean: clean + rm -rf target + +build-image: .build-image.$(ARCH) + +.build-image.$(ARCH): $(KEYFILE) + docker buildx build \ + --platform=linux/$(DOCKER_ARCH) \ + --build-arg http_proxy=$(HTTP_PROXY) \ + --build-arg DOCKER_ARCH=$(DOCKER_ARCH) \ + --build-arg KEYFILE=$(KEYFILE:$(abspath $(dir $(KEYFILE)))/%=%) \ + --build-arg UID=$(UID) \ + --build-arg BUILD_USER=$(BUILD_USER) \ + -t synit-build:$(ARCH) . + touch $@ + +keyfile: $(KEYFILE) + +$(KEYFILE): + docker run -it --rm \ + -v $(abspath $(dir $(KEYFILE))):/data \ + alpine \ + sh -c "apk add abuild && echo /data/$(notdir $(KEYFILE)) | abuild-keygen && chown $(UID):$(GID) /data/$(notdir $(KEYFILE))*" diff --git a/packaging/Makefile.internal b/packaging/Makefile.internal new file mode 100644 index 0000000..54a0c43 --- /dev/null +++ b/packaging/Makefile.internal @@ -0,0 +1,35 @@ +# Expects to run from *within* alpine. -*- Makefile-gmake -*- + +.PHONY: build sign + +TARGET = $(CURDIR)/target +ARCH = $(shell apk --print-arch) +ARCH_TARGET = $(TARGET)/packages/$(ARCH) +SIGNING_KEY = $(HOME)/.abuild/signing-key.rsa + +PACKAGES = \ + squeak-vm.apk \ + +build: $(PACKAGES) sign + +%.apk: $(ARCH_TARGET) + @echo proxy $$http_proxy + @cat ~/.abuild/abuild.conf + @echo "Building $*..." + @cd packages/$* && (unset MAKEFLAGS; abuild -F -P $(TARGET) deps && abuild -P $(TARGET)) + +$(ARCH_TARGET): + mkdir -p $@ + +%.checksum: + cd packages/$* && abuild checksum + +sign: $(ARCH_TARGET) + rm -f $(ARCH_TARGET)/APKINDEX.tar.gz + cd $(ARCH_TARGET) && apk index -o APKINDEX.tar.gz --rewrite-arch $(ARCH) *.apk + abuild-sign -q -k $(HOME)/.abuild/signing-key.rsa $(ARCH_TARGET)/APKINDEX.tar.gz + +clean: + +veryclean: clean + rm -rf $(ARCH_TARGET) diff --git a/packaging/README.md b/packaging/README.md new file mode 100644 index 0000000..57f20c5 --- /dev/null +++ b/packaging/README.md @@ -0,0 +1 @@ +# Packaging scripts for PostmarketOS diff --git a/packaging/map_docker_arch.sh b/packaging/map_docker_arch.sh new file mode 100755 index 0000000..914750d --- /dev/null +++ b/packaging/map_docker_arch.sh @@ -0,0 +1,9 @@ +#!/bin/sh +case $1 in + aarch64) echo arm64;; + x86_64) echo x86_64;; + armv7) echo armhf;; + *) + echo 'ERROR: Unknown Alpine ARCH '"$1" >&2 + exit 1 +esac diff --git a/packaging/packages/squeak-vm/APKBUILD b/packaging/packages/squeak-vm/APKBUILD new file mode 100644 index 0000000..daa8112 --- /dev/null +++ b/packaging/packages/squeak-vm/APKBUILD @@ -0,0 +1,49 @@ +# Contributor: Tony Garnock-Jones +# Maintainer: Tony Garnock-Jones +pkgname=squeak-vm +pkgver=202107301330 +pkgrel=0 +pkgdesc="Squeak Spur stack (non-JIT) Virtual Machine" +url="https://opensmalltalk.org/" +arch="all" +license="MIT" +depends="" +makedepends="git bash linux-headers alsa-lib-dev openssl-dev libevdev-dev mesa-dev" +source="$pkgname-$pkgver.tar.gz::https://github.com/OpenSmalltalk/opensmalltalk-vm/archive/refs/tags/$pkgver.tar.gz" +builddir="$srcdir/opensmalltalk-vm-$pkgver" +options="!check" + +build() { + PATH=$(echo "$PATH" | tr ':' '\n' | grep -v crossdirect | tr '\n' ':') + echo 'false' > ./scripts/checkSCCSversion + case "$CARCH" in + aarch64*) + cd build.linux64ARMv8 + ;; + *) + echo "Architecture $CARCH not yet supported" + exit 1 + ;; + esac + cd squeak.stack.spur/build + echo y | ./mvm + echo n | ./mvm +} + +package() { + case "$CARCH" in + aarch64*) + cd products/sqstkspur64ARMv8linuxht + ;; + *) + echo "Architecture $CARCH not yet supported" + exit 1 + ;; + esac + mkdir -p "$pkgdir/usr/lib/squeak" + cp -rp lib/squeak/*/. "$pkgdir/usr/lib/squeak/." +} + +sha512sums=" +3ea16d90bc64b53b1e865b7e7e84457d564b60de2b8a2179c52528c1c1a574177a4aa933b634de5dd8d82557ea1bd7e453a119dfabdad133dc47eca7c8ca6aa8 squeak-vm-202107301330.tar.gz +"