718 lines
26 KiB
Bash
718 lines
26 KiB
Bash
#
|
|
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License").
|
|
# You may not use this file except in compliance with the License.
|
|
# A copy of the License is located at
|
|
#
|
|
# http://aws.amazon.com/apache2.0
|
|
#
|
|
# or in the "license" file accompanying this file. This file is distributed
|
|
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
|
# express or implied. See the License for the specific language governing
|
|
# permissions and limitations under the License.
|
|
#
|
|
|
|
if [ -z "$PLATFORM" ]; then
|
|
echo "You should run the main script."
|
|
exit 1
|
|
fi
|
|
|
|
# Defaults
|
|
# TODO: Extract API / Architecture:
|
|
# adb shell cat /system/build.prop
|
|
# ro.build.version.sdk
|
|
# ro.product.cpu.abi
|
|
# TODO: Remove automake dependency.
|
|
|
|
# The android API level.
|
|
API_LEVEL=${API_LEVEL:?"Variable hasn't been set."}
|
|
|
|
# System where the sample app shall run.
|
|
TARGET_SYSTEM=${TARGET_SYSTEM:?"Variable hasn't been set."}
|
|
|
|
# Path on the device where the sdk will be installed.
|
|
DEVICE_INSTALL_PATH=${DEVICE_INSTALL_PATH:?"Variable hasn't been set."}
|
|
DEVICE_BIN_PATH=${DEVICE_INSTALL_PATH}/bin
|
|
|
|
# Build type. By default, use Debug build.
|
|
BUILD_TYPE=${BUILD_TYPE:?"Variable hasn't been set."}
|
|
|
|
# Path where android keeps its CA certificates
|
|
ANDROID_CA_PATH=${ANDROID_CA_PATH:-"/system/etc/security/cacerts/"}
|
|
|
|
# Path where we are going to generate CA bundle in the PEM format for curl
|
|
CURL_CA_BUNDLE=${CURL_CA_BUNDLE:-"${DEVICE_INSTALL_PATH}/cacert.pem"}
|
|
|
|
# Path to the start script that may be used to start the sample app.
|
|
START_SCRIPT="${INSTALL_BASE}/startsample.sh"
|
|
|
|
# Path to the sdk sqllite databases.
|
|
CONFIG_DB_PATH="${DEVICE_INSTALL_PATH}/databases"
|
|
|
|
NDK_PACKAGE=${NDK_PACKAGE:-"android-ndk-r16"}
|
|
|
|
# Path to run ADB. If not set, it will assume that adb is available on PATH.
|
|
ADB=${ADB:-"adb"}
|
|
|
|
# CMake parameters used to build the SDK.
|
|
set_cmake_var() {
|
|
CMAKE_PLATFORM_SPECIFIC=(-DANDROID="ON" \
|
|
-DANDROID_LOGGER="OFF" \
|
|
-DANDROID_DEVICE_INSTALL_PREFIX="${DEVICE_INSTALL_PATH}" \
|
|
-DANDROID_NDK="${ANDROID_NDK}" \
|
|
-DANDROID_ABI="${ANDROID_ABI}" \
|
|
-DANDROID_ALLOW_UNDEFINED_SYMBOLS="${ANDROID_ALLOW_UNDEFINED_SYMBOLS}" \
|
|
-DANDROID_ARM_MODE="${ANDROID_ARM_MODE}" \
|
|
-DANDROID_ARM_NEON="${ANDROID_ARM_NEON}" \
|
|
-DANDROID_CPP_FEATURES="${ANDROID_CPP_FEATURES}" \
|
|
-DANDROID_DISABLE_FORMAT_STRING_CHECKS="${ANDROID_DISABLE_FORMAT_STRING_CHECKS}" \
|
|
-DANDROID_DISABLE_NO_EXECUTE="${ANDROID_DISABLE_NO_EXECUTE}" \
|
|
-DANDROID_DISABLE_RELRO="${ANDROID_DISABLE_RELRO}" \
|
|
-DANDROID_PIE="${ANDROID_PIE}" \
|
|
-DANDROID_PLATFORM="${ANDROID_PLATFORM}" \
|
|
-DANDROID_STL="${ANDROID_STL}" \
|
|
-DANDROID_TOOLCHAIN="${ANDROID_TOOLCHAIN}" \
|
|
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
|
|
-DCMAKE_CROSSCOMPILING="ON" \
|
|
-DCMAKE_EXPORT_COMPILE_COMMANDS="ON" \
|
|
-DCMAKE_INSTALL_PREFIX="${INSTALL_TARGET}" \
|
|
-DCMAKE_PREFIX_PATH="${INSTALL_TARGET}" \
|
|
-DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" \
|
|
-DCURL_INCLUDE_DIR="${CURL_INCLUDE_DIR}" \
|
|
-DCURL_LIBRARY="${CURL_LIBRARY}" \
|
|
-DLOCAL_MODULE_RELATIVE_PATH="asan" \
|
|
-DFFMPEG_LIB_PATH=${INSTALL_TARGET}/lib \
|
|
-DFFMPEG_INCLUDE_DIR=${INSTALL_TARGET}/include)
|
|
#-DBUILD_SHARED_LIBS="ON" \
|
|
}
|
|
|
|
run_os_specifics() {
|
|
set_cmake_var
|
|
}
|
|
|
|
make_install() {
|
|
pushd "${BUILD_PATH}"
|
|
removeSymbolsFromRelObjFiles .
|
|
cp "${CXX_SHARED_LIBRARY}" "${INSTALL_TARGET_LIB}"
|
|
find . -name lib\*.so -exec cp {} "${INSTALL_TARGET_LIB}" \;
|
|
make install -j2
|
|
popd
|
|
}
|
|
|
|
generate_start_script() {
|
|
printInfo "Installing AVS Device SDK on the target device."
|
|
make_install > /dev/null
|
|
adb_push
|
|
CONFIG_BASENAME=$(basename ${OUTPUT_CONFIG_FILE})
|
|
cat << EOF > "${START_SCRIPT}"
|
|
|
|
${ADB} shell LD_LIBRARY_PATH=${DEVICE_INSTALL_PATH}/lib \
|
|
${DEVICE_BIN_PATH}/SampleApp \
|
|
${DEVICE_INSTALL_PATH}/${CONFIG_BASENAME} DEBUG9
|
|
EOF
|
|
}
|
|
|
|
generate_test_script() {
|
|
cat << EOF > "${TEST_SCRIPT}"
|
|
echo
|
|
echo "==============> BUILDING Tests =============="
|
|
echo
|
|
|
|
cd ${BUILD_PATH}
|
|
make all -j2
|
|
make test
|
|
EOF
|
|
}
|
|
|
|
printInfo() {
|
|
echo "================================================================================"
|
|
local ARGUMENT
|
|
for ARGUMENT in "$@"; do
|
|
echo "= $ARGUMENT"
|
|
done
|
|
}
|
|
|
|
removeSymbolsFromRelObjFiles() {
|
|
local STRIP_ACTION=""
|
|
case "${BUILD_TYPE}" in
|
|
"MinSizeRel" | "Release" )
|
|
STRIP_ACTION="--strip-debug"
|
|
;;
|
|
* )
|
|
;;
|
|
esac
|
|
if [ -n "${STRIP_ACTION}" ]; then
|
|
find "$1" -name lib\*.a -print0 | xargs -0 -I % ${STRIP} ${STRIP_ACTION} -o % %
|
|
find "$1" -name lib\*.so -print0 | xargs -0 -I % ${STRIP} ${STRIP_ACTION} -o % %
|
|
fi
|
|
}
|
|
|
|
configure_host() {
|
|
BACKUP_EXTENSION=".BAK"
|
|
|
|
BUILD_SYSTEM=$(uname)
|
|
case "${BUILD_SYSTEM}" in
|
|
"Darwin" )
|
|
ANDROID_HOME="${HOME}/Library/Android"
|
|
DISABLE_RPATH="--disable-rpath"
|
|
NDK_PACKAGE_FILE="${NDK_PACKAGE}-darwin-x86_64.zip"
|
|
SED_IN_PLACE_BACKUP_OPTION="-i ${BACKUP_EXTENSION}"
|
|
TOOLCHAIN_BUILD="x86_64-apple-darwin"
|
|
;;
|
|
"Linux" )
|
|
ANDROID_HOME="${HOME}/Android"
|
|
DISABLE_RPATH=""
|
|
NDK_PACKAGE_FILE="${NDK_PACKAGE}-linux-x86_64.zip"
|
|
SED_IN_PLACE_BACKUP_OPTION="--in-place=${BACKUP_EXTENSION}"
|
|
TOOLCHAIN_BUILD="x86_64-linux-gnu"
|
|
;;
|
|
* ) echo "$0: Unknown build system: ${BUILD_SYSTEM}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
case $(echo "${BUILD_TYPE}" | tr '[:upper:]' '[:lower:]') in
|
|
"debug" )
|
|
BUILD_TYPE="Debug"
|
|
;;
|
|
"minsizerel" )
|
|
BUILD_TYPE="MinSizeRel"
|
|
;;
|
|
"release" )
|
|
BUILD_TYPE="Release"
|
|
;;
|
|
"relwithdebinfo" )
|
|
BUILD_TYPE="RelWithDebInfo"
|
|
;;
|
|
* ) echo "$0: Unknown build type: ${BUILD_TYPE}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
case "${TARGET_SYSTEM}" in
|
|
"arm" | "armeabi-v7a" )
|
|
TARGET_SYSTEM="arm"
|
|
;;
|
|
"x86" )
|
|
TARGET_SYSTEM="x86"
|
|
;;
|
|
* ) echo "$0: Unknown host system: ${TARGET_SYSTEM}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
if [ "${TARGET_SYSTEM}" == "x86" ]; then
|
|
ANDROID_ABI="${TARGET_SYSTEM}"
|
|
else
|
|
if [ "${TARGET_SYSTEM}" == "arm" ]; then
|
|
ANDROID_ABI="armeabi-v7a"
|
|
else
|
|
ANDROID_ABI="arm64-v8a"
|
|
fi
|
|
fi
|
|
mkdir -p "${ANDROID_HOME}/ndk"
|
|
ANDROID_NDK="${ANDROID_HOME}/ndk/ndk-bundle/${NDK_PACKAGE}"
|
|
ANDROID_PLATFORM_LEVEL="${API_LEVEL}"
|
|
ANDROID_SYSROOT_ABI="${TARGET_SYSTEM}"
|
|
|
|
ANDROID_ALLOW_UNDEFINED_SYMBOLS="FALSE"
|
|
ANDROID_ARM_MODE="thumb"
|
|
ANDROID_ARM_NEON="FALSE"
|
|
ANDROID_CPP_FEATURES="rtti exceptions"
|
|
ANDROID_DISABLE_FORMAT_STRING_CHECKS="FALSE"
|
|
ANDROID_DISABLE_NO_EXECUTE="FALSE"
|
|
ANDROID_DISABLE_RELRO="FALSE"
|
|
ANDROID_PIE="ON"
|
|
ANDROID_PLATFORM="android-${ANDROID_PLATFORM_LEVEL}"
|
|
ANDROID_STL="c++_shared"
|
|
ANDROID_TOOLCHAIN="clang"
|
|
|
|
# Standalone toolchain
|
|
if [ "${TARGET_SYSTEM}" == "x86" ]; then
|
|
TOOLCHAIN_HOST="i686-linux-android"
|
|
else
|
|
if [ "${TARGET_SYSTEM}" == "arm" ]; then
|
|
TOOLCHAIN_HOST="arm-linux-androideabi"
|
|
else
|
|
TOOLCHAIN_HOST="aarch64-linux-android"
|
|
fi
|
|
fi
|
|
TOOLCHAIN="${ANDROID_HOME}/ndk/toolchains/${NDK_PACKAGE}/toolchain-${ANDROID_ABI}/${ANDROID_PLATFORM}"
|
|
if [ ! -d "${TOOLCHAIN}" ]; then
|
|
if [ ! -d "${ANDROID_NDK}" ]; then
|
|
mkdir -p "${ANDROID_HOME}/ndk/ndk-bundle"
|
|
pushd "${ANDROID_HOME}/ndk/ndk-bundle"
|
|
if [ ! -f "${NDK_PACKAGE_FILE}" ]; then
|
|
if [ $(which wget) ]; then
|
|
wget "https://dl.google.com/android/repository/${NDK_PACKAGE_FILE}"
|
|
elif [ $(which curl) ]; then
|
|
curl --output "${NDK_PACKAGE_FILE}" --url "https://dl.google.com/android/repository/${NDK_PACKAGE_FILE}"
|
|
else
|
|
echo "Error: Cannot download package ${NDK_PACKAGE_FILE}. Please install 'wget' or 'curl'."
|
|
exit 1
|
|
fi
|
|
fi
|
|
unzip -a "${NDK_PACKAGE_FILE}"
|
|
popd
|
|
fi
|
|
MAKE_STANDALONE_TOOLCHAIN_ARCH="${ANDROID_SYSROOT_ABI}"
|
|
case "${NDK_PACKAGE}" in
|
|
"android-ndk-r16" )
|
|
"${ANDROID_NDK}/build/tools/make_standalone_toolchain.py" \
|
|
--arch="${MAKE_STANDALONE_TOOLCHAIN_ARCH}" \
|
|
--api="${ANDROID_PLATFORM_LEVEL}" \
|
|
--stl="libc++" \
|
|
--force \
|
|
--install-dir="${TOOLCHAIN}"
|
|
;;
|
|
"android-ndk-r15c" )
|
|
"${ANDROID_NDK}/build/tools/make_standalone_toolchain.py" \
|
|
--arch="${MAKE_STANDALONE_TOOLCHAIN_ARCH}" \
|
|
--api="${ANDROID_PLATFORM_LEVEL}" \
|
|
--stl="libc++" \
|
|
--unified-headers \
|
|
--force \
|
|
--install-dir="${TOOLCHAIN}"
|
|
;;
|
|
* ) echo "Unsupported NDK package: ${NDK_PACKAGE}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
if [ "$?" -ne 0 ]; then
|
|
echo "Error: make standalone toolchain failed!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
CMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake"
|
|
CXX_SHARED_LIBRARY="${TOOLCHAIN}/${TOOLCHAIN_HOST}/lib/lib${ANDROID_STL}.so"
|
|
export AR="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-ar"
|
|
export CC="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-clang"
|
|
export CPP="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-cpp"
|
|
export CROSS_SYSROOT="${TOOLCHAIN}/sysroot"
|
|
export CXX="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-clang++"
|
|
export LD="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-ld"
|
|
export LINK="${CXX}"
|
|
export PATH="${TOOLCHAIN}/bin:${PATH}"
|
|
export RANLIB="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-ranlib"
|
|
export READELF="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-readelf"
|
|
export STRIP="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-strip"
|
|
export SYSROOT="${TOOLCHAIN}/sysroot"
|
|
|
|
# Out-of-source build
|
|
BUILD_TYPE_LOWER=$(echo "${BUILD_TYPE}" | tr '[:upper:]' '[:lower:]')
|
|
BUILD_PLATFORM="${INSTALL_BASE}/${BUILD_TYPE_LOWER}/${ANDROID_PLATFORM}"
|
|
BUILD_TARGET="${BUILD_PLATFORM}/${ANDROID_ABI}"
|
|
INSTALL_TARGET="${BUILD_TARGET}/install"
|
|
INSTALL_TARGET_INCLUDE="${INSTALL_TARGET}/include"
|
|
INSTALL_TARGET_LIB="${INSTALL_TARGET}/lib"
|
|
[ ! -d "${INSTALL_TARGET_INCLUDE}" ] && mkdir -p "${INSTALL_TARGET_INCLUDE}"
|
|
[ ! -d "${INSTALL_TARGET_LIB}" ] && mkdir -p "${INSTALL_TARGET_LIB}"
|
|
|
|
# Symbolic links for Android JNI convenience
|
|
JNILIBS="${BUILD_PLATFORM}/jniLibs"
|
|
[ ! -d "${JNILIBS}" ] && mkdir -p "${JNILIBS}"
|
|
[ ! -L "${JNILIBS}/${ANDROID_ABI}" ] && ln -sf "${INSTALL_TARGET_LIB}/" "${JNILIBS}/${ANDROID_ABI}"
|
|
|
|
# Prepend install path to PKG_CONFIG_PATH.
|
|
export PKG_CONFIG_PATH=${INSTALL_TARGET_LIB}/pkgconfig:${PKG_CONFIG_PATH:-""}
|
|
|
|
# Print installation summary
|
|
printInfo "ANDROID_HOME: ${ANDROID_HOME}" \
|
|
"ANDROID_NDK: ${ANDROID_NDK}" \
|
|
"CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}" \
|
|
"CXX: ${CXX}" \
|
|
"READELF: ${READELF}" \
|
|
"STRIP: ${STRIP}" \
|
|
"SYSROOT: ${SYSROOT}" \
|
|
"TOOLCHAIN: ${TOOLCHAIN}" \
|
|
"TOOLCHAIN_HOST: ${TOOLCHAIN_HOST}" \
|
|
"INSTALL_PATH: ${INSTALL_TARGET}" \
|
|
"DEVICE_INSTALL_PATH: ${DEVICE_INSTALL_PATH}"
|
|
echo ""
|
|
|
|
}
|
|
|
|
download_dependency() {
|
|
local LIB_NAME=$1
|
|
local LIB_PATH=$2
|
|
local LIB_URL=$3
|
|
local ORIGINAL_PATH=$4
|
|
if [ -z "${!LIB_NAME:-}" ]; then # indirect expansion
|
|
DIRECTORY="${INSTALL_BASE}/${LIB_PATH}"
|
|
PARENT=$(dirname "${DIRECTORY}")
|
|
LIB_DIR_NAME=$(basename "${LIB_PATH}")
|
|
LIB_FILE=$(basename "${LIB_URL}")
|
|
eval ${LIB_NAME}=\${DIRECTORY}
|
|
mkdir -p "${PARENT}"
|
|
pushd "${PARENT}" > /dev/null
|
|
if [ ! -f ${LIB_FILE} ]; then
|
|
if [ $(which wget) ]; then
|
|
wget ${LIB_URL}
|
|
elif [ $(which curl) ]; then
|
|
curl --output ${LIB_FILE} --url ${LIB_URL}
|
|
else
|
|
echo "Error: Cannot download package ${LIB_URL}. Please install 'wget' or 'curl'."
|
|
exit 1
|
|
fi
|
|
fi
|
|
if [ ! -d ${LIB_DIR_NAME} ]; then
|
|
tar -zxf ${LIB_FILE}
|
|
mv ${ORIGINAL_PATH} ${LIB_DIR_NAME}
|
|
fi
|
|
popd > /dev/null
|
|
[ ! -d "${DIRECTORY}" ] && (echo "${DIRECTORY}: No such directory"; exit 1)
|
|
DIRECTORY=$(cd "${DIRECTORY}" && pwd)
|
|
else
|
|
DIRECTORY=${!LIB_DIR_NAME:-${LIB_PATH}}
|
|
[ ! -d "${DIRECTORY}" ] && (echo "${DIRECTORY}: No such directory"; exit 1)
|
|
DIRECTORY=$(cd "${DIRECTORY}" && pwd)
|
|
fi
|
|
}
|
|
|
|
install_dependencies() {
|
|
|
|
download_dependency "CURL_LIBRARY_SOURCE" "Libraries/curl" "https://github.com/curl/curl/releases/download/curl-7_61_0/curl-7.61.0.tar.gz" "curl-7.61.0"
|
|
download_dependency "NGHTTP2_LIBRARY_SOURCE" "Libraries/nghttp2" "https://github.com/nghttp2/nghttp2/releases/download/v1.32.0/nghttp2-1.32.0.tar.gz" "nghttp2-1.32.0"
|
|
download_dependency "OPENSSL_LIBRARY_SOURCE" "Libraries/openssl" "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0h.tar.gz" "openssl-OpenSSL_1_1_0h"
|
|
download_dependency "SQLITE3_LIBRARY_SOURCE" "Libraries/sqlite3" "https://sqlite.org/2018/sqlite-autoconf-3240000.tar.gz" "sqlite-autoconf-3240000"
|
|
download_dependency "FFMPEG_LIBRARY_SOURCE" "Libraries/ffmpeg" "https://www.ffmpeg.org/releases/ffmpeg-4.0.tar.gz" "ffmpeg-4.0"
|
|
|
|
##################################################
|
|
# Download packages
|
|
##################################################
|
|
printInfo "Download packages"
|
|
|
|
# Default num threads to use for make commands
|
|
NUM_THREADS="1"
|
|
|
|
# Override on mac or linux - use number of logic cores
|
|
if [ "$(uname)" == "Darwin" ]; then
|
|
# on mac
|
|
NUM_THREADS=$(sysctl -n hw.ncpu)
|
|
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
|
# on linux
|
|
NUM_THREADS=$(grep -c processor /proc/cpuinfo)
|
|
fi
|
|
|
|
# Some breathing room
|
|
if (( ${NUM_THREADS} > 1 )); then
|
|
NUM_THREADS=$(($NUM_THREADS - 1))
|
|
fi
|
|
|
|
##################################################
|
|
# Build openssl
|
|
##################################################
|
|
OPENSSL_ARCH="${ANDROID_ABI}"
|
|
OPENSSL_CROSS_COMPILE="${TOOLCHAIN_HOST}-"
|
|
if [ "${TARGET_SYSTEM}" == "x86" ]; then
|
|
# android-x86
|
|
OPENSSL_MACHINE="i686"
|
|
OPENSSL_TARGET="android-x86"
|
|
else
|
|
# android-armeabi
|
|
OPENSSL_MACHINE="armv7"
|
|
OPENSSL_TARGET="android-armeabi"
|
|
fi
|
|
OPENSSL_RELEASE="2.6.37"
|
|
OPENSSL_SYSTEM="android"
|
|
|
|
OPENSSL_BUILD_TARGET="${BUILD_TARGET}/openssl"
|
|
DONE_FILE="${OPENSSL_BUILD_TARGET}/.done"
|
|
if [ -d "${OPENSSL_LIBRARY_SOURCE}" ] && [ ! -f "${DONE_FILE}" ]; then
|
|
if [ ! -f "${OPENSSL_BUILD_TARGET}/Makefile" ]; then
|
|
mkdir -p "${OPENSSL_BUILD_TARGET}"
|
|
pushd "${OPENSSL_BUILD_TARGET}"
|
|
sed ${SED_IN_PLACE_BACKUP_OPTION} "s/-mandroid//" "${OPENSSL_LIBRARY_SOURCE}/Configurations/10-main.conf"
|
|
# Get unversioned shared lib names:
|
|
# Part 1. update .so names in the config
|
|
sed ${SED_IN_PLACE_BACKUP_OPTION} 's/\.so\.\\\$(SHLIB_MAJOR)\.\\\$(SHLIB_MINOR)/\.so/' "${OPENSSL_LIBRARY_SOURCE}/Configurations/10-main.conf"
|
|
"${OPENSSL_LIBRARY_SOURCE}/Configure" \
|
|
"${OPENSSL_TARGET}" \
|
|
-DARCH="${OPENSSL_ARCH}" \
|
|
-DCROSS_COMPILE="${OPENSSL_CROSS_COMPILE}" \
|
|
-DMACHINE="${OPENSSL_MACHINE}" \
|
|
-DRELEASE="${OPENSSL_RELEASE}" \
|
|
-DSYSTEM="${OPENSSL_SYSTEM}" \
|
|
no-asm \
|
|
no-comp \
|
|
no-dso \
|
|
no-dtls \
|
|
no-engine \
|
|
no-hw \
|
|
no-idea \
|
|
no-nextprotoneg \
|
|
no-psk \
|
|
no-srp \
|
|
no-ssl3 \
|
|
no-weak-ssl-ciphers \
|
|
--prefix="${INSTALL_TARGET}" \
|
|
--openssldir="${INSTALL_TARGET}/ssl" \
|
|
-D_FORTIFY_SOURCE="2" -fstack-protector-strong
|
|
if [ -f "${OPENSSL_LIBRARY_SOURCE}/Configurations/10-main.conf${BACKUP_EXTENSION}" ]; then
|
|
mv "${OPENSSL_LIBRARY_SOURCE}/Configurations/10-main.conf${BACKUP_EXTENSION}" "${OPENSSL_LIBRARY_SOURCE}/Configurations/10-main.conf"
|
|
fi
|
|
rm -fr "${INSTALL_TARGET_LIB}/engines-"*
|
|
rm -f "${INSTALL_TARGET_LIB}/libcrypto."*
|
|
popd
|
|
fi
|
|
pushd "${OPENSSL_BUILD_TARGET}"
|
|
make depend
|
|
make all -j ${NUM_THREADS}
|
|
removeSymbolsFromRelObjFiles .
|
|
# Get unversioned shared lib names
|
|
# Part 2. trick make into not creating symlinks: existing link-shared files will force openssl make to skip symlinks creation.
|
|
mkdir -p ${OPENSSL_BUILD_TARGET}/lib
|
|
echo "place-holder make target for avoiding symlinks" >> ${OPENSSL_BUILD_TARGET}/lib/link-shared
|
|
make SHLIB_EXT=.so install_sw
|
|
rm ${OPENSSL_BUILD_TARGET}/lib/link-shared
|
|
popd
|
|
|
|
echo "Built on $(date)" > ${DONE_FILE}
|
|
fi
|
|
|
|
##################################################
|
|
# Build nghttp2
|
|
##################################################
|
|
NGHTTP2_BUILD_TARGET="${BUILD_TARGET}/nghttp2"
|
|
DONE_FILE="${NGHTTP2_BUILD_TARGET}/.done"
|
|
if [ -d "${NGHTTP2_LIBRARY_SOURCE}" ] && [ ! -f "${DONE_FILE}" ]; then
|
|
if [ ! -f "${NGHTTP2_BUILD_TARGET}/Makefile" ]; then
|
|
mkdir -p "${NGHTTP2_BUILD_TARGET}"
|
|
pushd "${NGHTTP2_BUILD_TARGET}"
|
|
if [ ! -f "${NGHTTP2_LIBRARY_SOURCE}/configure" ]; then
|
|
pushd "${NGHTTP2_LIBRARY_SOURCE}"
|
|
autoreconf -i
|
|
automake
|
|
autoconf
|
|
popd
|
|
fi
|
|
"${NGHTTP2_LIBRARY_SOURCE}/configure" \
|
|
${DISABLE_RPATH} \
|
|
--prefix="${INSTALL_TARGET}" \
|
|
--host="${TOOLCHAIN_HOST}" \
|
|
--build="${TOOLCHAIN_BUILD}" \
|
|
--enable-static="YES" \
|
|
--enable-shared="YES" \
|
|
CPPFLAGS="-fPIE -D_FORTIFY_SOURCE=2 -fstack-protector-strong" \
|
|
LDFLAGS="-fPIE -pie" \
|
|
PKG_CONFIG_LIBDIR="${INSTALL_TARGET_LIB}/pkgconfig"
|
|
rm -f "${INSTALL_TARGET_LIB}/libnghttp2."*
|
|
popd
|
|
fi
|
|
pushd "${NGHTTP2_BUILD_TARGET}"
|
|
make -j ${NUM_THREADS}
|
|
removeSymbolsFromRelObjFiles .
|
|
make install
|
|
popd
|
|
|
|
echo "Built on $(date)" > ${DONE_FILE}
|
|
fi
|
|
|
|
##################################################
|
|
# Build curl
|
|
##################################################
|
|
CURL_BUILD_TARGET="${BUILD_TARGET}/curl"
|
|
CURL_INCLUDE_DIR="${INSTALL_TARGET_INCLUDE}"
|
|
|
|
CURL_LIBRARY="${INSTALL_TARGET_LIB}/libcurl.so"
|
|
DONE_FILE="${CURL_BUILD_TARGET}/.done"
|
|
if [ -d "${CURL_LIBRARY_SOURCE}" ] && [ ! -f "${DONE_FILE}" ]; then
|
|
if [ ! -f "${CURL_BUILD_TARGET}/Makefile" ]; then
|
|
mkdir -p "${CURL_BUILD_TARGET}"
|
|
pushd "${CURL_BUILD_TARGET}"
|
|
if [ ! -f "${CURL_LIBRARY_SOURCE}/configure" ]; then
|
|
pushd "${CURL_LIBRARY_SOURCE}"
|
|
autoreconf -i
|
|
automake
|
|
autoconf
|
|
popd
|
|
fi
|
|
CFLAGS="-fstack-protector-strong" \
|
|
CPPFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-strong -I\"${INSTALL_TARGET_INCLUDE}\"" \
|
|
LDFLAGS="-L\"${INSTALL_TARGET_LIB}\"" "${CURL_LIBRARY_SOURCE}/configure" \
|
|
${DISABLE_RPATH} \
|
|
--prefix="${INSTALL_TARGET}" \
|
|
--with-sysroot="${SYSROOT}" \
|
|
--host="${TOOLCHAIN_HOST}" \
|
|
--build="${TOOLCHAIN_BUILD}" \
|
|
--enable-optimize \
|
|
--enable-hidden-symbols \
|
|
--disable-largefile \
|
|
--disable-static \
|
|
--disable-ftp \
|
|
--disable-file \
|
|
--disable-ldap \
|
|
--disable-rtsp \
|
|
--disable-proxy \
|
|
--disable-dict \
|
|
--disable-telnet \
|
|
--disable-tftp \
|
|
--disable-pop3 \
|
|
--disable-imap \
|
|
--disable-smb \
|
|
--disable-smtp \
|
|
--disable-gopher \
|
|
--disable-manual \
|
|
--disable-verbose \
|
|
--disable-sspi \
|
|
--disable-crypto-auth \
|
|
--disable-tls-srp \
|
|
--disable-unix-sockets \
|
|
--enable-cookies \
|
|
--without-zlib \
|
|
--with-ssl="${INSTALL_TARGET}" \
|
|
--with-ca-bundle="${CURL_CA_BUNDLE}" \
|
|
--with-nghttp2="${INSTALL_TARGET}"
|
|
rm -f "${INSTALL_TARGET_LIB}/libcurl-d."*
|
|
rm -f "${INSTALL_TARGET_LIB}/libcurl."*
|
|
popd
|
|
fi
|
|
pushd "${CURL_BUILD_TARGET}"
|
|
make -j ${NUM_THREADS}
|
|
removeSymbolsFromRelObjFiles .
|
|
make install
|
|
popd
|
|
|
|
echo "Built on $(date)" > ${DONE_FILE}
|
|
fi
|
|
|
|
##################################################
|
|
# Build sqlite3
|
|
##################################################
|
|
SQLITE3_BUILD_TARGET="${BUILD_TARGET}/sqlite3"
|
|
DONE_FILE="${SQLITE3_BUILD_TARGET}/.done"
|
|
if [ -d "${SQLITE3_LIBRARY_SOURCE}" ] && [ ! -f "${DONE_FILE}" ]; then
|
|
if [ ! -f "${SQLITE3_BUILD_TARGET}/Makefile" ]; then
|
|
mkdir -p "${SQLITE3_BUILD_TARGET}"
|
|
pushd "${SQLITE3_BUILD_TARGET}"
|
|
"${SQLITE3_LIBRARY_SOURCE}/configure" \
|
|
${DISABLE_RPATH} \
|
|
--prefix="${INSTALL_TARGET}" \
|
|
--with-sysroot="${SYSROOT}" \
|
|
--host="${TOOLCHAIN_HOST}" \
|
|
--build="${TOOLCHAIN_BUILD}" \
|
|
--disable-static
|
|
rm -f "${INSTALL_TARGET_LIB}/libsqlite3."*
|
|
popd
|
|
fi
|
|
pushd "${SQLITE3_BUILD_TARGET}"
|
|
if [ "${ANDROID_PLATFORM_LEVEL}" -ge "21" ]; then
|
|
make -j ${NUM_THREADS}
|
|
else
|
|
make -j ${NUM_THREADS} CFLAGS="-D_FILE_OFFSET_BITS=32"
|
|
fi
|
|
removeSymbolsFromRelObjFiles .
|
|
make install
|
|
popd
|
|
|
|
echo "Built on $(date)" > ${DONE_FILE}
|
|
fi
|
|
|
|
##################################################
|
|
# Build FFmpeg
|
|
##################################################
|
|
if [ "${TARGET_SYSTEM}" == "x86" ]; then
|
|
FFMPEG_ARCH="x86"
|
|
else
|
|
FFMPEG_ARCH="armv7-a"
|
|
fi
|
|
|
|
FFMPEG_DEBUG_OPS=""
|
|
if [ "${BUILD_TYPE}" == "debug" ]; then
|
|
FFMPEG_DEBUG_OPS="--disable-optimizations --disable-mmx --disable-stripping
|
|
--enable-debug "
|
|
fi
|
|
|
|
FFMPEG_BUILD_TARGET="${BUILD_TARGET}/ffmpeg"
|
|
DONE_FILE="${FFMPEG_BUILD_TARGET}/.done"
|
|
if [ -d "${FFMPEG_LIBRARY_SOURCE}" ] && [ ! -f "${DONE_FILE}" ]; then
|
|
if [ ! -f "${FFMPEG_BUILD_TARGET}/Makefile" ]; then
|
|
mkdir -p "${FFMPEG_BUILD_TARGET}"
|
|
pushd "${FFMPEG_BUILD_TARGET}"
|
|
# TODO: Prune unused options
|
|
CPPFLAGS="-I${INSTALL_TARGET_INCLUDE}"
|
|
LDFLAGS="-L${INSTALL_TARGET_LIB} -lssl"
|
|
"${FFMPEG_LIBRARY_SOURCE}/configure" \
|
|
${DISABLE_RPATH} \
|
|
--prefix="${INSTALL_TARGET}" \
|
|
--extra-cflags="-I${TOOLCHAIN}/include $CPPFLAGS -fPIE -pie" \
|
|
--extra-ldflags="-L${TOOLCHAIN}/lib $LDFLAGS -fPIE -pie" \
|
|
--arch="${FFMPEG_ARCH}" \
|
|
--sysroot="${SYSROOT}" \
|
|
--cross-prefix="${TOOLCHAIN}/bin/${TOOLCHAIN_HOST}-" \
|
|
--target-os="android" \
|
|
--enable-cross-compile \
|
|
--cc=clang \
|
|
--cxx=clang++ \
|
|
--disable-static \
|
|
--disable-encoders \
|
|
--disable-ffplay \
|
|
--disable-ffprobe \
|
|
--disable-ffmpeg \
|
|
--disable-muxers \
|
|
--disable-indevs \
|
|
--disable-bsfs \
|
|
--disable-filters \
|
|
--disable-asm \
|
|
--disable-doc \
|
|
${FFMPEG_DEBUG_OPS} \
|
|
--disable-linux-perf \
|
|
--enable-network \
|
|
--enable-openssl \
|
|
--enable-swscale \
|
|
--enable-shared \
|
|
--enable-parsers \
|
|
--enable-decoders \
|
|
--enable-demuxers \
|
|
--enable-protocols \
|
|
--pkg-config=true # Hack to allow us to use openssl.
|
|
popd
|
|
fi
|
|
pushd "${FFMPEG_BUILD_TARGET}"
|
|
make -j ${NUM_THREADS}
|
|
removeSymbolsFromRelObjFiles .
|
|
make install
|
|
popd
|
|
|
|
echo "Built on $(date)" > ${DONE_FILE}
|
|
fi
|
|
|
|
echo "Done"
|
|
|
|
}
|
|
|
|
configure_target() {
|
|
# Create a certificate bundle for curl.
|
|
# If running on emulator, start emulator with -writable-system.
|
|
printInfo "Wait until device is online. Please make sure the device is " \
|
|
"connected."
|
|
${ADB} wait-for-device
|
|
|
|
printInfo "Make sure device intall target exists and has write permission"
|
|
${ADB} shell mkdir -p ${DEVICE_INSTALL_PATH}
|
|
${ADB} shell mkdir -p ${DEVICE_BIN_PATH}
|
|
${ADB} shell mkdir -p ${CONFIG_DB_PATH}
|
|
|
|
printInfo "Generate CA bundle"
|
|
${ADB} shell "echo > ${CURL_CA_BUNDLE}"
|
|
${ADB} shell \
|
|
"for f in \$(ls ${ANDROID_CA_PATH}); do \
|
|
cat ${ANDROID_CA_PATH}\$f | grep 'END CERTIFICATE' -B 100 >> ${CURL_CA_BUNDLE}; \
|
|
done;"
|
|
}
|
|
|
|
##################################################
|
|
# Push files through adb
|
|
##################################################
|
|
|
|
adb_push() {
|
|
configure_target
|
|
|
|
${ADB} push ${INSTALL_TARGET_LIB} ${DEVICE_INSTALL_PATH}
|
|
${ADB} push ${BUILD_PATH}/SampleApp/src/SampleApp ${DEVICE_BIN_PATH}
|
|
${ADB} push ${OUTPUT_CONFIG_FILE} ${DEVICE_INSTALL_PATH}
|
|
}
|
|
|
|
configure_host
|