Fix Android build for ndk r29 on ubuntu 26.04

Drop armeabi-v7a and minapi16 (EOL), build arm64-v8a at API 21/24 only.

Toolchain:
- Replace make_standalone_toolchain.py with direct NDK toolchain copy
- Use NDK r29 compiler triple naming and llvm-ar/llvm-ranlib
- Add gentoo_disturl() for hash-based Gentoo mirror URLs

Dependencies:
- Add librnp (openssl backend) with json-c and sexpp support
- Add qemu-user for librnp cross-compilation feature detection
- Replace sqlcipher with plain sqlite (RS_SQLCIPHER=OFF)
- Switch rapidjson to git source for C++17 compatibility
- Bump bzip2, zlib, libpng, xapian, tiff, cimg, sqlite versions

CMake:
- Remove Android C++14 workaround (NDK r29 std::filesystem works)
- Refactor RS_RNPLIB to support inline, pre-built, and FetchContent
- Add CMAKE_POLICY_VERSION_MINIMUM for CMake 4.x compatibility

Dockerfile:
- Move to Ubuntu 26.04, python-is-python3
- Split COPY for layer caching of SDK and toolchain builds
This commit is contained in:
Gioacchino Mazzurco 2026-06-13 16:03:57 +02:00
parent aa8832f70c
commit ba90b27199
No known key found for this signature in database
GPG Key ID: A1FBCA3872E87051
6 changed files with 287 additions and 296 deletions

View File

@ -3,21 +3,6 @@
# for each minimum Android API level. After build the AAR packages are published
# on the project Gitlab maven repository
android-AAR-minapi16:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS == "true"
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_16
script:
- rm -rf /libretroshare-aar/
- >
./gradlew build publish
-Dorg.gradle.project.buildDir=/libretroshare-build/
-PANDROID_MIN_API_LEVEL=16
-PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA"
-PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
tags:
- storage50
android-AAR-minapi21:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS == "true"
@ -53,42 +38,6 @@ android-AAR-minapi24:
# split per architecture and build type and without maven publishing, instead at
# the end of the job the artifact is made available
android-minapi16_armeabi-v7a_bundleDebugAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_16_armeabi-v7a_bundleDebugAar
script:
- rm -rf /libretroshare-aar/
- >
./gradlew bundleDebugAar
-Dorg.gradle.project.buildDir=/libretroshare-build/
-PANDROID_MIN_API_LEVEL=16
-PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA"
-PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
-PJNI_NATIVE_LIBS_ARCHS="armeabi-v7a"
- mv /libretroshare-build/outputs/aar/ $CI_PROJECT_DIR/outputs-aar/
artifacts:
paths:
- outputs-aar/
android-minapi16_armeabi-v7a_bundleReleaseAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_16_armeabi-v7a_bundleReleaseAar
script:
- rm -rf /libretroshare-aar/
- >
./gradlew bundleReleaseAar
-Dorg.gradle.project.buildDir=/libretroshare-build/
-PANDROID_MIN_API_LEVEL=16
-PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA"
-PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
-PJNI_NATIVE_LIBS_ARCHS="armeabi-v7a"
- mv /libretroshare-build/outputs/aar/ $CI_PROJECT_DIR/outputs-aar/
artifacts:
paths:
- outputs-aar/
android-minapi21_arm64-v8a_bundleDebugAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
@ -125,42 +74,6 @@ android-minapi21_arm64-v8a_bundleReleaseAar:
paths:
- outputs-aar/
android-minapi21_armeabi-v7a_bundleDebugAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_21_armeabi-v7a_bundleDebugAar
script:
- rm -rf /libretroshare-aar/
- >
./gradlew bundleDebugAar
-Dorg.gradle.project.buildDir=/libretroshare-build/
-PANDROID_MIN_API_LEVEL=21
-PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA"
-PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
-PJNI_NATIVE_LIBS_ARCHS="armeabi-v7a"
- mv /libretroshare-build/outputs/aar/ $CI_PROJECT_DIR/outputs-aar/
artifacts:
paths:
- outputs-aar/
android-minapi21_armeabi-v7a_bundleReleaseAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_21_armeabi-v7a_bundleReleaseAar
script:
- rm -rf /libretroshare-aar/
- >
./gradlew bundleReleaseAar
-Dorg.gradle.project.buildDir=/libretroshare-build/
-PANDROID_MIN_API_LEVEL=21
-PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA"
-PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
-PJNI_NATIVE_LIBS_ARCHS="armeabi-v7a"
- mv /libretroshare-build/outputs/aar/ $CI_PROJECT_DIR/outputs-aar/
artifacts:
paths:
- outputs-aar/
android-minapi24_arm64-v8a_bundleDebugAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
@ -196,39 +109,3 @@ android-minapi24_arm64-v8a_bundleReleaseAar:
artifacts:
paths:
- outputs-aar/
android-minapi24_armeabi-v7a_bundleDebugAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_24_armeabi-v7a_bundleDebugAar
script:
- rm -rf /libretroshare-aar/
- >
./gradlew bundleDebugAar
-Dorg.gradle.project.buildDir=/libretroshare-build/
-PANDROID_MIN_API_LEVEL=24
-PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA"
-PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
-PJNI_NATIVE_LIBS_ARCHS="armeabi-v7a"
- mv /libretroshare-build/outputs/aar/ $CI_PROJECT_DIR/outputs-aar/
artifacts:
paths:
- outputs-aar/
android-minapi24_armeabi-v7a_bundleReleaseAar:
rules:
- if: $PROJECT_HAVE_STORAGE50_RUNNERS != "true"
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_24_armeabi-v7a_bundleReleaseAar
script:
- rm -rf /libretroshare-aar/
- >
./gradlew bundleReleaseAar
-Dorg.gradle.project.buildDir=/libretroshare-build/
-PANDROID_MIN_API_LEVEL=24
-PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA"
-PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
-PJNI_NATIVE_LIBS_ARCHS="armeabi-v7a"
- mv /libretroshare-build/outputs/aar/ $CI_PROJECT_DIR/outputs-aar/
artifacts:
paths:
- outputs-aar/

