diff --git a/checkin_notes b/checkin_notes index c657a4e28482485d4cffb803c4d1576457224d1a..bf2c18854bbe5e1cdc9d19b1ca6202542237a546 100644 --- a/checkin_notes +++ b/checkin_notes @@ -2715,3 +2715,18 @@ Rom 15 Mar 2012 samples/vboxwrapper/ vbox.cpp, .h vboxwrapper.cpp + +David 16 Mar 2012 + - client: small changes to make client compile on Android, + and to report the platform as "arm-android". + From Carl Christensen. + - Add a script for building BOINC and library dependencies on Android + From Peter Hanappe. + + lib/ + mac_address.cpp + client/ + android/ + AndroidBuild.sh (new) + cs_platforms.cpp + hostinfo_unix.cpp diff --git a/client/android/AndroidBuild.sh b/client/android/AndroidBuild.sh new file mode 100644 index 0000000000000000000000000000000000000000..a947e16c9d99f8f77e6b5497561370db1f44e056 --- /dev/null +++ b/client/android/AndroidBuild.sh @@ -0,0 +1,348 @@ +#!/bin/bash + +# Script to compile BOINC for Android. +# Requires the BOINC source directory and the Android NDK. +# +# Date: December 12th, 2011 +# Author: Peter Hanappe (Sony Computer Science Laboratory) + +BOINCDIR=`pwd` +NDK_SYSROOT="" +NDK_PATH="" +NDK_ARCH="arm" +NDK_ROOT="" +NDK_ABI="armeabi" +NDK_VERSION="android-8" +COMPILE_BOINC="yes" +COMPILE_ZLIB="yes" +COMPILE_OPENSSL="yes" +COMPILE_CURL="yes" +CONFIGURE="yes" +MAKE_CLEAN="no" + +function print_usage() +{ + echo "Options:" + echo " --help" + echo " --boinc-dir <dir> Root directory of BOINC source tree (default: current dir)." + echo " --android-root <dir> The root directory of the Android NDK." + echo " --android-sysroot <dir> The target sysroot directory of the Android NDK." + echo " --android-bin <dir> The bin directory of the Android NDK compilers." + echo " --android-arch <dir> Compile for 'arm' or 'x86' architecture (default: arm)." + echo " --android-version <val> Specify Android version (default: android-8)." + echo " --skip-boinc Don't compile BOINC." + echo " --skip-zlib Don't download and compile zlib." + echo " --skip-openssl Don't download and compile OpenSSL." + echo " --skip-curl Don't download and compile curl." + echo " --skip-configure Don't run configure script before compiling." + echo " --make-clean Run 'make clean' before compiling." + echo "Example: ./AndroidBuild.sh \\" + echo " --android-root /opt/google/android-ndk-r6 \\" + echo " --android-bin /opt/google/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin" + exit 0 +} + +while (($#)); do + option=$1 + shift + case "$option" in + --help) + print_usage + shift + ;; + --boinc-dir) + BOINCDIR=$1 + shift + ;; + --android-sysroot) + NDK_SYSROOT=$1 + shift + ;; + --android-root) + NDK_ROOT=$1 + shift + ;; + --android-bin) + NDK_PATH=$1 + shift + ;; + --android-arch) + NDK_ARCH=$1 + shift + ;; + --android-version) + NDK_VERSION=$1 + shift + ;; + --skip-boinc) + COMPILE_BOINC="no" + ;; + --skip-zlib) + COMPILE_ZLIB="no" + ;; + --skip-openssl) + COMPILE_OPENSSL="no" + ;; + --skip-curl) + COMPILE_CURL="no" + ;; + --skip-configure) + CONFIGURE="no" + ;; + --make-clean) + MAKE_CLEAN="yes" + ;; + *) + echo "Unknown option ${option}" + print_usage + ;; + esac +done + +################################################### +# Test options and paths + +if [ ! -e "${BOINCDIR}/client/gui_rpc_server.h" ]; then + echo "Please launch this script in the boinc root directory, or use the --boinc-dir <dir> option." + print_usage +fi + +if [ "x${NDK_ROOT}" == "x" ]; then + echo "Please specify the Android NDK root directory." + print_usage +fi + +if [ ${NDK_ARCH} == "arm" ]; then + NDK_HOST=arm-linux-androideabi +elif [ ${NDK_ARCH} == "x86" ]; then + NDK_HOST=i686-android-linux +else + echo "Please specify the Android architecture." + print_usage +fi + +NDK_CC=${NDK_HOST}-gcc + +if [ "x${NDK_SYSROOT}" == "x" ]; then + NDK_SYSROOT=${NDK_ROOT}/platforms/${NDK_VERSION}/arch-${NDK_ARCH} + if [ ! -d ${NDK_SYSROOT} ]; then + echo "Please specify the Android NDK sysroot." + echo "Tried, but failed: ${NDK_SYSROOT}" + print_usage + fi +fi + +if [ "x${NDK_PATH}" == "x" ]; then + echo "Please specify the Android binary directory." + print_usage +fi + +if [ ! -e "${NDK_SYSROOT}/usr/include/stdio.h" ]; then + echo "Could not find ${NDK_SYSROOT}/usr/include/stdio.h header. Please verify the sysroot." + print_usage +fi + +if [ ! -e "${NDK_PATH}/${NDK_CC}" ]; then + echo "Could not find the ${NDK_CC} compiler. Please verify the binary path." + print_usage +fi + +################################################### + +echo "================================================" +echo "BOINCDIR ${BOINCDIR}" +echo "NDK_ROOT ${NDK_ROOT}" +echo "NDK_SYSROOT ${NDK_SYSROOT}" +echo "NDK_PATH ${NDK_PATH}" +echo "NDK_ARCH ${NDK_ARCH}" +echo "NDK_HOST ${NDK_HOST}" +echo "NDK_ABI ${NDK_ABI}" +echo "NDK_VERSION ${NDK_VERSION}" +echo "NDK_CC ${NDK_CC}" +echo "COMPILE_ZLIB $COMPILE_ZLIB" +echo "COMPILE_OPENSSL $COMPILE_OPENSSL" +echo "COMPILE_CURL $COMPILE_CURL" +echo "CONFIGURE $CONFIGURE" +echo "MAKE_CLEAN $MAKE_CLEAN" +echo "================================================" + +################################################### + +function compile_zlib() +{ + echo "================================================" + echo "= Starting download and compilation of zlib =" + echo "================================================" + + cd ${BOINCDIR}/android + + if [ ! -e zlib-1.2.5 ]; then + wget http://zlib.net/zlib-1.2.5.tar.gz + tar xzvf zlib-1.2.5.tar.gz + fi + + cd zlib-1.2.5 + + if [ $CONFIGURE == "yes" ]; then + CC="${NDK_PATH}/${NDK_CC} --sysroot=${NDK_SYSROOT}" \ + ./configure --prefix=${BOINCDIR}/android/${NDK_ARCH} --static + fi + if [ $MAKE_CLEAN == "yes" ]; then + make clean + fi + make +# The 'make install' script fails + mkdir -p ${BOINCDIR}/android/${NDK_ARCH}/lib + mkdir -p ${BOINCDIR}/android/${NDK_ARCH}/include + cp libz.a ${BOINCDIR}/android/${NDK_ARCH}/lib + cp zlib.h ${BOINCDIR}/android/${NDK_ARCH}/lib + cp zconf.h ${BOINCDIR}/android/${NDK_ARCH}/lib +} + +################################################### + +function compile_openssl() +{ + echo "================================================" + echo "= Starting download and compilation of openssl =" + echo "================================================" + + cd ${BOINCDIR}/android + + if [ ! -e openssl-1.0.0e ]; then + wget http://www.openssl.org/source/openssl-1.0.0e.tar.gz + tar xzvf openssl-1.0.0e.tar.gz + fi + + cd openssl-1.0.0e + + if [ $CONFIGURE == "yes" ]; then + CC="${NDK_PATH}/${NDK_CC} --sysroot=${NDK_SYSROOT}" \ + ./config --prefix=${BOINCDIR}/android/${NDK_ARCH} no-shared no-asm + fi + + if [ $MAKE_CLEAN == "yes" ]; then + make clean + fi + + make + make install +} + +################################################### + +function compile_curl() +{ + echo "================================================" + echo "= Starting download and compilation of curl =" + echo "================================================" + + cd ${BOINCDIR}/android + + if [ ! -e curl-7.23.1 ]; then + wget http://curl.haxx.se/download/curl-7.23.1.tar.gz + tar xzvf curl-7.23.1.tar.gz + fi + + cd curl-7.23.1 + +# Export binary path. + export PATH=${PATH}:${NDK_PATH} + +# +# ./configure --with-sysroot=${NDK_SYSROOT} doesn't seem to work. Pass +# the correct path using the CFLAGS environment variable. +# +# The ANDROID flag is used in curl-7.23.1/include/curl/curl.h +# + if [ $CONFIGURE == "yes" ]; then + CFLAGS="--sysroot=${NDK_SYSROOT} -DANDROID" \ + ./configure --host=${NDK_HOST} \ + --with-sysroot=${NDK_SYSROOT} \ + --prefix=${BOINCDIR}/android/${NDK_ARCH} --enable-debug \ + --disable-shared --enable-static \ + --enable-http --disable-ftp --disable-ldap --disable-ldaps \ + --disable-rtsp --disable-proxy --disable-dict --disable-telnet \ + --disable-tftp --disable-pop3 --disable-imap --disable-smtp \ + --disable-gopher --disable-ipv6 --disable-sspi --disable-crypto-auth \ + --disable-tls-srp --disable-ntlm-wb --disable-cookies --disable-manual \ + --disable-threaded-resolver --without-ca-bundle + fi + + if [ $MAKE_CLEAN == "yes" ]; then + make clean + fi + + make + make install +} + +################################################### +# Problems: +# - problems in configure.ac with curl: --with-curl doesn't use the correct path +# - config.sub too old to recognize --host=arm-linux-androideabi, used newer config.sub (2011-03-23) +# - changed lib/network.cpp:298: !defined(__ANDROID__) +# - changed lib/synch.cpp: #if defined(__ANDROID__) \ #define create_semaphore(_key) (-1), ... +# - changed lib/mac_address.cpp:189: #elif (defined(SIOCGIFCONF) || defined(SIOCGLIFCONF)) && !defined(__ANDROID__) +function compile_boinc() +{ + cd ${BOINCDIR} + +# Export binary path. + export PATH=${PATH}:${NDK_PATH} + + if [ $CONFIGURE == "yes" ]; then + + bash _autosetup + + OPTIONS="--host=${NDK_HOST} \ + --disable-server \ + --enable-client \ + --disable-manager \ + --enable-libraries \ + --enable-debug \ + --with-ssl=${BOINCDIR}/android/arm/lib" + + echo "================================================" + echo "Configuring BOINC with: $OPTIONS" + echo "================================================" + + FLAGS="--sysroot=${NDK_SYSROOT} \ + -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/include \ + -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/libs/${NDK_ABI}/include" + + CFLAGS="${FLAGS}" \ + CXXFLAGS="${FLAGS}" \ + LDFLAGS="-L${BOINCDIR}/android/arm/lib -L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/libs/${NDK_ABI}" \ + LIBS="-lstdc++" \ + ./configure ${OPTIONS} + fi + + if [ $MAKE_CLEAN == "yes" ]; then + make clean + fi + + make +} + +################################################### + +if [ ! -e "${BOINCDIR}/android" ]; then + echo "================================================" + echo "= Creating the android direcory =" + echo "================================================" + mkdir ${BOINCDIR}/android +fi +if [ $COMPILE_ZLIB == "yes" ]; then + compile_zlib +fi +if [ $COMPILE_OPENSSL == "yes" ]; then + compile_openssl +fi +if [ $COMPILE_CURL == "yes" ]; then + compile_curl +fi +if [ $COMPILE_BOINC == "yes" ]; then + compile_boinc +fi + diff --git a/client/cs_platforms.cpp b/client/cs_platforms.cpp index fd92d5b52f4c9ab1211ff6411839859abee0750a..c4878a9e73d13c94c0f635104267dc7a340cc52e 100644 --- a/client/cs_platforms.cpp +++ b/client/cs_platforms.cpp @@ -96,6 +96,8 @@ void CLIENT_STATE::detect_platforms() { } add_platform("windows_intelx86"); #endif +#elif defined(ANDROID) + add_platform("arm-android"); #elif defined(__APPLE__) diff --git a/client/hostinfo_unix.cpp b/client/hostinfo_unix.cpp index 2e667b32ef4afb86996ab30e21fe48df3c3ee373..1b2cb914833f6006db5eb01beda972358854a4c2 100644 --- a/client/hostinfo_unix.cpp +++ b/client/hostinfo_unix.cpp @@ -62,9 +62,15 @@ #endif #include <sys/stat.h> + #if HAVE_SYS_SWAP_H +#ifdef ANDROID +#include <linux/swap.h> +#else #include <sys/swap.h> #endif +#endif + #if HAVE_SYS_SYSCTL_H #include <sys/sysctl.h> #endif diff --git a/lib/mac_address.cpp b/lib/mac_address.cpp index 9115061372041f6f0bbfeada4ed13eda723fe279..c2ca9b2c9879909615038f063c392e8ba0e20e77 100644 --- a/lib/mac_address.cpp +++ b/lib/mac_address.cpp @@ -267,7 +267,11 @@ get_mac_addresses(char* addresses) { strcat(addresses, delimiter); delimiter[0] = ':'; delimiter[1] = '\0'; +#ifdef ANDROID + strcat(addresses, "00"); +#else strcat(addresses, ether_ntoa(hw_addr)); +#endif } return true;