manibuilder: Add Android cross-compilation targets

Change-Id: Ief71ef392f59197c95b5d01a63bc6998748bceb2
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.sourcearcade.org/c/flashprog/+/389
diff --git a/util/manibuilder/Dockerfile.cross b/util/manibuilder/Dockerfile.cross
new file mode 100644
index 0000000..b4bb496
--- /dev/null
+++ b/util/manibuilder/Dockerfile.cross
@@ -0,0 +1,49 @@
+FROM alvrme/alpine-android:android-35-jdk8
+
+RUN \
+	adduser -D mani mani && \
+	apk update && \
+	apk add build-base git ccache meson
+
+ENV NDK_VERSION=27.2.12479018
+RUN extras ndk -n ${NDK_VERSION}
+ENV PATH /opt/sdk/ndk/${NDK_VERSION}/toolchains/llvm/prebuilt/linux-x86_64/bin:${PATH}
+
+RUN bash <<EOF
+	set -e
+	ndk_bin="/opt/sdk/ndk/${NDK_VERSION}/toolchains/llvm/prebuilt/linux-x86_64/bin"
+	for trgt in {aarch64,i686,x86_64}-linux-android{23,35}-clang \
+		    armv7a-linux-androideabi{23,35}-clang
+	do
+		echo "[binaries]"			 >/opt/\${trgt}.txt
+		echo "c = '\${ndk_bin}/\${trgt}'"	>>/opt/\${trgt}.txt
+		echo "ar = '\${ndk_bin}/llvm-ar'"	>>/opt/\${trgt}.txt
+		echo "strip = '\${ndk_bin}/llvm-strip'"	>>/opt/\${trgt}.txt
+		echo ""					>>/opt/\${trgt}.txt
+		echo "[host_machine]"			>>/opt/\${trgt}.txt
+		echo "system = 'android'"		>>/opt/\${trgt}.txt
+		echo "cpu_family = '\${trgt%%-*}'"	>>/opt/\${trgt}.txt
+		echo "cpu = '\${trgt%%-*}'"		>>/opt/\${trgt}.txt
+		echo "endian = 'little'"		>>/opt/\${trgt}.txt
+	done
+EOF
+
+RUN mkdir -p -m 1777 /ccache
+
+USER mani
+
+ARG ORIGIN=https://review.sourcearcade.org/flashprog.git
+RUN \
+	cd && \
+	mkdir .ccache && chown mani:mani .ccache && \
+	git clone ${ORIGIN} flashprog
+
+ARG IDENT=mani
+ARG CCACHE_MAX=512M
+RUN \
+	ccache --set-config cache_dir=/ccache/${IDENT} && \
+	ccache --set-config max_size=${CCACHE_MAX}
+
+ENV DEVSHELL /bin/sh
+COPY mani-wrapper.sh /home/mani/
+ENTRYPOINT ["/bin/sh", "/home/mani/mani-wrapper.sh"]
diff --git a/util/manibuilder/Makefile b/util/manibuilder/Makefile
index 667f0ac..7109ce2 100644
--- a/util/manibuilder/Makefile
+++ b/util/manibuilder/Makefile
@@ -28,6 +28,7 @@
 
 include Makefile.env
 include Makefile.anita
+include Makefile.cross
 
 # $(1): mani tag
 # $(2): from tag
@@ -61,10 +62,11 @@
 		  docker build . --build-arg SRC_TMP=$${SRC_TMP} -f $< -t mani/source; \
 		  rm -rf $${SRC_TMP}; }
 
-source-check-build git-check-build $(addsuffix -check-build,$(ALL_TAGS)): %-check-build:
+$(addsuffix -check-build,source git cross $(NONCROSS_TAGS)): %-check-build:
 	$(QUIET_SETUP)\
 	[ $$(docker image ls -q mani/$*) ] \
 		|| $(MAKE) $*-build $(if $(QUIET_SETUP),>/dev/null 2>/dev/null)
