Android: fix horrible libiconv build

Before, our libiconv build was a joke. We first called configure for our own build host system,
then called make, before we executed a Android.mk script we provided as patch. The first "native make"
always failed, and the LIBICONV_LIB file setting in our Makefile didn't match the built one,
resulting in an always-rebuild of iconv.

This commit cleans up this total mess, removes the double-build, and the Android.mk, and properly calls
./configure with the according target platform, and uses a built toolchain.

As we have to deal with the android bug "NDK: Support for prebuild libs with full sonames"
https://code.google.com/p/android/issues/detail?id=55868
as the 2013 patch
https://lists.gnu.org/archive/html/libtool-patches/2013-06/msg00002.html
by Google's David Turner wasn't inside the 2011 libtool, we pass -avoid-version to
libtool.

Thanks to the proper build, wide_to_utf8 works for android now, removing us of the need to disable it.
This commit is contained in:
est31 2015-07-29 11:54:27 +02:00
parent f97c2702a2
commit eb3aac20c8
5 changed files with 47 additions and 104 deletions

@ -133,7 +133,7 @@ FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android
ICONV_VERSION = 1.14 ICONV_VERSION = 1.14
ICONV_DIR = $(ROOT)/deps/libiconv/ ICONV_DIR = $(ROOT)/deps/libiconv/
ICONV_LIB = $(ICONV_DIR)/iconv.so ICONV_LIB = $(ICONV_DIR)/lib/.libs/libiconv.so
ICONV_TIMESTAMP = $(ICONV_DIR)timestamp ICONV_TIMESTAMP = $(ICONV_DIR)timestamp
ICONV_TIMESTAMP_INT = $(ROOT)/deps/iconv_timestamp ICONV_TIMESTAMP_INT = $(ROOT)/deps/iconv_timestamp
ICONV_URL_HTTP = http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz ICONV_URL_HTTP = http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz
@ -455,10 +455,7 @@ iconv_download :
ln -s libiconv-${ICONV_VERSION} libiconv; \ ln -s libiconv-${ICONV_VERSION} libiconv; \
cd ${ICONV_DIR}; \ cd ${ICONV_DIR}; \
patch -p1 < ${ROOT}/libiconv_android.patch; \ patch -p1 < ${ROOT}/libiconv_android.patch; \
patch -p1 < ${ROOT}/libiconv_android_mk.patch; \
patch -p1 < ${ROOT}/libiconv_stdio.patch; \ patch -p1 < ${ROOT}/libiconv_stdio.patch; \
cd jni; \
ln -s .. src; \
fi fi
iconv : $(ICONV_LIB) iconv : $(ICONV_LIB)
@ -479,16 +476,22 @@ $(ICONV_LIB) : $(ICONV_TIMESTAMP)
export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \ export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK}; \
echo "changed timestamp for iconv detected building..."; \ echo "changed timestamp for iconv detected building..."; \
cd ${ICONV_DIR}; \ cd ${ICONV_DIR}; \
./configure; \ \
make; \ export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv; \
export NDK_PROJECT_PATH=${ICONV_DIR}; \ ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH} \ --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI} \ --install-dir=$${TOOLCHAIN}; \
TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \ export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \ export CC=${CROSS_PREFIX}gcc; \
TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \ export CXX=${CROSS_PREFIX}g++; \
export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \
./configure --host=${TARGET_HOST} || exit 1; \
sed -i 's/LIBICONV_VERSION_INFO) /LIBICONV_VERSION_INFO) -avoid-version /g' lib/Makefile; \
grep "iconv_LDFLAGS" src/Makefile; \
$(MAKE) -s || exit 1; \
touch ${ICONV_TIMESTAMP}; \ touch ${ICONV_TIMESTAMP}; \
touch ${ICONV_TIMESTAMP_INT}; \ touch ${ICONV_TIMESTAMP_INT}; \
rm -rf ${TOOLCHAIN}; \
else \ else \
echo "nothing to be done for iconv"; \ echo "nothing to be done for iconv"; \
fi fi

