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)