Skip to content

Commit

Permalink
android: support NDK 19 and above (20 as of this commit)
Browse files Browse the repository at this point in the history
support for targeting API 14 and 15 was removed in NDK 18, so set
minimum version to 16
mips support was removed in NDK 17

Clang now takes care about correct linking with libc++ shared or
static, so don't manually specify them anymore.
Same with __ANDROID_API_LEVEL__ define and the sysroot / isystem
handling, that is all covered by a single -target <triple><version>
simplifying things quite a bit.

also align ownloud sdk values with main build.gradle

Change-Id: Ib3ae4484e52214677e826270b731ecf7c5c15445
Reviewed-on: https://gerrit.libreoffice.org/77104
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Tested-by: Jenkins
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
  • Loading branch information
cloph committed Aug 8, 2019
1 parent bef9302 commit a7f6338
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 86 deletions.
2 changes: 1 addition & 1 deletion android/Bootstrap/Makefile.shared
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ WHOLELIBS = \
$(OBJLOCAL)/liblo-native-code.so : native-code.cxx $(ALL_STATIC_LIBS)
@echo "Linking $@"
mkdir -p $(OBJLOCAL)
$(CXX) -Wl,--build-id=sha1 -Wl,--gc-sections -Wl,--version-script=../Bootstrap/version.map -Wl,--no-keep-files-mapped -Wl,--no-undefined -DANDROID -DDISABLE_DYNLOADING -shared -Wl,-soname,liblo-native-code.so -o $(OBJLOCAL)/liblo-native-code.so -I$(BUILDDIR)/config_host -I$(SRCDIR)/include native-code.cxx -L$(INSTDIR)/$(LIBO_LIB_FOLDER) $(WHOLELIBS) $(LIBS) -lc++_static -lc++abi -landroid_support $(if $(filter armeabi-v7a,$(ANDROID_APP_ABI)),-lunwind) $(addprefix -l,$(NSSLIBS)) -lGLESv2 -landroid -ljnigraphics -llog -lz
$(CXX) -Wl,--build-id=sha1 -Wl,--gc-sections -Wl,--version-script=../Bootstrap/version.map -Wl,--no-keep-files-mapped -Wl,--no-undefined -DANDROID -DDISABLE_DYNLOADING -shared -Wl,-soname,liblo-native-code.so -o $(OBJLOCAL)/liblo-native-code.so -I$(BUILDDIR)/config_host -I$(SRCDIR)/include native-code.cxx -L$(INSTDIR)/$(LIBO_LIB_FOLDER) $(WHOLELIBS) $(LIBS) -static-libstdc++ $(addprefix -l,$(NSSLIBS)) -lGLESv2 -landroid -ljnigraphics -llog -lz

$(SODEST)/liblo-native-code.so : $(OBJLOCAL)/liblo-native-code.so
mkdir -p $(SODEST)
Expand Down
6 changes: 5 additions & 1 deletion android/source/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ android {
strippedUIEditing.assets.srcDirs 'assets_strippedUI'
}
defaultConfig {
minSdkVersion 14
minSdkVersion 16
targetSdkVersion 26
vectorDrawables.useSupportLibrary = true
}
Expand Down Expand Up @@ -92,6 +92,10 @@ android {
}
fullUI.dimension "default"
}
lintOptions {
// don't error-out on missing translations
warning 'MissingTranslation'
}
}

