Fix native Chez build on Termux
ober
6673f5119ab02343b2b274f3f9a3d62459262d66
--- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ SOURCE_DATE_EPOCH ?= $(shell git log -1 --format=%ct) export SOURCE_DATE_EPOCH HOST_UNAME_S := $(shell uname -s) HOST_UNAME_M := $(shell uname -m) +HOST_UNAME_O := $(shell uname -o 2>/dev/null || true) STATIC ?= 0 STATIC_ENABLED := $(filter 1 yes true on,$(STATIC)) CHEZ_BUILD_DIR ?= $(JERBOA_HOME)/build/chez @@ -27,6 +28,14 @@ else CHEZ_HARDEN ?= --enable-harden endif +CHEZ_CONFIGURE_EXTRA ?= +ifeq ($(HOST_UNAME_O),Android) +CHEZ_TERMUX_PREFIX ?= $(if $(PREFIX),$(PREFIX),/data/data/com.termux/files/usr) +CHEZ_TERMUX_CONFIGURE_VARS ?= CFLAGS=-I$(CHEZ_TERMUX_PREFIX)/include LDFLAGS=-L$(CHEZ_TERMUX_PREFIX)/lib LIBS=-liconv +else +CHEZ_TERMUX_CONFIGURE_VARS ?= +endif + CHEZ_INSTALL_FLAGS = \ $(if $(STATIC_ENABLED),--static) \ $(CHEZ_HARDEN) \ @@ -35,7 +44,9 @@ CHEZ_INSTALL_FLAGS = \ --installlib=$(CHEZ_PREFIX)/lib \ --installman=$(CHEZ_PREFIX)/share/man \ --installdoc=$(CHEZ_PREFIX)/share/doc \ - --as-is + --as-is \ + $(CHEZ_TERMUX_CONFIGURE_VARS) \ + $(CHEZ_CONFIGURE_EXTRA) LIBDIRS = $(JERBOA_HOME)/lib:$(JERBOA_HOME)/vendor/jsqlite/src # Base directory for chez-* repos (legacy C FFI — see `make native` for Rust backend) JERBOA_EXT_DIR ?= $(HOME)/src --- a/data/cookbooks.sexp +++ b/data/cookbooks.sexp @@ -6506,4 +6506,13 @@ "release-evidence" "chez" "jmcp") ("title" . - "Build Native Static Artifacts and Compare Reproducibility Reports"))) + "Build Native Static Artifacts and Compare Reproducibility Reports")) + (("code" + . + "HOST_UNAME_O := $(shell uname -o 2>/dev/null || true)\nCHEZ_CONFIGURE_EXTRA ?=\nifeq ($(HOST_UNAME_O),Android)\nCHEZ_TERMUX_PREFIX ?= $(if $(PREFIX),$(PREFIX),/data/data/com.termux/files/usr)\nCHEZ_TERMUX_CONFIGURE_VARS ?= CFLAGS=-I$(CHEZ_TERMUX_PREFIX)/include LDFLAGS=-L$(CHEZ_TERMUX_PREFIX)/lib LIBS=-liconv\nelse\nCHEZ_TERMUX_CONFIGURE_VARS ?=\nendif\n\nCHEZ_INSTALL_FLAGS = \\\n --installprefix=$(CHEZ_PREFIX) \\\n --as-is \\\n $(CHEZ_TERMUX_CONFIGURE_VARS) \\\n $(CHEZ_CONFIGURE_EXTRA)") ("id" . "termux-native-chez-build-libiconv") ("imports") + ("notes" + . + "Termux reports uname -s as Linux and uname -o as Android. Chez Scheme's vendored make-android helper passes CFLAGS, LDFLAGS, and LIBS=-liconv because GNU libiconv is a separate Termux library. Gate these settings on Android so normal Linux builds do not link against a separate libiconv.") + ("tags" "chez" "termux" "android" "build" "libiconv" + "makefile") + ("title" . "Build native Chez on Termux with libiconv"))) --- a/data/error-fixes.sexp +++ b/data/error-fixes.sexp @@ -2552,4 +2552,18 @@ ("pattern" . "ld: cannot find -lncurses: No such file or directory") + ("type" . "linker")) + (("code_example" + . + "CHEZ_TERMUX_PREFIX ?= $(if $(PREFIX),$(PREFIX),/data/data/com.termux/files/usr)\nCHEZ_TERMUX_CONFIGURE_VARS ?= CFLAGS=-I$(CHEZ_TERMUX_PREFIX)/include LDFLAGS=-L$(CHEZ_TERMUX_PREFIX)/lib LIBS=-liconv") + ("explanation" + . + "Termux provides GNU libiconv as a separate package/library. Chez's Android helper already uses LIBS=-liconv, but Jerboa's native Chez configure wrapper must pass the same settings or ld.lld leaves iconv symbols unresolved.") + ("fix" + . + "On Termux/Android native Chez builds, pass Termux's prefix paths and libiconv to Chez configure: CFLAGS=-I$PREFIX/include LDFLAGS=-L$PREFIX/lib LIBS=-liconv. In this repo, keep it Android-gated in Makefile so ordinary Linux builds are unchanged.") + ("id" . "termux-chez-libiconv-link") + ("pattern" + . + "undefined symbol: libiconv_open|undefined symbol: libiconv_close|undefined symbol: libiconv") ("type" . "linker")))