upm/scripts/build-android.sh
Noel Eck 20aa4962f0 SWIG: Moved common SWIG syntax to ${libname}.i
This commit moves common SWIG syntax to a ${libname}.i for sensor
libraries.  Much of the swig content was originally duplicated for
each wrapper language which has lead to inconsistencies between wrappers
over time.  This commit moves all swig syntax to a common file.  Language
specific swig syntax can be added with #ifdef SWIG<LANGUAGE>.

The src/CMakeLists.txt will look first for a language-specific .i file,
then fall back to ${libname}.i.  In this way, it's possible to override
the common ${libname}.i file.  If a fallback .i file does NOT exist,
UPM CMake will generate a simple interface file for all languages.

Example:
    If no src/abp/pyupm_abp.i and no src/abp/abp.i then
    generate ${CMAKE_CURRENT_BINARY_DIR}/abp.i

When src/CMakeLists.txt uses a common ${libname}.i, it adds a -module
<language>upm_${libname} to the swig command line.

In the example below, a -module argument is provided for both Java and
Javascript, while the python module takes all syntax from pyupm_abp.i.

    SWIG FILE              Language       CMake added SWIG args
    ---------------        ----------     ---------------------
    src/abp/abp.i          java           -module javaupm_abp
    src/abp/abp.i          javascript     -module jsupm_abp
    src/abp/pyupm_abp.i    python

This commit removes ~4500 redundant lines for the UPM repository and
helps promote uniformity for the SWIG'ed languages.

Signed-off-by: Noel Eck <noel.eck@intel.com>
2018-02-21 10:51:44 -08:00

