From 40c79223866b1c51383a43231b27d1539fc56f74 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 26 Sep 2022 17:04:42 +0900 Subject: [PATCH] Update android build documentation --- Makefile.am | 2 +- android-config | 13 +-- android-make => android-env | 19 ++-- doc/sources/building-android-binary.rst | 116 +++++++++--------------- 4 files changed, 60 insertions(+), 90 deletions(-) rename android-make => android-env (70%) diff --git a/Makefile.am b/Makefile.am index 88c0e228..5b0df446 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,7 +32,7 @@ ACLOCAL_AMFLAGS = -I m4 dist_doc_DATA = README.rst -EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \ +EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \ Dockerfile.android \ cmakeconfig.h.in \ CMakeLists.txt \ diff --git a/android-config b/android-config index cc369a67..e66074c8 100755 --- a/android-config +++ b/android-config @@ -23,25 +23,16 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -if [ -z "$ANDROID_HOME" ]; then - echo 'No $ANDROID_HOME specified.' - exit 1 -fi -PREFIX="$ANDROID_HOME"/usr/local -TOOLCHAIN="$ANDROID_HOME"/toolchain -PATH="$TOOLCHAIN"/bin:"$PATH" +. ./android-env ./configure \ --disable-shared \ - --host=arm-linux-androideabi \ + --host=$TARGET \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ - --with-xml-prefix="$PREFIX" \ --without-libxml2 \ --disable-python-bindings \ --disable-examples \ --disable-threads \ - CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \ - CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-clang++ \ CPPFLAGS="-fPIE -I$PREFIX/include" \ PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \ LDFLAGS="-fPIE -pie -L$PREFIX/lib" diff --git a/android-make b/android-env similarity index 70% rename from android-make rename to android-env index 375045a6..4412fcf9 100755 --- a/android-make +++ b/android-env @@ -2,7 +2,7 @@ # # nghttp2 - HTTP/2 C Library # -# Copyright (c) 2013 Tatsuhiro Tsujikawa +# Copyright (c) 2022 nghttp2 contributors # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -23,11 +23,18 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -if [ -z "$ANDROID_HOME" ]; then - echo 'No $ANDROID_HOME specified.' +if [ -z "$NDK" ]; then + echo 'No $NDK specified.' exit 1 fi -TOOLCHAIN=$ANDROID_HOME/toolchain -PATH=$TOOLCHAIN/bin:$PATH -make "$@" +export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64 +export TARGET=aarch64-linux-android +export API=33 +export AR=$TOOLCHAIN/bin/llvm-ar +export CC=$TOOLCHAIN/bin/$TARGET$API-clang +export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++ +export LD=$TOOLCHAIN/bin/ld +export RANDLIB=$TOOLCHAIN/bin/llvm-ranlib +export STRIP=$TOOLCHAIN/bin/llvm-strip +export PREFIX=$NDK/usr/local diff --git a/doc/sources/building-android-binary.rst b/doc/sources/building-android-binary.rst index 87b16c7b..339ac44f 100644 --- a/doc/sources/building-android-binary.rst +++ b/doc/sources/building-android-binary.rst @@ -2,49 +2,39 @@ Building Android binary ======================= In this article, we briefly describe how to build Android binary using -`Android NDK `_ -cross-compiler on Debian Linux. +`Android NDK `_ cross-compiler on +Debian Linux. The easiest way to build android binary is use Dockerfile.android. See Dockerfile.android for more details. If you cannot use Dockerfile.android for whatever reason, continue to read the rest of this article. -We offer ``android-config`` and ``android-make`` scripts to make the -build easier. To make these script work, NDK toolchain must be -installed in the following way. First, let us introduce -``ANDROID_HOME`` environment variable. We need to install toolchain -under ``$ANDROID_HOME/toolchain``. An user can freely choose the path -for ``ANDROID_HOME``. For example, to install toolchain under -``$ANDROID_HOME/toolchain``, do this in the the directory where NDK is -unpacked: +We offer ``android-config`` script to make the build easier. To make +the script work, NDK directory must be set to ``NDK`` environment +variable. NDK directory is the directory where NDK is unpacked: .. code-block:: text - $ build/tools/make_standalone_toolchain.py \ - --arch arm --api 16 --stl gnustl \ - --install-dir $ANDROID_HOME/toolchain - -The API level (``--api``) is not important here because we don't use -Android specific C/C++ API. + $ unzip android-ndk-$NDK_VERSION-linux.zip + $ cd android-ndk-$NDK_VERSION + $ export NDK=$PWD The dependent libraries, such as OpenSSL, libev, and c-ares should be -built with the toolchain and installed under -``$ANDROID_HOME/usr/local``. We recommend to build these libraries as -static library to make the deployment easier. libxml2 support is -currently disabled. +built with the same NDK toolchain and installed under +``$NDK/usr/local``. We recommend to build these libraries as static +library to make the deployment easier. libxml2 support is currently +disabled. Although zlib comes with Android NDK, it seems not to be a part of public API, so we have to built it for our own. That also provides us proper .pc file as a bonus. -Before running ``android-config`` and ``android-make``, -``ANDROID_HOME`` environment variable must be set to point to the -correct path. Also add ``$ANDROID_HOME/toolchain/bin`` to ``PATH``: +Before running ``android-config``, ``NDK`` environment variable must +be set to point to the correct path. -.. code-block:: text - - $ export PATH=$PATH:$ANDROID_HOME/toolchain/bin +You need to set ``NGHTTP2`` environment variable to the absolute path +to the source directory of nghttp2. To configure OpenSSL, use the following script: @@ -52,39 +42,36 @@ To configure OpenSSL, use the following script: #!/bin/sh - if [ -z "$ANDROID_HOME" ]; then - echo 'No $ANDROID_HOME specified.' - exit 1 - fi - PREFIX=$ANDROID_HOME/usr/local - TOOLCHAIN=$ANDROID_HOME/toolchain - PATH=$TOOLCHAIN/bin:$PATH + . $NGHTTP2/android-env - export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- - ./Configure --prefix=$PREFIX android + export ANDROID_NDK_HOME=$NDK + export PATH=$TOOLCHAIN/bin:$PATH -And run ``make install_sw`` to build and install without -documentation. + ./Configure no-shared --prefix=$PREFIX android-arm64 -We cannot compile libev without modification. Apply `this patch -`_ before -configuring libev. This patch is for libev-4.19. After applying the -patch, to configure libev, use the following script: +And run the following script to build and install without +documentation: .. code-block:: sh #!/bin/sh - if [ -z "$ANDROID_HOME" ]; then - echo 'No $ANDROID_HOME specified.' - exit 1 - fi - PREFIX=$ANDROID_HOME/usr/local - TOOLCHAIN=$ANDROID_HOME/toolchain - PATH=$TOOLCHAIN/bin:$PATH + . $NGHTTP2/android-env + + export PATH=$TOOLCHAIN/bin:$PATH + + make install_sw + +To configure libev, use the following script: + +.. code-block:: sh + + #!/bin/sh + + . $NGHTTP2/android-env ./configure \ - --host=arm-linux-androideabi \ + --host=$TARGET \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --prefix=$PREFIX \ --disable-shared \ @@ -100,41 +87,26 @@ To configure c-ares, use the following script: #!/bin/sh -e - if [ -z "$ANDROID_HOME" ]; then - echo 'No $ANDROID_HOME specified.' - exit 1 - fi - PREFIX=$ANDROID_HOME/usr/local - TOOLCHAIN=$ANDROID_HOME/toolchain - PATH=$TOOLCHAIN/bin:$PATH + . $NGHTTP2/android-env ./configure \ - --host=arm-linux-androideabi \ + --host=$TARGET \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --prefix=$PREFIX \ --disable-shared +And run ``make install`` to build and install. + To configure zlib, use the following script: .. code-block:: sh #!/bin/sh -e - if [ -z "$ANDROID_HOME" ]; then - echo 'No $ANDROID_HOME specified.' - exit 1 - fi - PREFIX=$ANDROID_HOME/usr/local - TOOLCHAIN=$ANDROID_HOME/toolchain - PATH=$TOOLCHAIN/bin:$PATH + . $NGHTTP2/android-env - HOST=arm-linux-androideabi + export HOST=$TARGET - CC=$HOST-gcc \ - AR=$HOST-ar \ - LD=$HOST-ld \ - RANLIB=$HOST-ranlib \ - STRIP=$HOST-strip \ ./configure \ --prefix=$PREFIX \ --libdir=$PREFIX/lib \ @@ -144,7 +116,7 @@ To configure zlib, use the following script: And run ``make install`` to build and install. After prerequisite libraries are prepared, run ``android-config`` and -then ``android-make`` to compile nghttp2 source files. +then ``make`` to compile nghttp2 source files. If all went well, application binaries, such as nghttpx, are created under src directory. Strip debugging information from the binary @@ -152,4 +124,4 @@ using the following command: .. code-block:: text - $ arm-linux-androideabi-strip src/nghttpx + $ $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip src/nghttpx