View File

@ -1,7 +1,6 @@
# RetroShare decentralized communication platform
#
# Copyright (C) 2021-2022 Gioacchino Mazzurco <gio@retroshare.cc>
# Copyright (C) 2021-2022 Asociación Civil Altermundi <info@altermundi.net>
# Copyright (C) 2021-2026 Gioacchino Mazzurco <gio@retroshare.cc>
#
# SPDX-License-Identifier: CC0-1.0
@ -244,23 +243,7 @@ if(RS_LIBRETROSHARE_SHARED)
endif()
endif(RS_LIBRETROSHARE_SHARED)
if(RS_ANDROID)
# As of today Android NDK libc++ doesn't support std::filesystem properly,
# in a very confusing manner the headers have the function declarations but
# then the shared object file doesn't have the implementation.
# This fools the compiler which doesn't report any error but then at runtime
# we get a crash with this error:
# java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol
# "_ZNSt6__ndk14__fs10filesystem20__create_directoriesERKNS1_4pathEPNS_10error_codeE"
# referenced by "/data/app/==/lib/arm64/libretroshare.so
# So set maximum supported C++ version to 14 to workaround this Android bug
# https://github.com/android/ndk/issues/609
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)
else()
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
endif()
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
if(WIN32)
target_compile_definitions(
@ -331,27 +314,73 @@ target_include_directories(${PROJECT_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto)
################################################################################
if(RS_RNPLIB)
# librnp
set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
set(BUILD_TESTING OFF)
set(BUILD_SHARED_LIBS OFF)
set(DOWNLOAD_GTEST OFF)
set(ENABLE_DOC OFF CACHE BOOL "Disable librnp docs" FORCE)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp" "${CMAKE_CURRENT_BINARY_DIR}/librnp")
set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS})
macro(rnplib_set_inline_build_options)
set(RNPLIB_BUILD_SHARED ${RS_LIBRETROSHARE_SHARED})
set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
set(BUILD_TESTING OFF)
set(BUILD_SHARED_LIBS ${RNPLIB_BUILD_SHARED})
set(DOWNLOAD_GTEST OFF)
set(ENABLE_DOC OFF CACHE BOOL "Disable librnp docs" FORCE)
endmacro()
target_link_libraries(${PROJECT_NAME} PRIVATE
librnp
sexpp
)
macro(rnplib_restore_build_options)
set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS})
endmacro()
target_include_directories(${PROJECT_NAME} PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/include"
"${CMAKE_CURRENT_BINARY_DIR}/librnp/src/lib"
)
set(RNPLIB_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/")
if(EXISTS "${RNPLIB_DEVEL_DIR}/CMakeLists.txt")
message(STATUS "librnp source found at ${RNPLIB_DEVEL_DIR} using it")
rnplib_set_inline_build_options()
add_subdirectory("${RNPLIB_DEVEL_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/librnp")
rnplib_restore_build_options()
set(RNPLIB_SRC_DIR "${RNPLIB_DEVEL_DIR}")
set(RNPLIB_BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/librnp")
set(RNPLIB_INLINE_BUILD ON)
else()
find_library(LIBRNP_LIBRARY NAMES rnp)
if(LIBRNP_LIBRARY)
message(STATUS "Found pre-built librnp at ${LIBRNP_LIBRARY}")
find_library(LIBSEXPP_LIBRARY NAMES sexpp)
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRNP_LIBRARY})
if(LIBSEXPP_LIBRARY)
message(STATUS "and sexpp at ${LIBSEXPP_LIBRARY}")
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBSEXPP_LIBRARY})
endif()
set(RNPLIB_INLINE_BUILD OFF)
else()
message(STATUS "librnp not found locally, using FetchContent")
rnplib_set_inline_build_options()
FetchContent_Declare(
librnp
GIT_REPOSITORY "https://github.com/rnpgp/rnp.git"
GIT_TAG "origin/main"
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
TIMEOUT 10
)
FetchContent_MakeAvailable(librnp)
rnplib_restore_build_options()
set(RNPLIB_SRC_DIR "${librnp_SOURCE_DIR}")
set(RNPLIB_BIN_DIR "${librnp_BINARY_DIR}")
set(RNPLIB_INLINE_BUILD ON)
endif()
endif()
if(RNPLIB_INLINE_BUILD)
target_include_directories(${PROJECT_NAME} PUBLIC
"${RNPLIB_SRC_DIR}/include"
"${RNPLIB_BIN_DIR}/src/lib"
)
if(RNPLIB_BUILD_SHARED)
target_link_libraries(${PROJECT_NAME} PRIVATE librnp)
else()
target_link_libraries(${PROJECT_NAME} PRIVATE librnp sexpp)
endif()
endif()
else()
set(OPENPGPSDK_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../openpgpsdk/")
@ -391,7 +420,7 @@ if(RS_BITDHT)
else()
FetchContent_Declare(
bitdht
GIT_REPOSITORY "https://github.com/RetroShare/BitDHT.git"
GIT_REPOSITORY "https://github.com/RetroShare/BitDHT.git"
GIT_TAG "origin/master"
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
@ -650,6 +679,8 @@ if(RS_BRODCAST_DISCOVERY)
set(BUILD_EXAMPLE OFF CACHE BOOL "Do not build udp-discovery-cpp examples")
set(BUILD_TOOL OFF CACHE BOOL "Do not build udp-discovery-tool application")
set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
set(UDP_DISCOVERY_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/udp-discovery-cpp/")
if(EXISTS "${UDP_DISCOVERY_DEVEL_DIR}/CMakeLists.txt")
message( STATUS
@ -746,23 +777,20 @@ set(V_VERSION_SET OFF)
if( NOT RS_MAJOR_VERSION STREQUAL "" AND
NOT RS_MINOR_VERSION STREQUAL "" AND
NOT RS_MINI_VERSION STREQUAL "" )
message(STATUS "RetroShare version ${RS_MAJOR_VERSION}.${RS_MINOR_VERSION}.${RS_MINI_VERSION}${RS_EXTRA_VERSION} defined in command line")
message(STATUS "libRetroShare version ${RS_MAJOR_VERSION}.${RS_MINOR_VERSION}.${RS_MINI_VERSION}${RS_EXTRA_VERSION} defined in command line")
set(V_VERSION_SET ON)
else()
set(V_GIT_DESCRIBE_OUTPUT "")
set(V_GIT_DESCRIBE_REGEXP "^v([0-9]+).([0-9]+).([0-9]+)(.*)\n$")
set(V_GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../.git")
set(V_GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
endif()
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --long --match v*.*.*
WORKING_DIRECTORY "${V_GIT_DIR}"
OUTPUT_VARIABLE V_GIT_DESCRIBE_OUTPUT )
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE V_GIT_DESCRIBE_OUTPUT
RESULT_VARIABLE V_GIT_RESULT ) # Avoid CMake failure if git fails
if(V_GIT_DESCRIBE_OUTPUT MATCHES "${V_GIT_DESCRIBE_REGEXP}")
if( V_GIT_RESULT EQUAL 0 AND
V_GIT_DESCRIBE_OUTPUT MATCHES "${V_GIT_DESCRIBE_REGEXP}" )
string(
REGEX REPLACE
"${V_GIT_DESCRIBE_REGEXP}" "\\1;\\2;\\3;\\4"
@ -772,10 +800,10 @@ else()
list(GET V_GIT_DESCRIBE_LIST 2 RS_MINI_VERSION)
list(GET V_GIT_DESCRIBE_LIST 3 RS_EXTRA_VERSION)
message("RetroShare version ${RS_MAJOR_VERSION}.${RS_MINOR_VERSION}.${RS_MINI_VERSION}${RS_EXTRA_VERSION} determined via git")
message("libRetroShare version ${RS_MAJOR_VERSION}.${RS_MINOR_VERSION}.${RS_MINI_VERSION}${RS_EXTRA_VERSION} determined via git")
set(V_VERSION_SET ON)
else()
message(WARNING "Determining RetroShare version via git failed plese specify it through CMake command line arguments!")
message(WARNING "Determining libRetroShare version via git failed please specify it through CMake command line arguments!")
endif()
endif()
@ -788,22 +816,6 @@ if(V_VERSION_SET)
PUBLIC RS_EXTRA_VERSION="${RS_EXTRA_VERSION}" )
endif(V_VERSION_SET)
# Define the libretroshare specific version hash (submodule hash)
set(V_LIB_GIT_HASH "")
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=7 --always --dirty
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE V_LIB_GIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE )
if(V_LIB_GIT_HASH STREQUAL "")
set(V_LIB_GIT_HASH "[version not available]")
endif()
target_compile_definitions(
${PROJECT_NAME}
PUBLIC RS_LIB_VERSION_HASH="${V_LIB_GIT_HASH}" )
################################################################################
# TODO: Use generator expressions instead of CMAKE_BUILD_TYPE see

View File

@ -1,15 +1,14 @@
/*
* libretroshare Android AAR library gradle builder
*
* Copyright (C) 2022 Gioacchino Mazzurco <gio@retroshare.cc>
* Copyright (C) 2022 Asociación Civil Altermundi <info@altermundi.net>
* Copyright (C) 2022-2026 Gioacchino Mazzurco <gio@retroshare.cc>
*
* SPDX-License-Identifier: CC0-1.0
*/
/*
* Set minumum Android API level supported by this build passing
* -PANDROID_MIN_API_LEVEL=16 (change 16 to what you need) on the gradle command
* -PANDROID_MIN_API_LEVEL=21 (change 21 to what you need) on the gradle command
* line.
*
* LIBRETROSHARE_SOURCE_VERSION Set source version ex:
@ -17,7 +16,7 @@
*
* Optionally set JNI_NATIVE_LIBS_ARCHS to a space separated target CPU
* architectures list named as seen in AAR native libraries directories passing
* -PJNI_NATIVE_LIBS_ARCHS="arm64-v8a armeabi-v7a" defaults to all architectures
* -PJNI_NATIVE_LIBS_ARCHS="arm64-v8a" defaults to all architectures
* supported by current script at current Android minimum API
*
* Optionally set NATIVE_TOOLCHAINS_DIR for easier reuse of toolchains which
@ -65,7 +64,7 @@ ext.getAndroidMinApiLevel =
}
else
{
return 16
return 21
}
}
@ -77,14 +76,7 @@ ext.getJniNativeLibsArchs =
}
else
{
if(getAndroidMinApiLevel() <= 16)
{
return ['armeabi-v7a']
}
else
{
return ['arm64-v8a', 'armeabi-v7a']
}
return ['arm64-v8a']
}
}
@ -191,10 +183,6 @@ ext.buildLibretroshareNativeLib =
def libcxxsharedTriple = "unsupported"
switch(pAbi)
{
case "armeabi-v7a":
toolchainArch = "arm";
libcxxsharedTriple = "arm-linux-androideabi";
break;
case "arm64-v8a":
toolchainArch = "arm64";
libcxxsharedTriple = "aarch64-linux-android";
@ -287,7 +275,7 @@ android
// see https://stackoverflow.com/questions/27301867/what-is-compilesdkversion
compileSdkVersion 21
ndkVersion "21.0.6113669"
ndkVersion "29.0.14206865"
defaultConfig
{

View File

@ -1,7 +1,7 @@
## To prepare an image suitable as base for Gitlab CI use
## image name must match gitlab repository name, you can play just with the tag
## the part after :
# export ANDROID_MIN_API_LEVEL=16
# export ANDROID_MIN_API_LEVEL=21
# export CI_IMAGE_NAME="registry.gitlab.com/retroshare/retroshare:android_aar_base_${ANDROID_MIN_API_LEVEL}"
# docker build --squash --tag "${CI_IMAGE_NAME}" --build-arg ANDROID_MIN_API_LEVEL=${ANDROID_MIN_API_LEVEL} --build-arg LIBRETROSHARE_SOURCE_VERSION="$(git describe --always)" --file misc/Android/Dockerfile .
@ -9,49 +9,65 @@
## use --squash
## and set
## GRADLE_BUILD_TASK to bundleDebugAar or bundleReleaseAar
## JNI_NATIVE_LIBS_ARCHS to arm64-v8a or armeabi-v7a
## JNI_NATIVE_LIBS_ARCHS to arm64-v8a
## To push it to gitlab CI registry you need first to login and the to push
# docker login registry.gitlab.com
# docker push ${CI_IMAGE_NAME}
## To esly extract artifacts and other files you ar einterested into from the
## To easly extract artifacts and other files you are interested into from the
## image you can use a command similar to:
# docker cp $(docker create --rm ${CI_IMAGE_NAME}):/libretroshare-aar/* $HOME/
## see https://stackoverflow.com/a/59055906
FROM ubuntu:21.10
FROM ubuntu:26.04
ENV DEBIAN_FRONTEND=noninteractive
ENV APT_UNAT="--assume-yes --quiet"
ENV APT_INSTALL="apt-get install --no-install-recommends $APT_UNAT"
RUN apt-get update $APT_UNAT && apt-get upgrade --show-upgraded $APT_UNAT && \
apt-get clean $APT_UNAT
RUN apt-get install --no-install-recommends $APT_UNAT \
RUN $APT_INSTALL \
bash build-essential bzip2 cmake curl chrpath doxygen \
git python python3 tclsh unzip wget zip
git python-is-python3 python3 tclsh unzip wget zip
# Dependencies to create Android pkg
RUN apt-get install --no-install-recommends $APT_UNAT \
RUN $APT_INSTALL \
openjdk-11-jre openjdk-11-jdk openjdk-11-jdk-headless
# Dependecies to run librnp compile time openssl feature detection
RUN $APT_INSTALL qemu-user
ENV ANDROID_SDK_PATH="/opt/android-sdk"
ENV ANDROID_HOME="$ANDROID_SDK_PATH"
ENV ANDROID_SDK_ROOT="$ANDROID_SDK_PATH"
ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/"
## Copy only the toolchain build script first so Docker layer cache is not
## invalidated by unrelated source changes (C++, CMake, etc). This avoids
## re-downloading the Android SDK and rebuilding all native dependencies
## from scratch on every source edit. The full source tree is copied later
## just before the Gradle build which actually needs it.
ARG SOURCE_PATH=./
COPY $SOURCE_PATH /libretroshare
COPY $SOURCE_PATH/misc/Android/prepare-toolchain-clang.sh /libretroshare/misc/Android/prepare-toolchain-clang.sh
WORKDIR /libretroshare-build/
RUN /libretroshare/misc/Android/prepare-toolchain-clang.sh install_android_sdk
WORKDIR /libretroshare/
ARG ANDROID_MIN_API_LEVEL=16
ARG ANDROID_MIN_API_LEVEL=21
ARG LIBRETROSHARE_SOURCE_VERSION="Dockerfile_unset"
ARG GRADLE_BUILD_TASK="build"
ARG JNI_NATIVE_LIBS_ARCHS="arm64-v8a armeabi-v7a"
ARG JNI_NATIVE_LIBS_ARCHS="arm64-v8a"
ARG NATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
## Full source tree needed at this point for the Gradle build. Changes to
## source files will invalidate Docker layer cache from here onward, but all
## toolchain layers above remain cached as long as prepare-toolchain-clang.sh
## is unchanged.
COPY $SOURCE_PATH /libretroshare
RUN ./gradlew $GRADLE_BUILD_TASK \
-Dorg.gradle.project.buildDir=/libretroshare-build/ \
-PANDROID_MIN_API_LEVEL=$ANDROID_MIN_API_LEVEL \

View File

@ -2,8 +2,7 @@
# Script to prepare libretroshare Android testing and publishing Docker images
#
# Copyright (C) 2016-2022 Gioacchino Mazzurco <gio@eigenlab.org>
# Copyright (C) 2020-2022 Asociación Civil Altermundi <info@altermundi.net>
# Copyright (C) 2016-2026 Gioacchino Mazzurco <gio@retroshare.cc>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
@ -34,8 +33,8 @@ function define_default_value()
}
define_default_value LIBRETROSHARE_SOURCE_VERSION "$(git describe --always)"
define_default_value ANDROID_MIN_API_LEVELS "16 21 24"
define_default_value JNI_NATIVE_LIBS_ARCHS "arm64-v8a armeabi-v7a"
define_default_value ANDROID_MIN_API_LEVELS "21 24"
define_default_value JNI_NATIVE_LIBS_ARCHS "arm64-v8a"
define_default_value GRADLE_FULL_TASK "build" # set to "none" to disable
define_default_value GRADLE_SPLIT_TASKS "bundleDebugAar bundleReleaseAar"
@ -58,7 +57,6 @@ function buildDetachPush()
for mApiLevel in $(shuf --echo $ANDROID_MIN_API_LEVELS) ; do
ANDROID_MIN_API_LEVEL=$mApiLevel
CURR_JNI_NATIVE_LIBS_ARCHS="$JNI_NATIVE_LIBS_ARCHS"
[ "$mApiLevel" -gt "16" ] || CURR_JNI_NATIVE_LIBS_ARCHS="armeabi-v7a"
[ "$GRADLE_FULL_TASK" == "none" ] ||
{

View File

@ -2,8 +2,7 @@
# Script to prepare RetroShare Android package building toolchain
#
# Copyright (C) 2016-2022 Gioacchino Mazzurco <gio@eigenlab.org>
# Copyright (C) 2020-2022 Asociación Civil Altermundi <info@altermundi.net>
# Copyright (C) 2016-2026 Gioacchino Mazzurco <gio@retroshare.cc>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
@ -39,26 +38,26 @@ function define_default_value()
## You are supposed to provide the following variables according to your system setup
define_default_value ANDROID_SDK_PATH "/opt/android-sdk/"
define_default_value ANDROID_NDK_PATH "/opt/android-ndk/"
define_default_value ANDROID_NDK_ARCH "arm"
define_default_value ANDROID_PLATFORM_VER "16"
define_default_value ANDROID_NDK_ARCH "arm64"
define_default_value ANDROID_PLATFORM_VER "21"
define_default_value NATIVE_LIBS_TOOLCHAIN_PATH "${HOME}/Builds/android-toolchains/retroshare-android-${ANDROID_PLATFORM_VER}-${ANDROID_NDK_ARCH}/"
define_default_value HOST_NUM_CPU $(nproc)
define_default_value ANDROID_CMD_TOOLS_VERSION "8092744"
define_default_value ANDROID_CMD_TOOLS_SHA256 d71f75333d79c9c6ef5c39d3456c6c58c613de30e6a751ea0dbd433e8f8b9cbf
define_default_value ANDROID_SDK_VERSION "29.0.3"
define_default_value ANDROID_NDK_VERSION "21.0.6113669"
define_default_value ANDROID_NDK_VERSION "29.0.14206865"
define_default_value ANDROID_NDK_PATH "${ANDROID_SDK_PATH}/ndk/${ANDROID_NDK_VERSION}/"
define_default_value BZIP2_SOURCE_VERSION "1.0.6"
define_default_value BZIP2_SOURCE_SHA256 a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd
define_default_value BZIP2_SOURCE_VERSION "1.0.8"
define_default_value BZIP2_SOURCE_SHA256 ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269
define_default_value OPENSSL_SOURCE_VERSION "1.1.1n"
define_default_value OPENSSL_SOURCE_SHA256 40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a
define_default_value SQLITE_SOURCE_YEAR "2018"
define_default_value SQLITE_SOURCE_VERSION "3250200"
define_default_value SQLITE_SOURCE_SHA256 da9a1484423d524d3ac793af518cdf870c8255d209e369bd6a193e9f9d0e3181
define_default_value SQLITE_SOURCE_YEAR "2026"
define_default_value SQLITE_SOURCE_VERSION "3530200"
define_default_value SQLITE_SOURCE_SHA256 588ad51949419a56ebe81fe56193d510c559eb94c9a57748387860b5d3069316
define_default_value SQLCIPHER_SOURCE_VERSION "4.4.3"
define_default_value SQLCIPHER_SOURCE_SHA256 b8df69b998c042ce7f8a99f07cf11f45dfebe51110ef92de95f1728358853133
@ -73,37 +72,47 @@ define_default_value RESTBED_SOURCE_VERSION f74f9329dac82e662c1d570b7cd72c192b72
define_default_value UDP_DISCOVERY_CPP_SOURCE "https://github.com/truvorskameikin/udp-discovery-cpp.git"
define_default_value UDP_DISCOVERY_CPP_VERSION "develop"
define_default_value XAPIAN_SOURCE_VERSION "1.4.7"
define_default_value XAPIAN_SOURCE_SHA256 13f08a0b649c7afa804fa0e85678d693fd6069dd394c9b9e7d41973d74a3b5d3
define_default_value XAPIAN_SOURCE_VERSION "1.4.29"
define_default_value XAPIAN_SOURCE_SHA256 c55c9bc8613ad3ec2c218eafca088c218ab7cddcba7ef08f3af0e542f4e521bc
define_default_value RAPIDJSON_SOURCE_VERSION "1.1.0"
define_default_value RAPIDJSON_SOURCE_SHA256 bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e
define_default_value RAPIDJSON_SOURCE_REPO https://github.com/Tencent/rapidjson.git
define_default_value RAPIDJSON_SOURCE_VERSION origin/master
define_default_value MINIUPNPC_SOURCE_VERSION "2.1.20190625"
define_default_value MINIUPNPC_SOURCE_SHA256 8723f5d7fd7970de23635547700878cd29a5c2bb708b5e5475b2d1d2510317fb
# zlib and libpng versions walks toghether
define_default_value ZLIB_SOURCE_VERSION "1.2.11"
define_default_value ZLIB_SOURCE_SHA256 c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
define_default_value ZLIB_SOURCE_VERSION "1.3.2"
define_default_value ZLIB_SOURCE_SHA256 d7a0654783a4da529d1bb793b7ad9c3318020af77667bcae35f95d0e42a792f3
define_default_value LIBPNG_SOURCE_VERSION "1.6.37"
define_default_value LIBPNG_SOURCE_SHA256 505e70834d35383537b6491e7ae8641f1a4bed1876dbfe361201fc80868d88ca
define_default_value LIBPNG_SOURCE_VERSION "1.6.58"
define_default_value LIBPNG_SOURCE_SHA256 28eb403f51f0f7405249132cecfe82ea5c0ef97f1b32c5a65828814ae0d34775
define_default_value LIBJPEG_SOURCE_VERSION "9e"
define_default_value LIBJPEG_SOURCE_SHA256 4077d6a6a75aeb01884f708919d25934c93305e49f7e3f36db9129320e6f4f3d
define_default_value TIFF_SOURCE_VERSION "4.2.0"
define_default_value TIFF_SOURCE_SHA256 eb0484e568ead8fa23b513e9b0041df7e327f4ee2d22db5a533929dfc19633cb
define_default_value TIFF_SOURCE_VERSION "4.7.1"
define_default_value TIFF_SOURCE_SHA256 b92017489bdc1db3a4c97191aa4b75366673cb746de0dce5d7a749d5954681ba
define_default_value CIMG_SOURCE_VERSION "2.9.7"
define_default_value CIMG_SOURCE_SHA256 595dda9718431a123b418fa0db88e248c44590d47d9b1646970fa0503e27fa5c
define_default_value CIMG_SOURCE_VERSION "3.7.6"
define_default_value CIMG_SOURCE_SHA256 ff1711da822b2b5f3bb68eed7c9b6b6c9391a7865ef6e34cf3e05659834ff0f3
define_default_value PHASH_SOURCE_REPO "https://github.com/RetroShare/pHash.git"
#define_default_value PHASH_SOURCE_REPO "https://github.com/RetroShare/pHash.git"
define_default_value PHASH_SOURCE_REPO "https://github.com/aetilius/pHash.git"
define_default_value PHASH_SOURCE_VERSION origin/master
define_default_value MVPTREE_SOURCE_REPO "https://github.com/starkdg/mvptree.git"
define_default_value MVPTREE_SOURCE_VERSION origin/master
define_default_value BOTAN_SOURCE_VERSION "2.19.5"
define_default_value BOTAN_SOURCE_SHA256 dfeea0e0a6f26d6724c4af01da9a7b88487adb2d81ba7c72fcaf52db522c9ad4
define_default_value JSONC_SOURCE_REPO "https://github.com/json-c/json-c.git"
define_default_value JSONC_SOURCE_VERSION "json-c-0.18-20240915"
define_default_value LIBRNP_SOURCE_REPO "https://github.com/rnpgp/rnp.git"
define_default_value LIBRNP_SOURCE_VERSION "origin/main"
define_default_value REPORT_DIR "$(pwd)/$(basename ${NATIVE_LIBS_TOOLCHAIN_PATH})_build_report/"
define_default_value RS_SRC_DIR "$(realpath $(dirname $BASH_SOURCE)/../../)"
@ -114,47 +123,59 @@ define_default_value TOOLCHAIN_BUILD_TYPE Release
cArch=""
eABI=""
compilerTriple=""
case "${ANDROID_NDK_ARCH}" in
"arm")
cArch="${ANDROID_NDK_ARCH}"
eABI="eabi"
echo "ANDROID_NDK_ARCH=${ANDROID_NDK_ARCH} not supported anymore EOL"
exit 1
;;
"arm64")
cArch="aarch64"
eABI=""
compilerTriple="aarch64-linux-android"
;;
"x86")
echo "ANDROID_NDK_ARCH=${ANDROID_NDK_ARCH} not supported yet"
exit 1
cArch="i686"
eABI=""
compilerTriple="??"
;;
"x86_64")
echo "ANDROID_NDK_ARCH=${ANDROID_NDK_ARCH} not supported yet"
exit 1
cArch="??"
eABI=""
compilerTriple="??"
esac
export SYSROOT="${NATIVE_LIBS_TOOLCHAIN_PATH}/sysroot/"
export PREFIX="${SYSROOT}/usr/"
export CC="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang"
export CXX="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang++"
export AR="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ar"
export RANLIB="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ranlib"
export CC="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${compilerTriple}${ANDROID_PLATFORM_VER}-clang"
export CXX="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${compilerTriple}${ANDROID_PLATFORM_VER}-clang++"
export AR="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/llvm-ar"
export RANLIB="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/llvm-ranlib"
# More interesting GNU Make variables at http://www.gnu.org/software/make/manual/make.html#Implicit-Variables
# Used to instruct cmake to explicitely ignore host libraries
export HOST_IGNORE_PREFIX="/usr/"
export ARMv7_OPTIMIZATION_FLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfp"
## $1 filename, $2 sha256 hash
function check_sha256()
{
echo ${2} "${1}" | sha256sum -c &> /dev/null
}
## $1 filename
gentoo_disturl()
{
local base="https://distfiles.gentoo.org/distfiles"
local file="${1}"
local dir="$(printf '%s' "$file" | b2sum | cut -c1-2)"
printf '%s/%s/%s\n' "$base" "$dir" "$file"
}
## $1 filename, $2 sha256 hash, $3 url
function verified_download()
{
@ -194,11 +215,6 @@ function andro_cmake()
cmakeProc=""
case "${ANDROID_NDK_ARCH}" in
"arm")
cmakeProc="armv7-a"
export CFLAGS="$ARMv7_OPTIMIZATION_FLAGS"
export CXXFLAGS="$ARMv7_OPTIMIZATION_FLAGS"
;;
"arm64")
cmakeProc="aarch64"
;;
@ -361,13 +377,13 @@ install_android_sdk()
task_register bootstrap_toolchain
bootstrap_toolchain()
{
rm -rf "${NATIVE_LIBS_TOOLCHAIN_PATH}"
${ANDROID_NDK_PATH}/build/tools/make_standalone_toolchain.py --verbose \
--arch ${ANDROID_NDK_ARCH} --install-dir ${NATIVE_LIBS_TOOLCHAIN_PATH} \
--api ${ANDROID_PLATFORM_VER} || return $?
NDK_TC="${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64"
# Avoid problems with arm64 some libraries installing on lib64
ln -s "${PREFIX}/lib/" "${PREFIX}/lib64" || return $?
rm -rf "${NATIVE_LIBS_TOOLCHAIN_PATH}"
cp --archive --verbose \
"${NDK_TC}" "${NATIVE_LIBS_TOOLCHAIN_PATH}" || return $?
mkdir -p "${SYSROOT}/usr/lib" "${SYSROOT}/usr/include" || return $?
}
## More information available at retroshare://file?name=Android%20Native%20Development%20Kit%20Cookbook.pdf&size=29214468&hash=0123361c1b14366ce36118e82b90faf7c7b1b136
@ -375,13 +391,13 @@ task_register build_bzlib
build_bzlib()
{
B_dir="bzip2-${BZIP2_SOURCE_VERSION}"
D_file="$B_dir.tar.gz"
rm -rf $B_dir
verified_download $B_dir.tar.gz $BZIP2_SOURCE_SHA256 \
http://distfiles.gentoo.org/distfiles/bzip2-${BZIP2_SOURCE_VERSION}.tar.gz \
|| return $?
$(gentoo_disturl "${D_file}") || return $?
tar -xf $B_dir.tar.gz || return $?
tar -xf $D_file || return $?
pushd $B_dir || return $?
sed -i "/^CC=.*/d" Makefile || return $?
sed -i "/^AR=.*/d" Makefile || return $?
@ -418,12 +434,9 @@ build_openssl()
## non neglegible security concerns.
oBits="32"
[[ ${ANDROID_NDK_ARCH} =~ .*64.* ]] && oBits=64
armOptimizationFlags=""
[[ "${ANDROID_NDK_ARCH}" != "arm" ]] || armOptimizationFlags="$ARMv7_OPTIMIZATION_FLAGS"
ANDROID_NDK="${ANDROID_NDK_PATH}" PATH="${SYSROOT}/bin/:${PATH}" \
./Configure linux-generic${oBits} -fPIC $armOptimizationFlags \
ANDROID_NDK="${ANDROID_NDK_PATH}" PATH="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/:${PATH}" \
./Configure linux-generic${oBits} -fPIC \
--prefix="${PREFIX}" --openssldir="${SYSROOT}/etc/ssl" || return $?
# sed -i 's/LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \\/LIBNAME=$$i \\/g' Makefile
# sed -i '/LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \\/d' Makefile
@ -449,17 +462,20 @@ build_sqlite()
tar -xf $B_dir.tar.gz || return $?
pushd $B_dir || return $?
./configure --with-pic --prefix="${PREFIX}" --host=${cArch}-linux || return $?
./configure --prefix="${PREFIX}" --host=${cArch}-linux || return $?
make -j${HOST_NUM_CPU} || return $?
make install || return $?
rm -f ${PREFIX}/lib/libsqlite3.so*
popd
ls -al "${PREFIX}/include/sqlite3.h" || return $?
ls -al "${PREFIX}/lib/libsqlite3.a" || return $?
}
task_register build_sqlcipher
build_sqlcipher()
{
task_run build_sqlite
#task_run build_sqlite || return $?
B_dir="sqlcipher-${SQLCIPHER_SOURCE_VERSION}"
rm -rf $B_dir
@ -505,7 +521,7 @@ build_libupnp()
|| return $?
tar -xf $B_file || return $?
pusdh $B_dir || return $?
pushd $B_dir || return $?
./bootstrap || return $?
## libupnp must be configured as static library because if not the linker will
## look for libthreadutils.so.6 at runtime that cannot be packaged on android
@ -513,7 +529,8 @@ build_libupnp()
## crash at startup.
./configure --with-pic --enable-static --disable-shared --disable-samples \
--disable-largefile \
--prefix="${PREFIX}" --host=${cArch}-linux || return $?
--prefix="${PREFIX}" --host=${cArch}-linux \
|| return $?
make -j${HOST_NUM_CPU} || return $?
make install || return $?
popd
@ -522,13 +539,10 @@ build_libupnp()
task_register build_rapidjson
build_rapidjson()
{
B_dir="rapidjson-${RAPIDJSON_SOURCE_VERSION}"
D_file="${B_dir}.tar.gz"
verified_download $D_file $RAPIDJSON_SOURCE_SHA256 \
https://github.com/Tencent/rapidjson/archive/v${RAPIDJSON_SOURCE_VERSION}.tar.gz \
|| return $?
tar -xf $D_file || return $?
cp -r "${B_dir}/include/rapidjson/" "${PREFIX}/include/rapidjson" || return $?
S_dir="rapidjson"
git_source_get "$S_dir" \
"$RAPIDJSON_SOURCE_REPO" "${RAPIDJSON_SOURCE_VERSION}" || return $?
cp -r "${S_dir}/include/rapidjson/" "${PREFIX}/include/rapidjson" || return $?
}
task_register build_restbed
@ -541,7 +555,13 @@ build_restbed()
rm -rf "$B_dir"; mkdir "$B_dir"
pushd "$B_dir"
andro_cmake -DBUILD_TESTS=OFF -DBUILD_SSL=OFF -B. -H../${S_dir} || return $?
# Temporary fix for restbed cmake error,
# need update or/and upstream proper fix
# -DCMAKE_POLICY_VERSION_MINIMUM=3.5
andro_cmake -DBUILD_TESTS=OFF -DBUILD_SSL=OFF \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
-B. -H../${S_dir} || return $?
make -j${HOST_NUM_CPU} || return $?
make install || return $?
popd
@ -621,9 +641,9 @@ build_zlib()
{
S_dir="zlib-${ZLIB_SOURCE_VERSION}"
B_dir="zlib-${ZLIB_SOURCE_VERSION}-build"
D_file="$S_dir.tar.gz"
D_file="$S_dir.tar.xz"
verified_download $D_file $ZLIB_SOURCE_SHA256 \
http://distfiles.gentoo.org/distfiles/${D_file} || return $?
$(gentoo_disturl "${D_file}") || return $?
rm -rf $S_dir $B_dir
tar -xf $D_file || return $?
mkdir $B_dir || return $?
@ -644,7 +664,7 @@ build_libpng()
B_dir="libpng-${LIBPNG_SOURCE_VERSION}-build"
D_file="$S_dir.tar.xz"
verified_download $D_file $LIBPNG_SOURCE_SHA256 \
http://distfiles.gentoo.org/distfiles/${D_file} || return $?
$(gentoo_disturl "${D_file}") || return $?
rm -rf $S_dir $B_dir
tar -xf $D_file || return $?
@ -700,7 +720,7 @@ build_tiff()
{
S_dir="tiff-${TIFF_SOURCE_VERSION}"
B_dir="${S_dir}-build"
D_file="tiff-${TIFF_SOURCE_VERSION}.tar.gz"
D_file="tiff-${TIFF_SOURCE_VERSION}.tar.xz"
verified_download $D_file $TIFF_SOURCE_SHA256 \
https://download.osgeo.org/libtiff/${D_file} || return $?
@ -727,13 +747,10 @@ build_tiff()
echo "" > $S_dir/man/CMakeLists.txt
echo "" > $S_dir/port/CMakeLists.txt
# Change to static library build
sed -i 's\add_library(tiff\add_library(tiff STATIC\' \
$S_dir/libtiff/CMakeLists.txt || return $?
pushd $B_dir
#TODO: build dependecies to support more formats
andro_cmake \
-DBUILD_SHARED_LIBS=OFF \
-Dlibdeflate=OFF -Djbig=OFF -Dlzma=OFF -Dzstd=OFF -Dwebp=OFF \
-Djpeg12=OFF \
-Dcxx=OFF \
@ -775,8 +792,7 @@ build_phash()
rm -rf $B_dir;
mkdir $B_dir || return $?
pushd $B_dir || return $?
andro_cmake -DPHASH_DYNAMIC=OFF -DPHASH_STATIC=ON -B. -H../pHash \
|| return $?
andro_cmake -DPHASH_DYNAMIC=OFF -DPHASH_STATIC=ON -B. -H../pHash || return $?
make -j${HOST_NUM_CPU} || return $?
make install || return $?
popd
@ -799,13 +815,97 @@ build_mvptree()
popd
}
task_register build_jsonc
build_jsonc()
{
S_dir="json-c"
B_dir="${S_dir}-build"
git_source_get "$S_dir" "$JSONC_SOURCE_REPO" \
"${JSONC_SOURCE_VERSION}" || return $?
rm -rf "$B_dir"; mkdir "$B_dir"
pushd "$B_dir" || return $?
andro_cmake \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_TESTING=OFF \
-DDISABLE_WERROR=ON \
-DDISABLE_EXTRA_LIBS=ON \
-DBUILD_APPS=OFF \
-B. -S../${S_dir} || return $?
make -j${HOST_NUM_CPU} || return $?
make install || return $?
popd
}
task_register build_librnp
build_librnp()
{
task_run build_zlib || return $?
task_run build_bzlib || return $?
task_run build_openssl || return $?
task_run build_jsonc || return $?
S_dir="librnp"
B_dir="${S_dir}-build"
git_source_get "$S_dir" "$LIBRNP_SOURCE_REPO" \
"${LIBRNP_SOURCE_VERSION}" "src/libsexpp" || return $?
# Patch FindOpenSSLFeatures.cmake to support cross-compilation via
# CMAKE_CROSSCOMPILING_EMULATOR (e.g. qemu-user-static).
# 1. Prepend emulator to FOF before the feature detection foreach loop
# 2. Forward CMAKE_CROSSCOMPILING_EMULATOR to the fossl sub-build via MKF
# 3. Add -static linking via MKF so the binary doesn't need the Android
# dynamic linker which is unavailable on the host even via qemu
# 4. Remove quotes around FOF so CMake expands the list correctly
# TODO: remove when upstream patches are accepted
#
sed -i '/foreach(feature "hashes"/i\
if(CMAKE_CROSSCOMPILING_EMULATOR)\
set(FOF ${CMAKE_CROSSCOMPILING_EMULATOR} ${FOF})\
endif()
' "${S_dir}/cmake/Modules/FindOpenSSLFeatures.cmake"
sed -i '/endif(CMAKE_GENERATOR_TOOLSET)/a\
\
if(CMAKE_CROSSCOMPILING_EMULATOR)\
set(MKF ${MKF} "-DCMAKE_CROSSCOMPILING_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}")\
set(MKF ${MKF} "-DCMAKE_EXE_LINKER_FLAGS=-static")\
endif(CMAKE_CROSSCOMPILING_EMULATOR)' \
"${S_dir}/cmake/Modules/FindOpenSSLFeatures.cmake"
sed -i 's|COMMAND "${FOF}" "${feature}"|COMMAND ${FOF} "${feature}"|' \
"${S_dir}/cmake/Modules/FindOpenSSLFeatures.cmake"
rm -rf "$B_dir"; mkdir "$B_dir"
pushd "$B_dir" || return $?
# CRYPTO_BACKEND use openssl on which we already depends instead of default
# botan keep the binary and dependency tree smaller
# CMAKE_CROSSCOMPILING_EMULATOR needed because rnp CMake needs to run some
# binaries to query openssl features
andro_cmake \
-DBUILD_TESTING=OFF \
-DDOWNLOAD_GTEST=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DENABLE_DOC=OFF \
-DCRYPTO_BACKEND=openssl \
-DCMAKE_CROSSCOMPILING_EMULATOR="/usr/bin/qemu-${cArch}" \
-B. -S../${S_dir} || return $?
make -j${HOST_NUM_CPU} || return $?
make install || return $?
popd
}
task_register build_libretroshare
build_libretroshare()
{
task_run build_zlib || return $?
task_run build_bzlib || return $?
task_run build_openssl || return $?
task_run build_sqlcipher || return $?
task_run build_librnp || return $?
task_run build_sqlite || return $?
# task_run build_sqlcipher || return $?
task_run build_rapidjson || return $?
task_run build_restbed || return $?
task_run build_xapian || return $?