162 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# The script is used to build .aar packages for Upm modules.
#
# Author: Nicolas Oliver <dario.n.oliver@intel.com>
#
# All environment variables used are passed from docker-compose.
# Those environment variables can also be declared in the host,
# and this script can be used to build .aar packages without using
# docker-compose.
#
# Environment variables:
# - NDK_HOME - Path to Android NDK install folder. i.e. /opt/android-ndk-r14b/
# - MRAA_INSTALL_DIR - Path to Mraa library install folder. i.e /opt/mraa/install/
# - JAVA_HOME - Path to Java install folder. i.e. /usr/lib/jvm/java-8-openjdk-amd64/
#
# IMPORTANT: MRAA_INSTALL_DIR must contain an mraa version built for Android Things.
set -e
# Check required environment variables and exit if they are not set
function check_environment {
VAR_NAME=$1
VAR_VALUE=$2
# Check required parameters
VAR_NAME=${VAR_NAME:?value not provided}
# Chek if variable is set
if [ -z "${VAR_VALUE}" ]; then
echo "Required environment variable ${VAR_NAME} is not defined. Exiting..."
exit 1;
else
echo "Required environment variable ${VAR_NAME} is set."
fi
}
# Check for required environment variables
check_environment "NDK_HOME" ${NDK_HOME}
check_environment "MRAA_INSTALL_DIR" ${MRAA_INSTALL_DIR}
check_environment "JAVA_HOME" ${JAVA_HOME}
PKG_CONFIG_LIBDIR="$NDK_HOME/platforms/android-24/arch-x86/usr/lib"
PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR":$MRAA_INSTALL_DIR/lib/pkgconfig/"
export PKG_CONFIG_LIBDIR
cmake \
-DANDROID_COMPILER_FLAGS_CXX='-std=c++11' \
-DANDROID_PIE=1 \
-DANDROID_PLATFORM=android-24 \
-DANDROID_STL_FORCE_FEATURES=ON \
-DANDROID_STL=c++_shared \
-DANDROID_TOOLCHAIN_NAME=x86-i686 \
-DCMAKE_TOOLCHAIN_FILE=$NDK_HOME/build/cmake/android.toolchain.cmake \
-DCMAKE_FIND_ROOT_PATH=$MRAA_INSTALL_DIR \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DJAVA_AWT_INCLUDE_PATH=$JAVA_HOME/include \
-DJAVA_AWT_LIBRARY=$JAVA_HOME/jre/lib/amd64/libjawt.so \
-DJAVA_INCLUDE_PATH=$JAVA_HOME/include \
-DJAVA_INCLUDE_PATH2=$JAVA_HOME/include/linux \
-DJAVA_JVM_LIBRARY=$JAVA_HOME/jre/lib/amd64/server/libjvm.so \
-DBUILDSWIGJAVA=$BUILDSWIGJAVA \
-DBUILDSWIGNODE=$BUILDSWIGNODE \
-DBUILDSWIGPYTHON=$BUILDSWIGPYTHON \
-DWERROR=$WERROR \
-H. \
-Bbuild
make -j8 -Cbuild
# Anotate the .java src from doxygen
find src/ -name "*.i" > build/upm.i.list
#../doxy/doxyport build/upm.i.list \
# -s src/interfaces/,src/bacnetmstp,src/bmg160,src/bma250e,src/bmm150 \
# -m doxy/samples.mapping.txt \
# -d build/src/ \
# --convert-protected-to-private \
# -o build/upm-java-files.txt \
# -c build/compile_commands.json
gen_and_upload() {
# Skip any directories without .java src files
if [ ! -f *.java ]; then
return
fi
# Get the MRAA version string from the .pom file
VERSION=$(ls *.pom | perl -nle 'print $2 if /^(.*)-(\d+\.\d+\.\d+)\.pom/')
# Get the MRAA name string from the .pom file
LIB_NAME=$(ls *.pom | perl -nle 'print $1 if /^(.*)-(\d+\.\d+\.\d+)\.pom/')
# Bundle upload directory
PKG_BUNDLE_DIR=BUNDLE_DIR
mkdir -p ${PKG_BUNDLE_DIR}
# Create the aar directory structure
AAR_DIRECTORY="$LIB_NAME-$VERSION"
mkdir -p $AAR_DIRECTORY/jni/x86
mkdir -p $AAR_DIRECTORY/res/values
# Write out res/values/values.xml to the aar
echo "${values_xml/XXX_LIBRARY/$LIB_NAME}" > $AAR_DIRECTORY/res/values/values.xml
# Write out AndroidManifest.xml to the aar
_tmp_manifest=${AndroidManifest_xml/XXX_PACKAGE/$JAVA_PKG_PREFIX_DOT}
_tmp_manifest=${_tmp_manifest/XXX_LIBRARY/$LIB_NAME}
echo "${_tmp_manifest/XXX_VERSION/$VERSION}" > $AAR_DIRECTORY/AndroidManifest.xml
# Copy over the so's
cp *.so $AAR_DIRECTORY/jni/x86
# Create javadoc jar
javadoc *.java -d $LIB_NAME-javadoc
jar cf $PKG_BUNDLE_DIR/$LIB_NAME-$VERSION-javadoc.jar $LIB_NAME-javadoc/*
# Create sources jar file for upload
jar cf $PKG_BUNDLE_DIR/$LIB_NAME-$VERSION-sources.jar *.java
# Copy pom file
cp $LIB_NAME-$VERSION.pom $PKG_BUNDLE_DIR
# Copy the java module jar to classes.jar
cp $LIB_NAME.jar $AAR_DIRECTORY/classes.jar
# Create the .aar
pushd $AAR_DIRECTORY
jar cf ../$PKG_BUNDLE_DIR/$LIB_NAME-$VERSION.aar *
popd
# Create the bundle file
pushd $PKG_BUNDLE_DIR
# Create the tar bundle
jar cvf ../$LIB_NAME-$VERSION-bundle.jar *
popd
}
# Template for res/values/values.xml in aar
values_xml='<?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">XXX_LIBRARY</string></resources>'
# Template for AndroidManifest.xml in aar
AndroidManifest_xml='<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XXX_PACKAGE.XXX_LIBRARY"
android:versionCode="1"
android:versionName="XXX_VERSION" >
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="25"/>
<application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true" />
</manifest>'
# Package prefix
JAVA_PKG_PREFIX_DOT="io.mraa.at.upm"
# Work in the UPM build directory
cd build/src
# For each directory in build/src which contains a .pom file...
for lib_dir in `ls -d */`; do
if ls $lib_dir/upm_*.pom 1> /dev/null 2>&1; then
pushd $lib_dir
# Allow for spawning multiple if necessary (&)
gen_and_upload
popd
fi
done