From 4f900225582cf71e11fcd8d35c5b06a433db0777 Mon Sep 17 00:00:00 2001 From: William Brawner Date: Fri, 22 May 2020 18:59:04 -0700 Subject: [PATCH] Add convenience script for building statically-linked pihelper & dependencies for Android Signed-off-by: William Brawner --- .gitignore | 1 + scripts/build-android | 186 ++++++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 2 +- 3 files changed, 188 insertions(+), 1 deletion(-) create mode 100755 scripts/build-android diff --git a/.gitignore b/.gitignore index b4bacf9..8cfccc1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ build/ *.o tags *.swp +deps/ diff --git a/scripts/build-android b/scripts/build-android new file mode 100755 index 0000000..1c1cb22 --- /dev/null +++ b/scripts/build-android @@ -0,0 +1,186 @@ +#!/usr/bin/env bash + +# Configure the following variables according to your needs + +NDK_VERSION="21.1.6352462" +OPENSSL_TAG_VERSION="OpenSSL_1_1_1g " +CURL_TAG_VERSION="master " +JSONC_TAG_VERSION="master" +ANDROID_ARCHS="arm arm64 x86 x86_64" +NDK=$HOME/Android/Sdk/ndk/$NDK_VERSION +MIN_SDK_VERSION=23 # Can't go any lower unfortunately. See the cURL docs for more info. +TARGET_SDK_VERSION=29 + +# Edit below at your own risk + +get_abi() { + case $1 in + "arm") + echo -n "armeabi-v7a" + ;; + "arm64") + echo -n "arm64-v8a" + ;; + "x86") + echo -n "x86" + ;; + "x86_64") + echo -n "x86_64" + ;; + esac +} + +make_openssl() { + cd deps + test -d openssl || git clone --branch $OPENSSL_TAG_VERSION https://github.com/openssl/openssl.git + for ARCH in $ANDROID_ARCHS; do + ( + export PREFIX="$BUILD_DIR/android/$ARCH" + mkdir -p "$PREFIX" + cd openssl + git checkout $OPENSSL_TAG_VERSION + make clean + export ANDROID_NDK_HOME=$NDK + export ANDROID_NDK_ROOT=$NDK + export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH + ./Configure \ + --prefix="$PREFIX" \ + -D__ANDROID_API__=$TARGET_SDK_VERSION \ + no-shared \ + android-$ARCH + make install_dev + ) + done +} + +make_curl() { + cd deps + test -d curl || git clone --branch $CURL_TAG_VERSION https://github.com/curl/curl.git + for ARCH in $ANDROID_ARCHS; do + ( + export PREFIX="$BUILD_DIR/android/$ARCH" + mkdir -p "$PREFIX" + cd curl + git checkout $CURL_TAG_VERSION + test -f configure || ./buildconf + export HOST_TAG=linux-x86_64 + export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG + case $ARCH in + "arm") + export CURL_ARCH="arm-linux-androideabi" + export CLANG="armv7a-linux-androideabi" + ;; + "arm64") + export CURL_ARCH="aarch64-linux-android" + export CLANG=$CURL_ARCH + ;; + "x86") + export CURL_ARCH="i686-linux-android" + export CLANG=$CURL_ARCH + ;; + "x86_64") + export CURL_ARCH="x86_64-linux-android" + export CLANG=$CURL_ARCH + ;; + esac + export AR=$TOOLCHAIN/bin/$CURL_ARCH-ar + export AS=$TOOLCHAIN/bin/$CURL_ARCH-as + export CC=$TOOLCHAIN/bin/${CLANG}${MIN_SDK_VERSION}-clang + export CXX=$TOOLCHAIN/bin/${CLANG}${MIN_SDK_VERSION}-clang++ + export LD=$TOOLCHAIN/bin/$CURL_ARCH-ld + export RANLIB=$TOOLCHAIN/bin/$CURL_ARCH-ranlib + export STRIP=$TOOLCHAIN/bin/$CURL_ARCH-strip + make clean + ./configure --prefix="$PREFIX" \ + --host $CURL_ARCH \ + --with-pic \ + --disable-shared \ + --with-ssl="$PREFIX" + make install + ) + done +} + +make_jsonc() { + cd deps + test -d json-c || git clone --branch $JSONC_TAG_VERSION https://github.com/json-c/json-c.git + for ARCH in $ANDROID_ARCHS; do + ( + export PREFIX="$BUILD_DIR/android/$ARCH" + mkdir -p "$PREFIX" + cd json-c + git checkout $JSONC_TAG_VERSION + test -d $ARCH && rm -rf $ARCH + mkdir $ARCH + pushd $ARCH + export ABI="$(get_abi $ARCH)" + cmake \ + -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=$ABI \ + -DANDROID_NATIVE_API_LEVEL=$MIN_SDK_VERSION \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DBUILD_SHARED_LIBS=OFF \ + -DBUILD_STATIC_LIBS=ON \ + .. + make + make install + ) + done +} + +make_pihelper() { + for ARCH in $ANDROID_ARCHS; do + ( + export PREFIX="$BUILD_DIR/android/$ARCH" + mkdir -p "$PREFIX" + cd "$BUILD_DIR" + test -d $ARCH && rm -rf $ARCH + mkdir $ARCH + pushd $ARCH + cmake \ + -DCMAKE_FIND_ROOT_PATH=$PREFIX \ + -DCMAKE_INCLUDE_PATH=$PREFIX/include \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=$ABI \ + -DANDROID_NATIVE_API_LEVEL=$MIN_SDK_VERSION \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DPIHELPER_SHARED=OFF \ + -DPIHELPER_STATIC=ON \ + -DPIHELPER_DEV=ON \ + ../.. + make + make install + ) + done +} + +package() { + for ARCH in $ANDROID_ARCHS; do + ( + export ABI="$(get_abi $ARCH)" + cd android + cp -r $ARCH/include . + mv $ARCH/lib/*.a $ARCH/lib/*.la $ARCH/ + rm -rf $ARCH/{bin,lib,include,share} + if [ "$ARCH" != "$ABI" ]; then + mv $ARCH $ABI + fi + ) + done +} + +( +if [ "$(dirname $0)" == "." ]; then + cd .. +fi +test -d deps || mkdir deps +export BUILD_DIR="$PWD/build" +test -d "$BUILD_DIR" || mkdir -p "$BUILD_DIR" +make_openssl +make_curl +make_jsonc +make_pihelper +package +) + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b23da05..3946b28 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,7 +24,7 @@ set(PIHELPER_SOURCES config.c ) -include_directories(/usr/local/include) +include_directories(/usr/local/include ${CMAKE_INCLUDE_PATH}) if (NOT TARGET CURL) find_library( CURL