Link Termux binaries with libiconv

ober

5c1d2d411dbffc3d3434231070d4f98bfd80c7bd

diff --git a/data/cookbooks.sexp b/data/cookbooks.sexp
index 92e0d33..d4d2cd4 100644
--- 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"))
diff --git a/data/error-fixes.sexp b/data/error-fixes.sexp
index ce0e6ba..c085552 100644
--- 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"
      .
diff --git a/support/build-binary.sh b/support/build-binary.sh
index 223dddf..0d7b70c 100755
--- 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"