@ -26,8 +26,8 @@ include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := iconv LOCAL_MODULE := iconv
LOCAL_SRC_FILES := deps/libiconv/obj/local/$(TARGET_ARCH_ABI)/libiconv.a LOCAL_SRC_FILES := deps/libiconv/lib/.libs/libiconv.so
include $(PREBUILT_STATIC_LIBRARY) include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := openal LOCAL_MODULE := openal
@ -355,8 +355,8 @@ LOCAL_SRC_FILES += \
# json # json
LOCAL_SRC_FILES += jni/src/json/jsoncpp.cpp LOCAL_SRC_FILES += jni/src/json/jsoncpp.cpp
LOCAL_SHARED_LIBRARIES := openal ogg vorbis gmp LOCAL_SHARED_LIBRARIES := iconv openal ogg vorbis gmp
LOCAL_STATIC_LIBRARIES := Irrlicht iconv freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS) LOCAL_STATIC_LIBRARIES := Irrlicht freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS)
ifeq ($(HAVE_LEVELDB), 1) ifeq ($(HAVE_LEVELDB), 1)
LOCAL_STATIC_LIBRARIES += LevelDB LOCAL_STATIC_LIBRARIES += LevelDB

@ -1,51 +0,0 @@
From fe27aae178d65b06d5f4104158343b0d2d33e3f0 Mon Sep 17 00:00:00 2001
From: Pierre Zurek <pierrezurek@gmail.com>
Date: Sat, 2 Apr 2011 23:11:57 +0200
Subject: [PATCH] Added Android.mk.
This makefile first executes the configure script, that will
generate the config.h files necessary to build iconv.
---
Android.mk | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 Android.mk
diff --git a/jni/Android.mk b/jni/Android.mk
new file mode 100644
index 0000000..799b22d
--- /dev/null
+++ b/jni/Android.mk
@@ -0,0 +1,32 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_SRC_FILES := src/lib/iconv.c \
+ src/libcharset/lib/localcharset.c \
+ src/lib/relocatable.c
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/include \
+ $(LOCAL_PATH)/src/libcharset \
+ $(LOCAL_PATH)/src/libcharset/include
+
+LOCAL_CFLAGS := \
+ -DLIBDIR="\"c\"" \
+ -D_ANDROID \
+ -DBUILDING_LIBCHARSET \
+ -DBUILDING_LIBICONV \
+ -DBUILDING_LIBICONV \
+ -DIN_LIBRARY
+
+LOCAL_MODULE:= iconv
+
+$(info Configuring iconv...)
+COMMAND := $(shell \
+ export PATH=$(TOOLCHAIN_INSTALL_DIR)/bin:$$PATH; \
+ cd $(LOCAL_PATH); \
+ make distclean; \
+ ./configure --host="arm-linux-androideabi")
+$(info iconv configured.)
+
+include $(BUILD_STATIC_LIBRARY)
+

@ -1,6 +1,6 @@
--- a/srclib/stdio.in.h 2011-08-07 15:42:06.000000000 +0200 --- a/srclib/stdio.in.h 2011-08-07 15:42:06.000000000 +0200
+++ b/srclib/stdio.in.h 2015-06-10 09:27:58.129056262 +0200 +++ b/srclib/stdio.in.h 2015-06-10 09:27:58.129056262 +0200
@@ -695,7 +696,8 @@ _GL_CXXALIASWARN (gets); @@ -695,8 +696,9 @@ _GL_CXXALIASWARN (gets);
/* It is very rare that the developer ever has full control of stdin, /* It is very rare that the developer ever has full control of stdin,
so any use of gets warrants an unconditional warning. Assume it is so any use of gets warrants an unconditional warning. Assume it is
always declared, since it is required by C89. */ always declared, since it is required by C89. */
@ -8,3 +8,6 @@
+/*_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");*/ +/*_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");*/
+#define gets(a) fgets( a, sizeof(*(a)), stdin) +#define gets(a) fgets( a, sizeof(*(a)), stdin)
#endif #endif
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@

@ -102,16 +102,6 @@ std::wstring utf8_to_wide(const std::string &input)
return out; return out;
} }
#ifdef __ANDROID__
// TODO: this is an ugly fix for wide_to_utf8 somehow not working on android
std::string wide_to_utf8(const std::wstring &input)
{
return wide_to_narrow(input);
}
#else // __ANDROID__
std::string wide_to_utf8(const std::wstring &input) std::string wide_to_utf8(const std::wstring &input)
{ {
size_t inbuf_size = (input.length() + 1) * sizeof(wchar_t); size_t inbuf_size = (input.length() + 1) * sizeof(wchar_t);
@ -138,8 +128,6 @@ std::string wide_to_utf8(const std::wstring &input)
return out; return out;
} }
#endif // __ANDROID__
#else // _WIN32 #else // _WIN32
std::wstring utf8_to_wide(const std::string &input) std::wstring utf8_to_wide(const std::string &input)