forked from Mirrorlandia_minetest/minetest
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:
parent
f97c2702a2
commit
eb3aac20c8
@ -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 :
|
||||
|
@ -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
|
||||
|
@ -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,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
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user