2018-09-28 18:15:10 -04:00
#!/bin/bash
2019-12-18 11:57:20 -05:00
# Script to prepare RetroShare Android package building toolchain
#
2021-08-28 15:39:57 -04:00
# Copyright (C) 2016-2021 Gioacchino Mazzurco <gio@eigenlab.org>
# Copyright (C) 2020-2021 Asociación Civil Altermundi <info@altermundi.net>
2019-12-18 11:57:20 -05:00
#
# 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
# Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <https://www.gnu.org/licenses/>
#
# SPDX-FileCopyrightText: Retroshare Team <contact@retroshare.cc>
# SPDX-License-Identifier: AGPL-3.0-only
2018-09-28 18:15:10 -04:00
## Define default value for variable, take two arguments, $1 variable name,
## $2 default variable value, if the variable is not already define define it
## with default value.
function define_default_value( )
{
VAR_NAME = " ${ 1 } "
DEFAULT_VALUE = " ${ 2 } "
2021-03-08 14:12:50 -05:00
[ -z " ${ !VAR_NAME } " ] && export ${ VAR_NAME } = " ${ DEFAULT_VALUE } " || true
2018-09-28 18:15:10 -04:00
}
## You are supposed to provide the following variables according to your system setup
define_default_value ANDROID_NDK_PATH "/opt/android-ndk/"
define_default_value ANDROID_NDK_ARCH "arm"
2018-10-05 16:29:49 -04:00
define_default_value ANDROID_PLATFORM_VER "16"
2018-09-28 18:15:10 -04:00
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)
2021-08-28 15:39:57 -04:00
define_default_value ANDROID_SDK_INSTALL "false"
define_default_value ANDROID_SDK_TOOLS_VERSION "3859397"
define_default_value ANDROID_SDK_TOOLS_SHA256 444e22ce8ca0f67353bda4b85175ed3731cae3ffa695ca18119cbacef1c1bea0
define_default_value ANDROID_SDK_VERSION "29.0.3"
define_default_value ANDROID_NDK_INSTALL "false"
define_default_value ANDROID_NDK_VERSION "r21"
define_default_value ANDROID_NDK_SHA256 b65ea2d5c5b68fb603626adcbcea6e4d12c68eb8a73e373bbb9d23c252fc647b
2018-09-28 18:15:10 -04:00
define_default_value BZIP2_SOURCE_VERSION "1.0.6"
define_default_value BZIP2_SOURCE_SHA256 a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd
2019-08-29 09:50:26 -04:00
define_default_value OPENSSL_SOURCE_VERSION "1.1.1c"
define_default_value OPENSSL_SOURCE_SHA256 f6fb3079ad15076154eda9413fed42877d668e7069d9b87396d0804fdb3f4c90
2018-09-28 18:15:10 -04:00
define_default_value SQLITE_SOURCE_YEAR "2018"
define_default_value SQLITE_SOURCE_VERSION "3250200"
define_default_value SQLITE_SOURCE_SHA256 da9a1484423d524d3ac793af518cdf870c8255d209e369bd6a193e9f9d0e3181
2021-08-28 15:39:57 -04:00
define_default_value SQLCIPHER_SOURCE_VERSION "4.4.3"
define_default_value SQLCIPHER_SOURCE_SHA256 b8df69b998c042ce7f8a99f07cf11f45dfebe51110ef92de95f1728358853133
2018-09-28 18:15:10 -04:00
2019-04-24 17:36:40 -04:00
define_default_value LIBUPNP_SOURCE_VERSION "1.8.4"
define_default_value LIBUPNP_SOURCE_SHA256 976c3e4555604cdd8391ed2f359c08c9dead3b6bf131c24ce78e64d6669af2ed
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
define_default_value QT_ANDROID_VIA_INSTALLER "false"
define_default_value QT_VERSION "5.12.11"
define_default_value QT_INSTALLER_VERSION "4.1.1"
define_default_value QT_INSTALLER_SHA256 1266ffd0d1b0e466244e3bc8422975c1aa9d96745b6bb28d422f7f92df11f34c
2021-09-03 06:48:44 -04:00
define_default_value QT_INSTALLER_JWT_TOKEN ""
2021-08-28 15:39:57 -04:00
define_default_value QT_INSTALL_PATH " ${ NATIVE_LIBS_TOOLCHAIN_PATH } /Qt/ "
2018-09-28 18:15:10 -04:00
define_default_value QT_ANDROID_INSTALLER_SHA256 a214084e2295c9a9f8727e8a0131c37255bf724bfc69e80f7012ba3abeb1f763
2021-08-28 15:39:57 -04:00
define_default_value RESTBED_SOURCE_REPO "https://github.com/Corvusoft/restbed.git"
2019-08-29 09:50:26 -04:00
define_default_value RESTBED_SOURCE_VERSION f74f9329dac82e662c1d570b7cd72c192b729eb4
2018-09-28 18:15:10 -04:00
2019-04-11 20:53:39 -04:00
define_default_value UDP_DISCOVERY_CPP_SOURCE "https://github.com/truvorskameikin/udp-discovery-cpp.git"
define_default_value UDP_DISCOVERY_CPP_VERSION "develop"
2018-10-05 19:23:08 -04:00
define_default_value XAPIAN_SOURCE_VERSION "1.4.7"
define_default_value XAPIAN_SOURCE_SHA256 13f08a0b649c7afa804fa0e85678d693fd6069dd394c9b9e7d41973d74a3b5d3
define_default_value RAPIDJSON_SOURCE_VERSION "1.1.0"
define_default_value RAPIDJSON_SOURCE_SHA256 bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e
2019-09-28 07:54:16 -04:00
define_default_value MINIUPNPC_SOURCE_VERSION "2.1.20190625"
define_default_value MINIUPNPC_SOURCE_SHA256 8723f5d7fd7970de23635547700878cd29a5c2bb708b5e5475b2d1d2510317fb
2021-08-28 15:39:57 -04:00
# zlib and libpng versions walks toghether
define_default_value ZLIB_SOURCE_VERSION "1.2.11"
define_default_value ZLIB_SOURCE_SHA256 4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066
define_default_value LIBPNG_SOURCE_VERSION "1.6.37"
define_default_value LIBPNG_SOURCE_SHA256 505e70834d35383537b6491e7ae8641f1a4bed1876dbfe361201fc80868d88ca
define_default_value LIBJPEG_SOURCE_VERSION "9d"
define_default_value LIBJPEG_SOURCE_SHA256 6c434a3be59f8f62425b2e3c077e785c9ce30ee5874ea1c270e843f273ba71ee
define_default_value TIFF_SOURCE_VERSION "4.2.0"
define_default_value TIFF_SOURCE_SHA256 eb0484e568ead8fa23b513e9b0041df7e327f4ee2d22db5a533929dfc19633cb
define_default_value CIMG_SOURCE_VERSION "2.9.7"
define_default_value CIMG_SOURCE_SHA256 595dda9718431a123b418fa0db88e248c44590d47d9b1646970fa0503e27fa5c
define_default_value PHASH_SOURCE_REPO "https://gitlab.com/g10h4ck/pHash.git"
define_default_value PHASH_SOURCE_VERSION origin/android-ndk
define_default_value MVPTREE_SOURCE_REPO "https://github.com/starkdg/mvptree.git"
define_default_value MVPTREE_SOURCE_VERSION origin/master
define_default_value REPORT_DIR " $( pwd ) / $( basename ${ NATIVE_LIBS_TOOLCHAIN_PATH } ) _build_report/ "
cArch = ""
eABI = ""
cmakeABI = ""
case " ${ ANDROID_NDK_ARCH } " in
"arm" )
cArch = " ${ ANDROID_NDK_ARCH } "
eABI = "eabi"
; ;
"arm64" )
cArch = "aarch64"
eABI = ""
; ;
"x86" )
cArch = "i686"
eABI = ""
; ;
"x86_64" )
echo " ANDROID_NDK_ARCH= ${ ANDROID_NDK_ARCH } not supported yet "
exit -1
cArch = "??"
eABI = ""
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 "
# Used to instruct cmake to explicitely ignore host libraries
export HOST_IGNORE_PREFIX = "/usr/"
2018-10-05 19:23:08 -04:00
2018-09-28 18:15:10 -04:00
## $1 filename, $2 sha256 hash
function check_sha256( )
{
echo ${ 2 } " ${ 1 } " | sha256sum -c & > /dev/null
}
## $1 filename, $2 sha256 hash, $3 url
function verified_download( )
{
FILENAME = " $1 "
SHA256 = " $2 "
URL = " $3 "
check_sha256 " ${ FILENAME } " " ${ SHA256 } " ||
{
rm -rf " ${ FILENAME } "
wget -O " ${ FILENAME } " " $URL " ||
{
echo " Failed downloading ${ FILENAME } from $URL "
exit 1
}
check_sha256 " ${ FILENAME } " " ${ SHA256 } " ||
{
echo " SHA256 mismatch for ${ FILENAME } from ${ URL } expected sha256 ${ SHA256 } got $( sha256sum ${ FILENAME } | awk '{print $1}' ) "
exit 1
}
}
}
2021-08-28 15:39:57 -04:00
# This function is the result of reading and testing many many stuff be very
# careful editing it
function andro_cmake( )
{
# Using android.toolchain.cmake as documented here
# https://developer.android.com/ndk/guides/cmake seens to break more things then
# it fixes :-\
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
cmakeProc = ""
case " ${ ANDROID_NDK_ARCH } " in
"arm" )
cmakeProc = "armv7-a"
2019-07-18 05:11:42 -04:00
; ;
2021-08-28 15:39:57 -04:00
"arm64" )
cmakeProc = "aarch64"
2019-07-18 05:11:42 -04:00
; ;
2021-08-28 15:39:57 -04:00
"x86" )
cmakeProc = "i686"
2019-07-18 05:11:42 -04:00
; ;
2021-08-28 15:39:57 -04:00
"x86_64" )
cmakeProc = "x86_64"
; ;
*)
echo " Unhandled NDK architecture ${ ANDROID_NDK_ARCH } "
exit -1
; ;
esac
2019-07-18 05:11:42 -04:00
2021-08-28 15:39:57 -04:00
_hi = " $HOST_IGNORE_PREFIX "
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
cmake \
-DCMAKE_SYSTEM_PROCESSOR= $cmakeProc \
-DCMAKE_POSITION_INDEPENDENT_CODE= ON \
-DCMAKE_PREFIX_PATH= " ${ PREFIX } " \
-DCMAKE_SYSTEM_PREFIX_PATH= " ${ PREFIX } " \
-DCMAKE_INCLUDE_PATH= " ${ PREFIX } /include " \
-DCMAKE_SYSTEM_INCLUDE_PATH= " ${ PREFIX } /include " \
-DCMAKE_LIBRARY_PATH= " ${ PREFIX } /lib " \
-DCMAKE_SYSTEM_LIBRARY_PATH= " ${ PREFIX } /lib " \
-DCMAKE_INSTALL_PREFIX= " ${ PREFIX } " \
-DCMAKE_IGNORE_PATH= " $_hi /include; $_hi /lib; $_hi /lib64 " \
$@
# It is probably ok to do not touch CMAKE_PROGRAM_PATH and
# CMAKE_SYSTEM_PROGRAM_PATH
}
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
function git_source_get( )
2018-09-28 18:15:10 -04:00
{
2021-08-28 15:39:57 -04:00
sourceDir = " $1 " ; shift #$1
sourceRepo = " $1 " ; shift #$2
sourceVersion = " $1 " ; shift #$3
# extra paramethers are treated as submodules
2018-10-05 16:29:49 -04:00
2021-08-28 15:39:57 -04:00
[ -d " $sourceDir " ] &&
{
pushd " $sourceDir "
actUrl = " $( git remote get-url origin) "
[ " $actUrl " != " $sourceRepo " ] && rm -rf " ${ sourceDir } "
popd
} || true
[ -d $sourceDir ] || git clone " $sourceRepo " " $sourceDir "
pushd $sourceDir
git fetch --all
git reset --hard ${ sourceVersion }
while [ " $1 " != "" ] ; do
git submodule update --init " $1 "
pushd " $1 "
git reset --hard
shift
popd
2018-10-05 16:29:49 -04:00
done
2021-08-28 15:39:57 -04:00
popd
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
declare -A TASK_REGISTER
function task_register( )
2018-09-28 18:15:10 -04:00
{
2021-08-28 15:39:57 -04:00
TASK_REGISTER[ $1 ] = true
}
2019-08-29 09:50:26 -04:00
2021-08-28 15:39:57 -04:00
function task_unregister( )
{
# we may simply wipe them but we could benefit from keeping track of
# unregistered tasks too
TASK_REGISTER[ $1 ] = false
}
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
function task_logfile( )
{
echo " $REPORT_DIR / $1 .log "
}
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
function task_run( )
{
mTask = " $1 " ; shift
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
[ " ${ TASK_REGISTER [ $mTask ] } " != "true" ] &&
{
echo " Attempt to run not registered task $mTask $@ "
return -1
}
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
logFile = " $( task_logfile $mTask ) "
if [ -f " $logFile " ] ; then
echo " Task $mTask already run more details at $logFile "
else
date | tee > " $logFile "
$mTask $@ | & tee --append " $logFile "
mRetval = " ${ PIPESTATUS [0] } "
echo " Task $mTask return ${ mRetval } more details at $logFile "
date | tee --append " $logFile "
return ${ mRetval }
fi
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
function task_zap( )
{
rm -f " $( task_logfile $1 ) "
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
DUPLICATED_INCLUDES_LIST_FILE = " ${ REPORT_DIR } /duplicated_includes_list "
DUPLICATED_INCLUDES_DIR = " ${ REPORT_DIR } /duplicated_includes/ "
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
task_register install_android_sdk
install_android_sdk( )
{
tFile = " sdk-tools-linux- ${ ANDROID_SDK_TOOLS_VERSION } .zip "
verified_download " ${ tFile } " " ${ ANDROID_SDK_TOOLS_SHA256 } " \
" https://dl.google.com/android/repository/ ${ tFile } "
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
unzip " ${ tFile } "
mkdir -p " $ANDROID_SDK_PATH "
rm -rf " $ANDROID_SDK_PATH /tools/ "
mv --verbose tools/ " $ANDROID_SDK_PATH /tools/ "
# Install Android SDK
yes | $ANDROID_SDK_PATH /tools/bin/sdkmanager --licenses && \
$ANDROID_SDK_PATH /tools/bin/sdkmanager --update
$ANDROID_SDK_PATH /tools/bin/sdkmanager " platforms;android- $ANDROID_PLATFORM_VER "
$ANDROID_SDK_PATH /tools/bin/sdkmanager " build-tools; $ANDROID_SDK_VERSION "
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
task_register install_android_ndk
install_android_ndk( )
{
tFile = " android-ndk- ${ ANDROID_NDK_VERSION } -linux-x86_64.zip "
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
verified_download " ${ tFile } " " ${ ANDROID_NDK_SHA256 } " \
" https://dl.google.com/android/repository/ ${ tFile } "
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
unzip " ${ tFile } "
mkdir -p " $ANDROID_NDK_PATH "
rm -rf " $ANDROID_NDK_PATH "
mv --verbose " android-ndk- ${ ANDROID_NDK_VERSION } / " " $ANDROID_NDK_PATH / "
}
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
## More information available at https://android.googlesource.com/platform/ndk/+/ics-mr0/docs/STANDALONE-TOOLCHAIN.html
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 }
# Avoid problems with arm64 some libraries installing on lib64
ln -s " ${ PREFIX } /lib/ " " ${ PREFIX } /lib64 "
2018-09-28 18:15:10 -04:00
2021-08-28 15:39:57 -04:00
pushd " ${ PREFIX } /include/ "
find . -not -type d > " ${ DUPLICATED_INCLUDES_LIST_FILE } "
popd
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
## This avoid <cmath> include errors due to -isystem and -I ordering issue
task_register deduplicate_includes
deduplicate_includes( )
{
while read delFile ; do
mNewPath = " ${ DUPLICATED_INCLUDES_DIR } / $delFile "
mkdir --verbose --parents " $( dirname " $mNewPath " ) "
mv --verbose " ${ PREFIX } /include/ $delFile " " $mNewPath "
done < " ${ DUPLICATED_INCLUDES_LIST_FILE } "
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
task_register reduplicate_includes
reduplicate_includes( )
{
pushd " ${ DUPLICATED_INCLUDES_DIR } "
find . -not -type d | while read delFile ; do
mv --verbose " ${ delFile } " " ${ PREFIX } /include/ $delFile "
done
popd
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
# $1 optional prefix prepended only if return value is not empty
# $2 optional suffix appended only if return value is not empty
task_register get_qt_arch
get_qt_arch( )
{
local QT_VERSION_COMP = " $( echo $QT_VERSION | awk -F. '{print $1*1000000+$2*1000+$3}' ) "
local QT_ARCH = ""
# Qt >= 5.15.0 ships all Android architectures toghether
[ " $QT_VERSION_COMP " -lt "5015000" ] &&
{
case " ${ ANDROID_NDK_ARCH } " in
"arm" )
QT_ARCH = "armv7"
; ;
"arm64" )
QT_ARCH = "arm64_v8a"
; ;
"x86" )
QT_ARCH = "x86"
; ;
esac
echo " $1 $QT_ARCH $2 "
}
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
task_register get_qt_dir
get_qt_dir( )
{
echo " ${ QT_INSTALL_PATH } / ${ QT_VERSION } /android $( get_qt_arch _) / "
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
## More information available at https://wiki.qt.io/Online_Installer_4.x
task_register install_qt_android
install_qt_android( )
{
2021-09-03 06:48:44 -04:00
[ " $QT_INSTALLER_JWT_TOKEN " = = "" ] &&
{
echo " To run Qt installer QT_INSTALLER_JWT_TOKEN environement variable \
need to be set to a valid JWT token see https://wiki.qt.io/Online_Installer_4.x"
return -1
}
2021-08-28 15:39:57 -04:00
QT_VERSION_CODE = " $( echo $QT_VERSION | tr -d .) "
QT_INSTALLER = " qt-unified-linux-x86_64- ${ QT_INSTALLER_VERSION } -online.run "
tMajDotMinVer = " $( echo $QT_INSTALLER_VERSION | awk -F. '{print $1"."$2}' ) "
verified_download $QT_INSTALLER $QT_INSTALLER_SHA256 \
" https://master.qt.io/archive/online_installers/ ${ tMajDotMinVer } / ${ QT_INSTALLER } "
chmod a+x ${ QT_INSTALLER }
QT_QPA_PLATFORM = minimal ./${ QT_INSTALLER } \
install qt.qt5.${ QT_VERSION_CODE } .android$( get_qt_arch _) \
--accept-licenses --accept-obligations --confirm-command \
--default-answer --no-default-installations \
--root " ${ QT_INSTALL_PATH } "
2018-09-28 18:15:10 -04:00
}
## More information available at retroshare://file?name=Android%20Native%20Development%20Kit%20Cookbook.pdf&size=29214468&hash=0123361c1b14366ce36118e82b90faf7c7b1b136
2021-08-28 15:39:57 -04:00
task_register build_bzlib
2018-09-28 18:15:10 -04:00
build_bzlib( )
{
B_dir = " bzip2- ${ BZIP2_SOURCE_VERSION } "
rm -rf $B_dir
verified_download $B_dir .tar.gz $BZIP2_SOURCE_SHA256 \
2019-04-11 20:53:39 -04:00
http://distfiles.gentoo.org/distfiles/bzip2-${ BZIP2_SOURCE_VERSION } .tar.gz
2018-09-28 18:15:10 -04:00
tar -xf $B_dir .tar.gz
cd $B_dir
sed -i "/^CC=.*/d" Makefile
sed -i "/^AR=.*/d" Makefile
sed -i "/^RANLIB=.*/d" Makefile
sed -i "/^LDFLAGS=.*/d" Makefile
sed -i "s/^all: libbz2.a bzip2 bzip2recover test/all: libbz2.a bzip2 bzip2recover/" Makefile
make -j${ HOST_NUM_CPU }
make install PREFIX = ${ PREFIX }
# sed -i "/^CC=.*/d" Makefile-libbz2_so
# make -f Makefile-libbz2_so -j${HOST_NUM_CPU}
# cp libbz2.so.1.0.6 ${SYSROOT}/usr/lib/libbz2.so
cd ..
}
## More information available at http://doc.qt.io/qt-5/opensslsupport.html
2021-08-28 15:39:57 -04:00
task_register build_openssl
2018-09-28 18:15:10 -04:00
build_openssl( )
{
B_dir = " openssl- ${ OPENSSL_SOURCE_VERSION } "
rm -rf $B_dir
verified_download $B_dir .tar.gz $OPENSSL_SOURCE_SHA256 \
https://www.openssl.org/source/$B_dir .tar.gz
tar -xf $B_dir .tar.gz
cd $B_dir
## We link openssl statically to avoid android silently sneaking in his own
## version of libssl.so (we noticed this because it had some missing symbol
## that made RS crash), the crash in some android version is only one of the
## possible problems the fact that android insert his own binary libssl.so pose
## non neglegible security concerns.
oBits = "32"
[ [ ${ ANDROID_NDK_ARCH } = ~ .*64.* ] ] && oBits = 64
ANDROID_NDK = " ${ ANDROID_NDK_PATH } " PATH = " ${ SYSROOT } /bin/: ${ PATH } " \
2019-08-29 09:50:26 -04:00
./Configure linux-generic${ oBits } -fPIC --prefix= " ${ PREFIX } " \
2018-09-28 18:15:10 -04:00
--openssldir= " ${ SYSROOT } /etc/ssl "
# sed -i 's/LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \\/LIBNAME=$$i \\/g' Makefile
# sed -i '/LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \\/d' Makefile
2021-08-28 15:39:57 -04:00
# Avoid documentation build which is unneded and time consuming
echo "exit 0; " > util/process_docs.pl
2018-09-28 18:15:10 -04:00
make -j${ HOST_NUM_CPU }
make install
2018-10-05 16:29:49 -04:00
rm -f ${ PREFIX } /lib/libssl.so*
rm -f ${ PREFIX } /lib/libcrypto.so*
2018-09-28 18:15:10 -04:00
cd ..
}
2021-08-28 15:39:57 -04:00
task_register build_sqlite
2018-09-28 18:15:10 -04:00
build_sqlite( )
{
B_dir = " sqlite-autoconf- ${ SQLITE_SOURCE_VERSION } "
2019-07-19 14:01:07 -04:00
rm -rf $B_dir
2018-09-28 18:15:10 -04:00
verified_download $B_dir .tar.gz $SQLITE_SOURCE_SHA256 \
https://www.sqlite.org/${ SQLITE_SOURCE_YEAR } /$B_dir .tar.gz
tar -xf $B_dir .tar.gz
cd $B_dir
2019-07-19 14:01:07 -04:00
./configure --with-pic --prefix= " ${ PREFIX } " --host= ${ cArch } -linux
2018-09-28 18:15:10 -04:00
make -j${ HOST_NUM_CPU }
make install
rm -f ${ PREFIX } /lib/libsqlite3.so*
cd ..
}
2021-08-28 15:39:57 -04:00
task_register build_sqlcipher
2018-09-28 18:15:10 -04:00
build_sqlcipher( )
{
2021-08-28 15:39:57 -04:00
task_run build_sqlite
2019-08-29 09:50:26 -04:00
2018-09-28 18:15:10 -04:00
B_dir = " sqlcipher- ${ SQLCIPHER_SOURCE_VERSION } "
rm -rf $B_dir
T_file = " ${ B_dir } .tar.gz "
verified_download $T_file $SQLCIPHER_SOURCE_SHA256 \
https://github.com/sqlcipher/sqlcipher/archive/v${ SQLCIPHER_SOURCE_VERSION } .tar.gz
tar -xf $T_file
cd $B_dir
2021-08-28 15:39:57 -04:00
# case "${ANDROID_NDK_ARCH}" in
# "arm64")
# # SQLCipher config.sub is outdated and doesn't recognize newer architectures
# rm config.sub
# autoreconf --verbose --install --force
# automake --add-missing --copy --force-missing
# ;;
# esac
2019-07-19 14:01:07 -04:00
./configure --with-pic --build= $( sh ./config.guess) \
2019-07-18 05:11:42 -04:00
--host= ${ cArch } -linux \
2018-09-28 18:15:10 -04:00
--prefix= " ${ PREFIX } " --with-sysroot= " ${ SYSROOT } " \
--enable-tempstore= yes \
--disable-tcl --disable-shared \
CFLAGS = "-DSQLITE_HAS_CODEC" LDFLAGS = " ${ PREFIX } /lib/libcrypto.a "
make -j${ HOST_NUM_CPU }
make install
cd ..
}
2021-08-28 15:39:57 -04:00
task_register build_libupnp
2018-09-28 18:15:10 -04:00
build_libupnp( )
{
2019-04-24 17:36:40 -04:00
B_dir = " pupnp-release- ${ LIBUPNP_SOURCE_VERSION } "
B_ext = ".tar.gz"
B_file = " ${ B_dir } ${ B_ext } "
2018-09-28 18:15:10 -04:00
rm -rf $B_dir
2019-04-24 17:36:40 -04:00
verified_download $B_file $LIBUPNP_SOURCE_SHA256 \
https://github.com/mrjimenez/pupnp/archive/release-${ LIBUPNP_SOURCE_VERSION } ${ B_ext }
2018-09-28 18:15:10 -04:00
2019-04-24 17:36:40 -04:00
tar -xf $B_file
2018-09-28 18:15:10 -04:00
cd $B_dir
2019-04-24 17:36:40 -04:00
./bootstrap
2018-09-28 18:15:10 -04:00
## liupnp 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
## as it supports only libname.so format for libraries, thus resulting in a
## crash at startup.
2019-07-19 14:01:07 -04:00
./configure --with-pic --enable-static --disable-shared --disable-samples \
2019-04-24 17:36:40 -04:00
--disable-largefile \
2019-07-18 05:11:42 -04:00
--prefix= " ${ PREFIX } " --host= ${ cArch } -linux
2018-09-28 18:15:10 -04:00
make -j${ HOST_NUM_CPU }
make install
cd ..
}
2021-08-28 15:39:57 -04:00
task_register build_rapidjson
2018-09-28 18:15:10 -04:00
build_rapidjson( )
{
2018-10-05 19:23:08 -04:00
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
tar -xf $D_file
cp -r " ${ B_dir } /include/rapidjson/ " " ${ PREFIX } /include/rapidjson "
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
task_register build_restbed
2018-09-28 18:15:10 -04:00
build_restbed( )
{
2021-08-28 15:39:57 -04:00
S_dir = "restbed"
B_dir = " ${ S_dir } -build "
git_source_get " $S_dir " " $RESTBED_SOURCE_REPO " " ${ RESTBED_SOURCE_VERSION } " \
"dependency/asio" "dependency/catch"
rm -rf " $B_dir " ; mkdir " $B_dir "
pushd " $B_dir "
andro_cmake -DBUILD_TESTS= OFF -DBUILD_SSL= OFF -B. -H../${ S_dir }
2018-09-28 18:15:10 -04:00
make -j${ HOST_NUM_CPU }
make install
2021-08-28 15:39:57 -04:00
popd
2018-09-28 18:15:10 -04:00
}
2021-08-28 15:39:57 -04:00
task_register build_udp-discovery-cpp
2019-04-11 20:53:39 -04:00
build_udp-discovery-cpp( )
{
S_dir = "udp-discovery-cpp"
[ -d $S_dir ] || git clone $UDP_DISCOVERY_CPP_SOURCE $S_dir
cd $S_dir
git checkout $UDP_DISCOVERY_CPP_VERSION
cd ..
B_dir = "udp-discovery-cpp-build"
rm -rf ${ B_dir } ; mkdir ${ B_dir } ; cd ${ B_dir }
2021-08-28 15:39:57 -04:00
andro_cmake -B. -H../$S_dir
2019-04-11 20:53:39 -04:00
make -j${ HOST_NUM_CPU }
cp libudp-discovery.a " ${ PREFIX } /lib/ "
cp ../$S_dir /*.hpp " ${ PREFIX } /include/ "
cd ..
}
2021-08-28 15:39:57 -04:00
task_register build_xapian
2018-10-05 19:23:08 -04:00
build_xapian( )
{
B_dir = " xapian-core- ${ XAPIAN_SOURCE_VERSION } "
D_file = " $B_dir .tar.xz "
verified_download $D_file $XAPIAN_SOURCE_SHA256 \
https://oligarchy.co.uk/xapian/${ XAPIAN_SOURCE_VERSION } /$D_file
rm -rf $B_dir
tar -xf $D_file
cd $B_dir
B_endiannes_detection_failure_workaround = "ac_cv_c_bigendian=no"
B_large_file = ""
[ " ${ ANDROID_PLATFORM_VER } " -lt "24" ] && B_large_file = "--disable-largefile"
./configure ${ B_endiannes_detection_failure_workaround } ${ B_large_file } \
2019-07-19 14:01:07 -04:00
--with-pic \
2018-10-05 19:23:08 -04:00
--disable-backend-inmemory --disable-backend-remote \
--disable--backend-chert --enable-backend-glass \
2019-07-18 05:11:42 -04:00
--host= ${ cArch } -linux --enable-static --disable-shared \
2018-10-05 19:23:08 -04:00
--prefix= " ${ PREFIX } " --with-sysroot= " ${ SYSROOT } "
make -j${ HOST_NUM_CPU }
make install
2021-08-28 15:39:57 -04:00
cd ..
2018-10-05 19:23:08 -04:00
}
2021-08-28 15:39:57 -04:00
task_register build_miniupnpc
2019-09-28 07:54:16 -04:00
build_miniupnpc( )
{
S_dir = " miniupnpc- ${ MINIUPNPC_SOURCE_VERSION } "
B_dir = " miniupnpc- ${ MINIUPNPC_SOURCE_VERSION } -build "
D_file = " $S_dir .tar.gz "
verified_download $D_file $MINIUPNPC_SOURCE_SHA256 \
http://miniupnp.free.fr/files/${ D_file }
rm -rf $S_dir $B_dir
tar -xf $D_file
mkdir $B_dir
cd $B_dir
2021-08-28 15:39:57 -04:00
andro_cmake \
2019-09-28 07:54:16 -04:00
-DUPNPC_BUILD_STATIC= TRUE \
-DUPNPC_BUILD_SHARED= FALSE \
-DUPNPC_BUILD_TESTS= FALSE \
-DUPNPC_BUILD_SAMPLE= FALSE \
2021-08-28 15:39:57 -04:00
-B. -S../$S_dir
make -j${ HOST_NUM_CPU }
make install
cd ..
}
task_register build_zlib
build_zlib( )
{
S_dir = " zlib- ${ ZLIB_SOURCE_VERSION } "
B_dir = " zlib- ${ ZLIB_SOURCE_VERSION } -build "
D_file = " $S_dir .tar.xz "
verified_download $D_file $ZLIB_SOURCE_SHA256 \
http://www.zlib.net/${ D_file }
rm -rf $S_dir $B_dir
tar -xf $D_file
mkdir $B_dir
cd $B_dir
andro_cmake -B. -S../$S_dir
make -j${ HOST_NUM_CPU }
make install
rm -f ${ PREFIX } /lib/libz.so*
cd ..
}
task_register build_libpng
build_libpng( )
{
task_run build_zlib
S_dir = " libpng- ${ LIBPNG_SOURCE_VERSION } "
B_dir = " libpng- ${ LIBPNG_SOURCE_VERSION } -build "
D_file = " $S_dir .tar.xz "
verified_download $D_file $LIBPNG_SOURCE_SHA256 \
https://download.sourceforge.net/libpng/${ D_file }
rm -rf $S_dir $B_dir
tar -xf $D_file
# libm is part of bionic An android
sed -i -e 's/find_library(M_LIBRARY m)/set(M_LIBRARY "")/' $S_dir /CMakeLists.txt
# Disable hardware acceleration as they are problematic for Android
# compilation and are not supported by all phones, it is necessary to fiddle
# with CMakeLists.txt as libpng 1.6.37 passing it as cmake options seems not
# working properly
# https://github.com/imagemin/optipng-bin/issues/97
# https://github.com/opencv/opencv/issues/7600
echo "add_definitions(-DPNG_ARM_NEON_OPT=0)" >> $S_dir /CMakeLists.txt
mkdir $B_dir
pushd $B_dir
HW_OPT = "OFF"
# [ "$ANDROID_PLATFORM_VER" -ge "22" ] && HW_OPT="ON"
andro_cmake \
-DPNG_SHARED= OFF \
-DPNG_STATIC= ON \
-DPNG_TESTS= OFF \
-DPNG_HARDWARE_OPTIMIZATIONS= $HW_OPT \
-DCMAKE_VERBOSE_MAKEFILE:BOOL= ON \
-B. -S../$S_dir
2019-09-28 07:54:16 -04:00
make -j${ HOST_NUM_CPU }
make install
2021-08-28 15:39:57 -04:00
popd
2019-09-28 07:54:16 -04:00
}
2021-08-28 15:39:57 -04:00
task_register build_libjpeg
build_libjpeg( )
{
S_dir = " jpeg- ${ LIBJPEG_SOURCE_VERSION } "
D_file = " jpegsrc.v ${ LIBJPEG_SOURCE_VERSION } .tar.gz "
verified_download $D_file $LIBJPEG_SOURCE_SHA256 \
https://www.ijg.org/files/$D_file
rm -rf $S_dir
tar -xf $D_file
cd $S_dir
./configure --with-pic --prefix= " ${ PREFIX } " --host= ${ cArch } -linux
make -j${ HOST_NUM_CPU }
make install
rm -f ${ PREFIX } /lib/libjpeg.so*
cd ..
}
task_register build_tiff
build_tiff( )
{
S_dir = " tiff- ${ TIFF_SOURCE_VERSION } "
B_dir = " ${ S_dir } -build "
D_file = " tiff- ${ TIFF_SOURCE_VERSION } .tar.gz "
verified_download $D_file $TIFF_SOURCE_SHA256 \
https://download.osgeo.org/libtiff/${ D_file }
rm -rf $S_dir $B_dir
tar -xf $D_file
mkdir $B_dir
# Disable tools building, not needed for retroshare, and depending on some
# OpenGL headers not available on Android
echo "" > $S_dir /tools/CMakeLists.txt
# Disable tests building, not needed for retroshare, and causing linker
# errors
echo "" > $S_dir /test/CMakeLists.txt
# Disable extra tools building, not needed for retroshare, and causing
# linker errors
echo "" > $S_dir /contrib/CMakeLists.txt
# Disable more unneded stuff
echo "" > $S_dir /build/CMakeLists.txt
echo "" > $S_dir /html/CMakeLists.txt
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
cd $B_dir
#TODO: build dependecies to support more formats
andro_cmake \
-Dlibdeflate= OFF -Djbig= OFF -Dlzma= OFF -Dzstd= OFF -Dwebp= OFF \
-Djpeg12= OFF \
-Dcxx= OFF \
-B. -S../$S_dir
make -j${ HOST_NUM_CPU }
make install
cd ..
}
task_register build_cimg
build_cimg( )
{
task_run build_libpng
task_run build_libjpeg
task_run build_tiff
S_dir = " CImg- ${ CIMG_SOURCE_VERSION } "
D_file = " CImg_ ${ CIMG_SOURCE_VERSION } .zip "
verified_download $D_file $CIMG_SOURCE_SHA256 \
https://cimg.eu/files/${ D_file }
unzip -o $D_file
cp --archive --verbose " $S_dir /CImg.h " " $PREFIX /include/ "
}
task_register build_phash
build_phash( )
{
task_run build_cimg
S_dir = "pHash"
B_dir = " ${ S_dir } -build "
git_source_get " $S_dir " " $PHASH_SOURCE_REPO " " ${ PHASH_SOURCE_VERSION } "
rm -rf $B_dir ; mkdir $B_dir ; pushd $B_dir
andro_cmake -DPHASH_DYNAMIC= OFF -DPHASH_STATIC= ON -B. -H../pHash
make -j${ HOST_NUM_CPU }
make install
popd
}
task_register build_mvptree
build_mvptree( )
{
S_dir = "mvptree"
B_dir = " ${ S_dir } -build "
git_source_get " $S_dir " " $MVPTREE_SOURCE_REPO " " ${ MVPTREE_SOURCE_VERSION } "
rm -rf $B_dir ; mkdir $B_dir ; pushd $B_dir
andro_cmake -B. -H../${ S_dir }
make -j${ HOST_NUM_CPU }
make install
popd
}
task_register get_native_libs_toolchain_path
get_native_libs_toolchain_path( )
{
echo ${ NATIVE_LIBS_TOOLCHAIN_PATH }
}
task_register build_default_toolchain
build_default_toolchain( )
{
task_run bootstrap_toolchain || return $?
task_run build_bzlib || return $?
task_run build_openssl || return $?
task_run build_sqlcipher || return $?
task_run build_rapidjson || return $?
task_run build_restbed || return $?
task_run build_udp-discovery-cpp || return $?
task_run build_xapian || return $?
task_run build_miniupnpc || return $?
task_run build_phash || return $?
task_run deduplicate_includes || return $?
task_run get_native_libs_toolchain_path || return $?
}
if [ " $1 " = = "" ] ; then
rm -rf " $REPORT_DIR "
mkdir -p " $REPORT_DIR "
cat " $0 " > " $REPORT_DIR /build_script "
env > " $REPORT_DIR /build_env "
build_default_toolchain
else
# do not delete report directory in this case so we can reuse material
# produced by previous run, like deduplicated includes
mkdir -p " $REPORT_DIR "
while [ " $1 " != "" ] ; do
task_zap $1
task_run $1 || exit $?
shift
done
fi