| #!/bin/bash |
| |
| # |
| # Build libwebsockets static library for Android |
| # |
| # requires debian package xutils-dev for makedepend (openssl make depend) |
| # |
| |
| # This is based on http://stackoverflow.com/questions/11929773/compiling-the-latest-openssl-for-android/ |
| # via https://github.com/warmcat/libwebsockets/pull/502 |
| |
| # path to NDK |
| export NDK=/opt/Android/SDK/ndk-bundle |
| |
| set -e |
| |
| # Download packages libz, openssl and libwebsockets |
| |
| [ ! -f zlib-1.2.8.tar.gz ] && { |
| wget http://prdownloads.sourceforge.net/libpng/zlib-1.2.8.tar.gz |
| } |
| |
| [ ! -f openssl-1.0.2g.tar.gz ] && { |
| wget https://openssl.org/source/openssl-1.0.2g.tar.gz |
| } |
| |
| [ ! -f libwebsockets.tar.gz ] && { |
| git clone https://github.com/warmcat/libwebsockets.git |
| tar caf libwebsockets.tar.gz libwebsockets |
| } |
| |
| # Clean then Unzip |
| |
| [ -d zlib-1.2.8 ] && rm -fr zlib-1.2.8 |
| [ -d openssl-1.0.2g ] && rm -fr openssl-1.0.2g |
| [ -d libwebsockets ] && rm -fr libwebsockets |
| [ -d android-toolchain-arm ] && rm -fr android-toolchain-arm |
| tar xf zlib-1.2.8.tar.gz |
| tar xf openssl-1.0.2g.tar.gz |
| tar xf libwebsockets.tar.gz |
| |
| # create a local android toolchain |
| $NDK/build/tools/make-standalone-toolchain.sh \ |
| --platform=android-9 \ |
| --toolchain=arm-linux-androideabi-4.9 \ |
| --install-dir=`pwd`/android-toolchain-arm |
| |
| # setup environment to use the gcc/ld from the android toolchain |
| export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin |
| export TOOL=arm-linux-androideabi |
| export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL} |
| export CC=$NDK_TOOLCHAIN_BASENAME-gcc |
| export CXX=$NDK_TOOLCHAIN_BASENAME-g++ |
| export LINK=${CXX} |
| export LD=$NDK_TOOLCHAIN_BASENAME-ld |
| export AR=$NDK_TOOLCHAIN_BASENAME-ar |
| export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib |
| export STRIP=$NDK_TOOLCHAIN_BASENAME-strip |
| |
| # setup buildflags |
| export ARCH_FLAGS="-mthumb" |
| export ARCH_LINK= |
| export CPPFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 " |
| export CXXFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions " |
| export CFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 " |
| export LDFLAGS=" ${ARCH_LINK} " |
| |
| # configure and build zlib |
| [ ! -f ./android-toolchain-arm/lib/libz.a ] && { |
| cd zlib-1.2.8 |
| PATH=$TOOLCHAIN_PATH:$PATH ./configure --static --prefix=$TOOLCHAIN_PATH/.. |
| PATH=$TOOLCHAIN_PATH:$PATH make |
| PATH=$TOOLCHAIN_PATH:$PATH make install |
| cd .. |
| } |
| |
| # configure and build openssl |
| [ ! -f ./android-toolchain-arm/lib/libssl.a ] && { |
| PREFIX=$TOOLCHAIN_PATH/.. |
| cd openssl-1.0.2g |
| ./Configure android --prefix=${PREFIX} no-shared no-idea no-mdc2 no-rc5 no-zlib no-zlib-dynamic enable-tlsext no-ssl2 no-ssl3 enable-ec enable-ecdh enable-ecp |
| PATH=$TOOLCHAIN_PATH:$PATH make depend |
| PATH=$TOOLCHAIN_PATH:$PATH make |
| PATH=$TOOLCHAIN_PATH:$PATH make install_sw |
| cd .. |
| } |
| |
| # configure and build libwebsockets |
| [ ! -f ./android-toolchain-arm/lib/libwebsockets.a ] && { |
| cd libwebsockets |
| [ ! -d build ] && mkdir build |
| cd build |
| PATH=$TOOLCHAIN_PATH:$PATH cmake \ |
| -DCMAKE_C_COMPILER=$CC \ |
| -DCMAKE_AR=$AR \ |
| -DCMAKE_RANLIB=$RANLIB \ |
| -DCMAKE_C_FLAGS="$CFLAGS" \ |
| -DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PATH/.. \ |
| -DLWS_WITH_SHARED=OFF \ |
| -DLWS_WITH_STATIC=ON \ |
| -DLWS_WITHOUT_DAEMONIZE=ON \ |
| -DLWS_WITHOUT_TESTAPPS=ON \ |
| -DLWS_IPV6=OFF \ |
| -DLWS_USE_BUNDLED_ZLIB=OFF \ |
| -DLWS_WITH_SSL=ON \ |
| -DLWS_WITH_HTTP2=ON \ |
| -DLWS_OPENSSL_LIBRARIES="$TOOLCHAIN_PATH/../lib/libssl.a;$TOOLCHAIN_PATH/../lib/libcrypto.a" \ |
| -DLWS_OPENSSL_INCLUDE_DIRS=$TOOLCHAIN_PATH/../include \ |
| -DCMAKE_BUILD_TYPE=Debug \ |
| .. |
| PATH=$TOOLCHAIN_PATH:$PATH make |
| PATH=$TOOLCHAIN_PATH:$PATH make install |
| cd ../.. |
| } |