/* remark inherited from makefile:
Expand Down
4 changes: 2 additions & 2 deletions bridges/Library_cpp_uno.mk
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,15 @@ endif

else ifeq ($(CPUNAME),GODSON)

ifneq ($(filter ANDROID LINUX,$(OS)),)
ifneq ($(filter LINUX,$(OS)),)
bridges_SELECTED_BRIDGE := gcc3_linux_mips
bridge_noopt_objects := cpp2uno uno2cpp
bridge_exception_objects := except
endif

else ifeq ($(CPUNAME),GODSON64)

ifneq ($(filter ANDROID LINUX,$(OS)),)
ifneq ($(filter LINUX,$(OS)),)
bridges_SELECTED_BRIDGE := gcc3_linux_mips64
bridge_asm_objects := call
bridge_noopt_objects := cpp2uno uno2cpp
Expand Down
78 changes: 26 additions & 52 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -413,64 +413,47 @@ if test -n "$with_android_ndk"; then
11.1.*|12.1.*|13.1.*|14.1.*)
AC_MSG_ERROR([Building for Android is only supported with NDK versions above 16.x.*])
;;
16.*)
16.*|17.*|18.*|19.*|20.*)
;;
*)
AC_MSG_WARN([Untested Android NDK version $ANDROID_NDK_VERSION, only version 16.* have been used successfully. Proceed at your own risk.])
add_warning "Untested Android NDK version $ANDROID_NDK_VERSION, only version 16.* have been used successfully. Proceed at your own risk."
AC_MSG_WARN([Untested Android NDK version $ANDROID_NDK_VERSION, only versions 16.* til 20.* have been used successfully. Proceed at your own risk.])
add_warning "Untested Android NDK version $ANDROID_NDK_VERSION, only versions 16.* til 20.* have been used successfully. Proceed at your own risk."
;;
esac

ANDROID_API_LEVEL=14
ANDROID_API_LEVEL=16
android_cpu=$host_cpu
ANDROID_ARCH=$android_cpu
if test $host_cpu = arm; then
android_platform_prefix=$android_cpu-linux-androideabi
android_platform_prefix=arm-linux-androideabi
android_gnu_prefix=$android_platform_prefix
LLVM_TRIPLE=armv7-none-linux-androideabi
LLVM_TRIPLE=armv7a-linux-androideabi
ANDROID_APP_ABI=armeabi-v7a
ANDROIDCFLAGS="-mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=neon -Wl,--fix-cortex-a8"
elif test $host_cpu = aarch64; then
android_platform_prefix=$android_cpu-linux-android
android_platform_prefix=aarch64-linux-android
android_gnu_prefix=$android_platform_prefix
LLVM_TRIPLE=aarch64-none-linux-android
LLVM_TRIPLE=$android_platform_prefix
# minimum android version that supports aarch64
ANDROID_API_LEVEL=21
ANDROID_APP_ABI=arm64-v8a
ANDROID_ARCH=arm64
elif test $host_cpu = mips; then
android_platform_prefix=mipsel-linux-android
android_gnu_prefix=$android_platform_prefix
LLVM_TRIPLE=mipsel-none-linux-android
ANDROID_APP_ABI=mips
else
# host_cpu is something like "i386" or "i686" I guess, NDK uses
# "x86" in some contexts
android_cpu=x86
android_platform_prefix=$android_cpu
android_gnu_prefix=i686-linux-android
LLVM_TRIPLE=i686-none-linux-android
LLVM_TRIPLE=$android_gnu_prefix
ANDROID_APP_ABI=x86
ANDROID_ARCH=$android_cpu
ANDROIDCFLAGS="-march=atom"
fi

case "$with_android_ndk_toolchain_version" in
clang5.0)
ANDROID_GCC_TOOLCHAIN_VERSION=4.9
ANDROID_BINUTILS_DIR=$ANDROID_NDK_HOME/toolchains/$android_platform_prefix-$ANDROID_GCC_TOOLCHAIN_VERSION
ANDROID_COMPILER_DIR=$ANDROID_NDK_HOME/toolchains/llvm
;;
*)
AC_MSG_ERROR([Unrecognized value for the --with-android-ndk-toolchain-version option. Building for Android is only supported with Clang 5.*])
esac

if test ! -d $ANDROID_BINUTILS_DIR; then
AC_MSG_ERROR([No directory $ANDROID_BINUTILS_DIR])
elif test ! -d $ANDROID_COMPILER_DIR; then
AC_MSG_ERROR([No directory $ANDROID_COMPILER_DIR])
fi

# NDK 15 or later toolchain is 64bit-only, except for Windows that we don't support. Using a 64-bit
# linker is required if you compile large parts of the code with -g. A 32-bit linker just won't
# manage to link the (app-specific) single huge .so that is built for the app in
Expand All @@ -479,41 +462,37 @@ if test -n "$with_android_ndk"; then
# all objects have been built with debug information.)
case $build_os in
linux-gnu*)
ndk_build_os=linux
android_HOST_TAG=linux-x86_64
;;
darwin*)
ndk_build_os=darwin
android_HOST_TAG=darwin-x86_64
;;
*)
AC_MSG_ERROR([We only support building for Android from Linux or macOS])
# ndk would also support windows and windows-x86_64
;;
esac
ANDROID_COMPILER_BIN=$ANDROID_COMPILER_DIR/prebuilt/$ndk_build_os-x86_64/bin
ANDROID_BINUTILS_PREBUILT_ROOT=$ANDROID_BINUTILS_DIR/prebuilt/$ndk_build_os-x86_64
android_TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/$android_HOST_TAG
ANDROID_COMPILER_BIN=$android_TOOLCHAIN/bin
dnl TODO: NSS build uses it...
ANDROID_BINUTILS_PREBUILT_ROOT=$ANDROID_NDK_HOME/toolchains/$android_platform_prefix-$ANDROID_GCC_TOOLCHAIN_VERSION/prebuilt/$android_HOST_TAG
AC_SUBST(ANDROID_BINUTILS_PREBUILT_ROOT)

test -z "$SYSBASE" && SYSBASE=$ANDROID_NDK_HOME/platforms/android-${ANDROID_API_LEVEL}/arch-${ANDROID_ARCH}
test -z "$AR" && AR=$ANDROID_BINUTILS_PREBUILT_ROOT/bin/$android_gnu_prefix-ar
test -z "$NM" && NM=$ANDROID_BINUTILS_PREBUILT_ROOT/bin/$android_gnu_prefix-nm
test -z "$OBJDUMP" && OBJDUMP=$ANDROID_BINUTILS_PREBUILT_ROOT/bin/$android_gnu_prefix-objdump
test -z "$RANLIB" && RANLIB=$ANDROID_BINUTILS_PREBUILT_ROOT/bin/$android_gnu_prefix-ranlib
test -z "$STRIP" && STRIP=$ANDROID_BINUTILS_PREBUILT_ROOT/bin/$android_gnu_prefix-strip

ANDROIDCFLAGS="$ANDROIDCFLAGS -gcc-toolchain $ANDROID_BINUTILS_PREBUILT_ROOT -target $LLVM_TRIPLE$ANDROID_API_LEVEL -no-canonical-prefixes"
# android is using different sysroots for compilation and linking, but as
# there is no full separation in configure and elsewhere, use isystem for
# compilation stuff and sysroot for linking
ANDROIDCFLAGS="$ANDROIDCFLAGS -D__ANDROID_API__=$ANDROID_API_LEVEL -isystem $ANDROID_NDK_HOME/sysroot/usr/include"
ANDROIDCFLAGS="$ANDROIDCFLAGS -isystem $ANDROID_NDK_HOME/sysroot/usr/include/$android_gnu_prefix"
ANDROIDCFLAGS="$ANDROIDCFLAGS --sysroot=$SYSBASE -ffunction-sections -fdata-sections -Qunused-arguments"
ANDROIDCFLAGS="$ANDROIDCFLAGS -L$ANDROID_NDK_HOME/sources/cxx-stl/llvm-libc++/libs/$ANDROID_APP_ABI"
test -z "$AR" && AR=$ANDROID_COMPILER_BIN/$android_gnu_prefix-ar
test -z "$NM" && NM=$ANDROID_COMPILER_BIN/$android_gnu_prefix-nm
test -z "$OBJDUMP" && OBJDUMP=$ANDROID_COMPILER_BIN/$android_gnu_prefix-objdump
test -z "$RANLIB" && RANLIB=$ANDROID_COMPILER_BIN/$android_gnu_prefix-ranlib
test -z "$STRIP" && STRIP=$ANDROID_COMPILER_BIN/$android_gnu_prefix-strip

ANDROIDCFLAGS="$ANDROIDCFLAGS -target ${LLVM_TRIPLE}${ANDROID_API_LEVEL}"
ANDROIDCFLAGS="$ANDROIDCFLAGS -no-canonical-prefixes -ffunction-sections -fdata-sections -Qunused-arguments"
if test "$ENABLE_LTO" = TRUE; then
# -flto comes from com_GCC_defs.mk, too, but we need to make sure it gets passed as part of
# $CC and $CXX when building external libraries
ANDROIDCFLAGS="$ANDROIDCFLAGS -flto -fuse-linker-plugin -O2"
fi

ANDROIDCXXFLAGS="$ANDROIDCFLAGS -I$ANDROID_NDK_HOME/sources/cxx-stl/llvm-libc++/include -I$ANDROID_NDK_HOME/sources/cxx-stl/llvm-libc++abi/include -I$ANDROID_NDK_HOME/sources/android/support/include -std=c++11"
ANDROIDCXXFLAGS="$ANDROIDCFLAGS -stdlib=libc++"

if test -z "$CC"; then
CC="$ANDROID_COMPILER_BIN/clang $ANDROIDCFLAGS"
Expand Down Expand Up @@ -822,7 +801,7 @@ if test "$_os" = "Android" ; then
# Verify that the NDK and SDK options are proper
if test -z "$with_android_ndk"; then
AC_MSG_ERROR([the --with-android-ndk option is mandatory, unless it is available at external/android-ndk/.])
elif test ! -f "$ANDROID_NDK_HOME/platforms/android-${ANDROID_API_LEVEL}/arch-${ANDROID_ARCH}/usr/lib/libc.a"; then
elif test ! -f "$ANDROID_NDK_HOME/meta/abis.json"; then
AC_MSG_ERROR([the --with-android-ndk option does not point to an Android NDK])
fi

Expand Down Expand Up @@ -4536,11 +4515,6 @@ linux-android*)
RTL_ARCH=AARCH64
PLATFORMID=android_aarch64
;;
mips|mipsel)
CPUNAME=GODSON # Weird, but maybe that's the LO convention?
RTL_ARCH=MIPS_EL
PLATFORMID=android_mips_el
;;
i*86)
CPUNAME=INTEL
RTL_ARCH=x86
Expand Down
2 changes: 1 addition & 1 deletion external/nss/ExternalProject_nss.mk
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ $(call gb_ExternalProject_get_state_target,nss,build): $(call gb_ExternalExecuta
COMMA=$(COMMA) \
CC="$(CC)$(if $(filter ANDROID,$(OS)), -D_PR_NO_LARGE_FILES=1 -DSQLITE_DISABLE_LFS=1)" CCC="$(CXX)" \
$(if $(CROSS_COMPILING),NSINSTALL="$(call gb_ExternalExecutable_get_command,python) $(SRCDIR)/external/nss/nsinstall.py") \
$(if $(filter ANDROID,$(OS)),OS_TARGET=Android OS_TARGET_RELEASE=14 ARCHFLAG="" DEFAULT_COMPILER=clang ANDROID_NDK=$(ANDROID_NDK_HOME) ANDROID_TOOLCHAIN_VERSION=$(ANDROID_GCC_TOOLCHAIN_VERSION) ANDROID_PREFIX=$(HOST_PLATFORM) ANDROID_SYSROOT=$(SYSBASE) ANDROID_TOOLCHAIN=$(ANDROID_BINUTILS_PREBUILT_ROOT)) \
$(if $(filter ANDROID,$(OS)),OS_TARGET=Android OS_TARGET_RELEASE=16 ARCHFLAG="" DEFAULT_COMPILER=clang ANDROID_NDK=$(ANDROID_NDK_HOME) ANDROID_TOOLCHAIN_VERSION=$(ANDROID_GCC_TOOLCHAIN_VERSION) ANDROID_PREFIX=$(HOST_PLATFORM) ANDROID_SYSROOT=$(ANDROID_NDK_HOME)/sysroot ANDROID_TOOLCHAIN=$(ANDROID_BINUTILS_PREBUILT_ROOT)) \
NSS_DISABLE_GTESTS=1 \
nss_build_all \
&& rm -f $(call gb_UnpackedTarball_get_dir,nss)/dist/out/lib/*.a \
Expand Down
16 changes: 12 additions & 4 deletions external/owncloud-android-lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,17 @@ apply plugin: 'com.android.library'
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.android.tools.build:gradle:3.1.3'
}
}

allprojects {
repositories {
jcenter()
google()
}
}

Expand All @@ -18,11 +26,11 @@ android {
}

compileSdkVersion 26
buildToolsVersion "26.0.1"
buildToolsVersion "27.0.3"

defaultConfig {
minSdkVersion 14
targetSdkVersion 24
minSdkVersion 16
targetSdkVersion 26
}

sourceSets {
Expand Down
17 changes: 0 additions & 17 deletions solenv/gbuild/platform/ANDROID_GODSON_GCC.mk

This file was deleted.

9 changes: 1 addition & 8 deletions solenv/gbuild/platform/android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,7 @@

ifeq ($(DISABLE_DYNLOADING),TRUE)

gb_STDLIBS := \
-lc++_static \
-lc++abi \
-landroid_support \

else

gb_STDLIBS := -lc++_shared
gb_STDLIBS := -static-libstdc++

endif

Expand Down

0 comments on commit a7f6338

Please sign in to comment.