Dear Wiki user, You have subscribed to a wiki page or wiki category on "Couchdb Wiki" for change notification.
The "Installing_on_Android" page has been changed by MattAdams. http://wiki.apache.org/couchdb/Installing_on_Android?action=diff&rev1=14&rev2=15 -------------------------------------------------- + = Installing CouchDB on Android (from source) = + + == Caveats == + * Please note that the following instructions for Android produce a build that mostly works but is not entirely bug free. Any help tracking down and resolving problems with couchjs would be greatly appreciated. From what I can tell these probably stem from ABI incompatibility with the version of Spidermonkey that is used. - * As alluded to below, I was unable to get Couch to agree to link with the static Spidermonkey library. It would be preferable to have this done because it would remove the need for a separate file ({{{libmozjs.so}}}) and thus one less thing to go wrong. - ---- + * As alluded to below, I was unable to get Couch to agree to link with the static Spidermonkey library. This is due to the fact that C++ support in more recent official releases of the Google SDK/NDK is lacking. It would be preferable to link statically because it would remove the need for a separate file ({{{libmozjs.so}}}) and thus one less thing to go wrong (there are workarounds for the fact that we need to worry about dynamic linking with regards to the default couch query server, {{{couchjs}}}). + == Credits == + + A lot of the credit should go to [[https://github.com/apage43|Aaron Miller]] for doing the original port upon which these instructions are based. I would also like to thank Wes and Chris C. Coulson from #jsapi and Dale Harvey, davisp and rnewson from #couchdb. Thanks to everyone else who helped, too. + + == Overview & Instructions == + - The following build instructions are intended for Android 2.2.2 and were run on Debian Squeeze. The "scripts" below were run with Bash from a single directory I called {{{android-build}}}. + The following build instructions are intended for Android 2.2.2 and were run on Debian Squeeze. The "scripts" below were run with Bash from a single directory that I called {{{android-build}}}. I used Java 1.5.0.22 to [[http://source.android.com/source/download.html|build Android from source]]. You will also [[http://developer.android.com/sdk/index.html|need an SDK]] (I used r08). - A lot of the credit should go to [[https://github.com/apage43|Aaron Miller]] for doing the original port upon which these instructions are based as well as the good folks in #couchdb and #jsapi for their assistance, explanations and testing along the way. - See [[https://github.com/couchone/couch-android-launcher|couch-android-launcher]] and [[https://github.com/couchone/libcouch-android|libcouch-android]] for the end-user Android application that will use the package produced by this build. Please note that {{{com.your.namespace}}} used throughout these instructions will need to be replaced with something appropriate. Supporting these builds are a number of helper scripts and patches: AndroidEnv, AndroidAgcc, AndroidCouchPatch, AndroidOtpPatch, AndroidReleasePatch, AndroidSdCardPatch - = Step 1: Build Android from Source = + === Step 1: Build Android from Source === {{{ cd ~/software/android/sdk/sources @@ -33, +40 @@ make -s }}} - = Step 2: Build cURL = + === Step 2: Build cURL === {{{ VERSION=7.20.0 @@ -76, +83 @@ make -s }}} - = Step 3: Build Mozilla NSPR & Spidermonkey = + === Step 3: Build Mozilla NSPR & Spidermonkey === The following instructions are based on the Fennec instructions [[https://wiki.mozilla.org/Mobile/Fennec/Android#JS.2FNSPR_only|for building JS/NSPR only]]. I also used [[http://ftp.mozilla.org/pub/mozilla.org/mobile/source/android-ndk-r4c-0moz3.tar.bz2|their Android NDK package]] for the builds. - You can probably skip NSPR; I am not sure that it is really needed. + ==== Retrieve mozilla-current === - == NSPR == - {{{ - HGREV=21e90d198613 + HGREV=bb9089ae2322 [[ -f mozilla-central-$HGREV.tar.bz2 ]] || wget http://hg.mozilla.org/mozilla-central/archive/$HGREV.tar.bz2 - + rm -rf mozilla-central mozilla-central-$HGREV tar -jxf mozilla-central-$HGREV.tar.bz2 ln -s mozilla-central-$HGREV mozilla-central + cd mozilla-central + + # Use of __android_log_print and __android_log_write requires liblog.so from our + # toolchain. However, llog also has a dependency on libstdc++.so which our toolchain + # DOES NOT have so we need to substitute for something less Androidy (apologies). + patch -p1 < ../mozilla-central.patch + }}} + + ==== NSPR ==== + + NSPR isn't technically required but it is heavily integrated into current versions of Spidermonkey and future versions will almost certainly require it. + + Also, NSPR will compile against current NDKs but I choose to use the recommended one for the sake of consistency. The next step (Spidermonkey) most certainly requires the specified NDK version. + + {{{ source $HOME/software/android/scripts/env ANDROID_NDK=$HOME/software/android/android-ndk-r4c - ANDROID_SDK=$HOME/software/android/sdk cd mozilla-central/nsprpub - make clean - autoconf2.13 ./configure \ --target=arm-android-eabi \ @@ -112, +129 @@ rm dist/lib/*so }}} - == Spidermonkey == + ==== Spidermonkey ==== Be aware that Spidermonkey '''[[https://bugzilla.mozilla.org/show_bug.cgi?id=617115|will not]]''' build against Android NDK r5. @@ -126, +143 @@ ./configure \ --target=arm-android-eabi \ --with-android-ndk=$ANDROID_NDK \ - --with-android-platform=$ANDROID_NDK/build/platforms/android-8/arch-arm \ + --with-android-sdk=$ANDROID_NDK/build/platforms/android-8 \ - --with-nspr-cflags=-I$(pwd)/../../nsprpub/dist/include/nspr \ - --with-nspr-libs="-L$(pwd)/../../nsprpub/dist/lib -lnspr4 -lplc4 -lplds4" \ + --with-android-version=8 \ + --disable-tests \ --disable-shared \ --enable-debug \ --disable-optimizations \ --enable-static \ + --enable-endian=little \ + --with-arm-kuser \ --enable-threadsafe \ - --enable-endian=little \ - --with-arm-kuser + --with-nspr-cflags=-I$(pwd)/../../nsprpub/dist/include/nspr \ + --with-nspr-libs="-L$(pwd)/../../nsprpub/dist/lib -lnspr4 -lplc4 -lplds4" make -s + ## # Remove the shared lib to force Couch to link statically - # (Could not get this to work -- even with patches to Couch autoconf files) + # (this isn't working due to Android toolchain difficulties) + # #rm libmozjs.so - - # Rename lib - mv libjs_static.a libmozjs.a + #mv libjs_static.a libmozjs.a }}} You should remove {{{--enable-debug}}} and {{{--disable-optimizations}}} for production builds. - = Step 4: Build Erlang/OTP = + === Step 4: Build Erlang/OTP === {{{ rm -rf otp @@ -158, +177 @@ cd otp git checkout origin/android - ## + ## - # Patches: - # # 1) Add back in support for the "beam" binary - # # 2) Our default autoconf is 2.67 and we need to switch back to 2.59 - # for this operation + # for this operation + # 3) Environment differences between Android and UNIX (bin/sh) # patch -p1 < ../otp.patch @@ -178, +195 @@ ./otp_build release -a $(pwd)/../otp_rel }}} - = Step 5: Compile Couch = + === Step 5: Compile Couch === {{{ rm -rf couchdb @@ -186, +203 @@ cd couchdb git checkout 1.0.1 + ## - # Android Build Support from https://github.com/apage43/couchdb/tree/0.11.x-android + # 1) Android Build Support from https://github.com/apage43/couchdb/tree/0.11.x-android + # 2) Mozilla JS compatibility by chrisccoulson from [email protected] + # 3) Fixes for Android by [email protected] + # patch -p1 < ../couchdb.patch ./bootstrap @@ -196, +217 @@ ERL=$(pwd)/../otp/bootstrap/bin/erl \ ERLC=$(pwd)/../otp/bootstrap/bin/erlc \ - LDFLAGS="-L$(pwd)/../mozilla-central/nsprpub/dist/lib -lnspr4 -lplc4 -lplds4 -L$(pwd)/../mozilla-central/js/src -lmozjs" \ CC=agcc \ ./configure \ --host=arm-eabi \ - --prefix=/sdcard/couch \ + --prefix=/sdcard/groupinform/couch \ --with-android=$ANDROID_SDK/sources \ --with-android-curl=$(pwd)/../curl-7.20.0 \ --with-erlang=$(pwd)/../otp_rel/usr/include \ --with-js-include=$(pwd)/../mozilla-central/js/src/dist/include \ - --with-js-lib=$(pwd)/../mozilla-central/js/src + --with-js-lib="$(pwd)/../mozilla-central/js/src" - make + make -s make install }}} - = Step 6: Package for use on Android = + === Step 6: Package for use on Android === A lot of the code below was written simply to package things in a manner similar to Aaron's original layout of [[http://couchdb-android.s3.amazonaws.com/couch-erl-1.0.tgz|couch-erl-1.0.tgz]]. There is no need for a separate {{{dns-fix.tgz}}} or {{{fixup-1.0.tgz}}} with this package. {{{ + (to be updated) - if [ -z "$1" ]; then - echo "Give me a release number bub!" - exit 1 - fi - - DATE=$(date +"%Y-%m-%d_%H-%M-%S") - RELEASE="release-$DATE" - - mkdir -p $RELEASE/data/data/com.your.namespace/bin - - ## - # Configure and package Erlang/OTP - # - - cp -Rdp otp_rel otp_rel.package - - cd otp_rel.package - - ./Install -cross -sasl /data/data/com.your.namespace/erlang - rm Install - - rm -rf erts-5.7.5/include/* misc releases usr - - cd lib - - libs_to_keep="crypto-1.6.4 erts-5.7.5 inets-5.3 kernel-2.13.5 sasl-2.1.9 ssl-3.10.8 stdlib-1.16.5 xmerl-1.2.4" - - mkdir backuplib - - for i in $libs_to_keep - do - mv $i backuplib/ - done - - mv backuplib ../ - rm -rf * - - mv ../backuplib/* . - rmdir ../backuplib - - # Remove vestigal files - rm -rf crypto-1.6.4/src/*.erl - rm -rf erts-5.7.5/src/*.erl - rm -rf inets-5.3/examples/* inets-5.3/src/*.erl - rm -rf kernel-2.13.5/examples/* kernel-2.13.5/include/* kernel-2.13.5/src/*.erl - rm -rf sasl-2.1.9/src/*.erl - rm -rf ssl-3.10.8/examples/certs ssl-3.10.8/examples/ebin ssl-3.10.8/examples/src ssl-3.10.8/include/* ssl-3.10.8/pkix/*.erl ssl-3.10.8/src/*.erl - rm -rf stdlib-1.16.5/examples/* stdlib-1.16.5/include/* stdlib-1.16.5/src/*.erl - rm -rf xmerl-1.2.4/include xmerl-1.2.4/src - - cd .. - - # Update path to Android sh -- replace with a nice patch at some point - for i in bin/erl bin/start bin/start_erl erts-5.7.5/bin/erl erts-5.7.5/bin/erl.src erts-5.7.5/bin/start erts-5.7.5/bin/start_erl.src erts-5.7.5/bin/start.src lib/inets-5.3/priv/bin/runcgi.sh - do - sed -e "s;#!/bin/sh;#!/system/bin/sh;" $i > $i.new - mv $i.new $i - chmod 755 $i - done - - chmod -x erts-5.7.5/bin/start_erl.src erts-5.7.5/bin/start.src - - cd .. - - ## - # Configure and package CouchDB - # - - cp -Rdp /sdcard sdcard.package - - mv sdcard.package/couch/lib/couchdb/erlang/lib/couch-1.0.1 otp_rel.package/lib - mv sdcard.package/couch/lib/couchdb/bin/couchjs $RELEASE/data/data/com.your.namespace/bin - cp mozilla-central/js/src/libmozjs.so $RELEASE/data/data/com.your.namespace/bin - - cd sdcard.package/couch - - # Reflect updated locations and the Android environment - patch -p1 < ../../../sdcard.patch - - cd ../../.. - - ## - # Finally move things into place - # - - mv otp_rel.package $RELEASE/data/data/com.your.namespace/erlang - mv sdcard.package $RELEASE/sdcard - - cd $RELEASE - - # DNS fixes from apage43's couchdb-android.s3.amazonaws.com/dns-fix.tgz - touch data/data/com.your.namspace/erlang/bin/erl_inetrc - patch -p1 < ../release.patch - - # Build ICU for whatever version of Android was compiled in ~/software/android/sdk/sources - source $HOME/software/android/scripts/env - - agcc \ - -shared \ - -o data/data/com.your.namespace/couch_icu_driver.so ../couchdb/src/couchdb/priv/.libs/libcouch_icu_driver.a \ - -licuuc \ - -licudata \ - -licui18n \ - -L$HOME/projects/couch/android-build/otp_rel/erts-5.7.5/bin \ - -lbeam - - ## - # Archive the release - # - tar -czf ../release-$1.tgz * - - cd .. }}}
