Link Termux binaries with libiconv
ober
5c1d2d411dbffc3d3434231070d4f98bfd80c7bd
--- a/data/cookbooks.sexp +++ b/data/cookbooks.sexp @@ -6509,10 +6509,10 @@ "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") + "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)\n\nHOST_OS_FLAVOR=$(uname -o 2>/dev/null || true)\nif [ \"$HOST_OS_FLAVOR\" = Android ]; then\n TERMUX_PREFIX=\"${PREFIX:-/data/data/com.termux/files/usr}\"\n OS_LIBS=\"-L$TERMUX_PREFIX/lib -lm -ldl -lpthread -lncurses -liconv\"\nfi") ("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.") + "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. Standalone binary links that include Chez's installed libkernel.a need the same -L$PREFIX/lib -liconv treatment.") ("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 @@ -2555,13 +2555,13 @@ ("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") + "ifeq ($(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\nendif\n\nif [ \"$HOST_OS_FLAVOR\" = Android ]; then\n TERMUX_PREFIX=\"${PREFIX:-/data/data/com.termux/files/usr}\"\n OS_LIBS=\"-L$TERMUX_PREFIX/lib -lm -ldl -lpthread -lncurses -liconv\"\nfi") ("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.") + "Termux provides GNU libiconv as a separate package/library. Chez's Android helper already uses LIBS=-liconv. Jerboa must pass the same settings while building Chez and again when linking standalone binaries that include Chez's libkernel.a, 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.") + "On Termux/Android native builds, link against Termux's GNU libiconv in every Chez libkernel link path. Pass CFLAGS=-I$PREFIX/include LDFLAGS=-L$PREFIX/lib LIBS=-liconv to Chez configure, and add -L$PREFIX/lib -liconv when support/build-binary.sh links a standalone binary against Chez's installed libkernel.a.") ("id" . "termux-chez-libiconv-link") ("pattern" . --- a/support/build-binary.sh +++ b/support/build-binary.sh @@ -84,6 +84,7 @@ machine_type_os() { # ── Detect OS and pick compiler + base link flags ──────────────────────────── HOST_OS=$(uname -s) +HOST_OS_FLAVOR=$(uname -o 2>/dev/null || true) if [ "$CROSS_BUILD" = yes ]; then TARGET_OS=$(machine_type_os "$TARGET_MACHINE") else @@ -113,8 +114,11 @@ else ;; Linux) CC_DEFAULT=gcc + if [ "$HOST_OS_FLAVOR" = Android ]; then + TERMUX_PREFIX="${PREFIX:-/data/data/com.termux/files/usr}" + OS_LIBS="-L$TERMUX_PREFIX/lib -lm -ldl -lpthread -lncurses -liconv" # Try both -lncurses and -ltinfo; -ltinfo is split out on some distros. - if [ -f /usr/lib/x86_64-linux-gnu/libtinfo.so ] || [ -f /usr/lib64/libtinfo.so ]; then + elif [ -f /usr/lib/x86_64-linux-gnu/libtinfo.so ] || [ -f /usr/lib64/libtinfo.so ]; then OS_LIBS="-lm -ldl -lpthread -ltinfo" else OS_LIBS="-lm -ldl -lpthread -lncurses"