+$(addsuffix -check-build,$(CROSS_TAGS)): cross-check-build
 
 $(ALL_TAGS): export QUIET_SETUP=$(QUIET_TEST)
 $(ALL_TAGS): export TEST_REMOTE?=$(if $(TEST_LOCAL),\
@@ -79,7 +81,7 @@
 		--env IDENT=$(call ident,$*) \
 		--volume manicache:/ccache \
 		--network=manibuilder \
-		--name mani_$(call ident,$*) mani/$* \
+		--name mani_$(call ident,$*) mani/$(patsubst cross-%,cross,$*) \
 		"git fetch $(TEST_REMOTE) $(TEST_REVISION) && \
 		 git checkout FETCH_HEAD && \
 		 export CC='$(CC)' STRIP='$(STRIP)' LIBS_BASE='$(LIBS_BASE)' && \
@@ -109,7 +111,8 @@
 			--env IDENT=$(call ident,$*) \
 			--volume manicache:/ccache \
 			--network=manibuilder \
-			mani/$* $(patsubst %,"%",$(SHELL_ARG)); \
+			mani/$(patsubst cross-%,cross,$*) \
+			$(patsubst %,"%",$(SHELL_ARG)); \
 	fi
 
 .PHONY: $(foreach s,-build -check-build -shell, $(addsuffix $(s),$(ALL_TAGS)))
diff --git a/util/manibuilder/Makefile.cross b/util/manibuilder/Makefile.cross
new file mode 100644
index 0000000..a030c0e
--- /dev/null
+++ b/util/manibuilder/Makefile.cross
@@ -0,0 +1,14 @@
+cross-build: %-build: Dockerfile.% mani-wrapper.sh
+	$(QUIET_SETUP)docker build . -f $< -t mani/$* --build-arg IDENT=$(call ident,$*)
+
+$(CROSS_TAGS): CC=ccache $(patsubst cross-%,%,$@)
+$(CROSS_TAGS): ENV_VARS=CROSS_COMPILE=$(patsubst cross-%,%,$(patsubst %-clang,%-,$(patsubst %-gcc,%-,$@)))
+
+$(CROSS_TAGS): MESONARGS+=--cross-file /opt/$(patsubst cross-%,%,$@).txt -Dwerror=false
+
+$(CROSS_TAGS): MAKEARGS+=CONFIG_ENABLE_LIBPCI_PROGRAMMERS=no CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no
+$(CROSS_TAGS): MAKEARGS+=CONFIG_FT2232_SPI=no CONFIG_USBBLASTER_SPI=no
+$(CROSS_TAGS): MAKEARGS+=CONFIG_JLINK_SPI=no CONFIG_LINUX_GPIO_SPI=no
+
+$(ANDROID_TAGS): AR=llvm-ar
+$(ANDROID_TAGS): STRIP=llvm-strip
diff --git a/util/manibuilder/Makefile.targets b/util/manibuilder/Makefile.targets
index 2f949cb..bab78cd 100644
--- a/util/manibuilder/Makefile.targets
+++ b/util/manibuilder/Makefile.targets
@@ -39,7 +39,19 @@
 
 OTHER_TAGS := djgpp\:6.1.0
 
-ALL_TAGS := $(ANITA_TAGS) $(OFFICIAL_TAGS) $(MULTIARCH_TAGS) $(OTHER_TAGS)
+NONCROSS_TAGS := $(ANITA_TAGS) $(OFFICIAL_TAGS) $(MULTIARCH_TAGS) $(OTHER_TAGS)
+
+
+ANDROID_TAGS := \
+	$(foreach v,23 35, \
+	  $(foreach p,armv7a-linux-androideabi \
+			$(foreach a,aarch64 i686 x86_64,$(a)-linux-android), \
+	    cross-$(p)$(v)-clang))
+
+CROSS_TAGS := $(ANDROID_TAGS)
+
+
+ALL_TAGS := $(NONCROSS_TAGS) $(CROSS_TAGS)
 
 BROKEN_TAGS := arm64v8/fedora\:35 arm32v6/alpine\:3.15 alpine\:armhf-v3.14
 
@@ -73,6 +85,8 @@
 
 working: $(WORKING_TAGS)
 
+cross: $(CROSS_TAGS)
+
 all: $(ALL_TAGS)
 
 show-default:
@@ -84,6 +98,9 @@
 show-working:
 	@printf "%s\n" $(WORKING_TAGS)
 
+show-cross:
+	@printf "%s\n" $(CROSS_TAGS)
+
 show-all:
 	@printf "%s\n" $(ALL_TAGS)