Android: fix horrible libiconv build
authorest31 <MTest31@outlook.com>
Wed, 29 Jul 2015 09:54:27 +0000 (11:54 +0200)
committerest31 <MTest31@outlook.com>
Wed, 29 Jul 2015 13:59:06 +0000 (15:59 +0200)
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.

build/android/Makefile
build/android/jni/Android.mk
build/android/libiconv_android_mk.patch [deleted file]
build/android/libiconv_stdio.patch
src/util/string.cpp

index b87199541d408430ff9b243688f631ca27cccc8a..295ddf620aea98573950510c1e1ff16abe9b22be 100644 (file)
@@ -133,7 +133,7 @@ FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android
 
 ICONV_VERSION = 1.14
 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_INT = $(ROOT)/deps/iconv_timestamp
 ICONV_URL_HTTP = http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz
@@ -445,52 +445,55 @@ $(ICONV_TIMESTAMP) : iconv_download
        fi
 
 iconv_download :
-       @if [ ! -d ${ICONV_DIR} ] ; then                                        \
-               echo "iconv sources missing, downloading...";                       \
-               mkdir -p ${ROOT}/deps;                                                 \
-               cd ${ROOT}/deps;                                                               \
-               wget ${ICONV_URL_HTTP} || exit 1;                                    \
-               tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1;                     \
-               rm libiconv-${ICONV_VERSION}.tar.gz;                                     \
-               ln -s libiconv-${ICONV_VERSION} libiconv;                                      \
-               cd ${ICONV_DIR};                                                                   \
-               patch -p1 < ${ROOT}/libiconv_android.patch;                                                     \
-               patch -p1 < ${ROOT}/libiconv_android_mk.patch;                                                     \
-               patch -p1 < ${ROOT}/libiconv_stdio.patch;                                                     \
-               cd jni;                                                                       \
-               ln -s .. src;                                                                         \
+       @if [ ! -d ${ICONV_DIR} ] ; then                                           \
+               echo "iconv sources missing, downloading...";                      \
+               mkdir -p ${ROOT}/deps;                                             \
+               cd ${ROOT}/deps;                                                   \
+               wget ${ICONV_URL_HTTP} || exit 1;                                  \
+               tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1;               \
+               rm libiconv-${ICONV_VERSION}.tar.gz;                               \
+               ln -s libiconv-${ICONV_VERSION} libiconv;                          \
+               cd ${ICONV_DIR};                                                   \
+               patch -p1 < ${ROOT}/libiconv_android.patch;                        \
+               patch -p1 < ${ROOT}/libiconv_stdio.patch;                          \
        fi
 
 iconv : $(ICONV_LIB)
 
 $(ICONV_LIB) : $(ICONV_TIMESTAMP)
        @REFRESH=0;                                                                \
-       if [ ! -e ${ICONV_TIMESTAMP_INT} ] ; then                               \
-               REFRESH=1;                                                             \
+       if [ ! -e ${ICONV_TIMESTAMP_INT} ] ; then                                  \
+               REFRESH=1;                                                         \
        fi;                                                                        \
-       if [ ! -e ${ICONV_LIB} ] ; then                                         \
-               REFRESH=1;                                                             \
+       if [ ! -e ${ICONV_LIB} ] ; then                                            \
+               REFRESH=1;                                                         \
        fi;                                                                        \
-       if [ ${ICONV_TIMESTAMP} -nt ${ICONV_TIMESTAMP_INT} ] ; then          \
-               REFRESH=1;                                                             \
+       if [ ${ICONV_TIMESTAMP} -nt ${ICONV_TIMESTAMP_INT} ] ; then                \
+               REFRESH=1;                                                         \
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
-       mkdir -p ${ICONV_DIR};                                                  \
+       mkdir -p ${ICONV_DIR};                                                     \
        export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK};             \
-       echo "changed timestamp for iconv detected building...";                \
-       cd ${ICONV_DIR};                                            \
-       ./configure;                                            \
-       make;                                            \
-       export NDK_PROJECT_PATH=${ICONV_DIR};                                \
-       ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH}              \
-       APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI}                         \
-       TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                    \
-       TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                                  \
-       TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                     \
-       touch ${ICONV_TIMESTAMP};                                               \
-       touch ${ICONV_TIMESTAMP_INT};                                           \
+       echo "changed timestamp for iconv detected building...";                   \
+       cd ${ICONV_DIR};                                                           \
+       \
+       export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv;                            \
+       ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
+       --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                         \
+       --install-dir=$${TOOLCHAIN};                                               \
+       export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
+       export CC=${CROSS_PREFIX}gcc;                                              \
+       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_INT};                                              \
+       rm -rf ${TOOLCHAIN};                                                       \
        else                                                                       \
-               echo "nothing to be done for iconv";                                \
+               echo "nothing to be done for iconv";                               \
        fi
 
 clean_iconv :
index 332677b8474ed6f20a8e85be6bd05ea259586c20..61ba1d0f0110742b9a0c8741a8a7cb916e432dae 100644 (file)
@@ -26,8 +26,8 @@ include $(PREBUILT_STATIC_LIBRARY)
 
 include $(CLEAR_VARS)
 LOCAL_MODULE := iconv
-LOCAL_SRC_FILES := deps/libiconv/obj/local/$(TARGET_ARCH_ABI)/libiconv.a
-include $(PREBUILT_STATIC_LIBRARY)
+LOCAL_SRC_FILES := deps/libiconv/lib/.libs/libiconv.so
+include $(PREBUILT_SHARED_LIBRARY)
 
 include $(CLEAR_VARS)
 LOCAL_MODULE := openal
@@ -355,8 +355,8 @@ LOCAL_SRC_FILES +=                                \
 # json
 LOCAL_SRC_FILES += jni/src/json/jsoncpp.cpp
 
-LOCAL_SHARED_LIBRARIES := openal ogg vorbis gmp
-LOCAL_STATIC_LIBRARIES := Irrlicht iconv freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS)
+LOCAL_SHARED_LIBRARIES := iconv openal ogg vorbis gmp
+LOCAL_STATIC_LIBRARIES := Irrlicht freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS)
 
 ifeq ($(HAVE_LEVELDB), 1)
        LOCAL_STATIC_LIBRARIES += LevelDB
diff --git a/build/android/libiconv_android_mk.patch b/build/android/libiconv_android_mk.patch
deleted file mode 100644 (file)
index 9eb7a19..0000000
+++ /dev/null
@@ -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)
-+
index 19cb6aa09813f00c7ff72ec05ba6ad86cb0b6516..9fa50f79af00cb425c857475b133d57fe7c4830c 100644 (file)
@@ -1,10 +1,13 @@
 --- 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
-@@ -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,
     so any use of gets warrants an unconditional warning.  Assume it is
     always declared, since it is required by C89.  */
 -_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)
- #endif
\ No newline at end of file
+ #endif
+
+
+#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
index 60ccc9300061829e35a3c198b93a1688f66f9312..6d1eda078025d8aefc9e00dcf0091fa6bc1c3082 100644 (file)
@@ -102,16 +102,6 @@ std::wstring utf8_to_wide(const std::string &input)
        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)
 {
        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;
 }
 
-#endif // __ANDROID__
-
 #else // _WIN32
 
 std::wstring utf8_to_wide(const std::string &input)